43#include "PanzerDiscFE_config.hpp"
55#include "Epetra_CrsMatrix.h"
56#include "Epetra_MpiComm.h"
57#include "Epetra_LocalMap.h"
59#include "Teuchos_ScalarTraits.hpp"
60#include "Teuchos_DefaultMpiComm.hpp"
61#include "Teuchos_TimeMonitor.hpp"
63#include "Thyra_EpetraOperatorWrapper.hpp"
64#include "Thyra_EpetraThyraWrappers.hpp"
65#include "Thyra_VectorStdOps.hpp"
66#include "Thyra_ProductVectorBase.hpp"
67#include "Thyra_SpmdVectorBase.hpp"
68#include "Thyra_DefaultProductVector.hpp"
69#include "Thyra_ProductVectorSpaceBase.hpp"
76class EpetraLOF_EOpFactory :
public Teuchos::AbstractFactory<Epetra_Operator> {
77 Teuchos::RCP<Epetra_CrsGraph> W_graph_;
79 EpetraLOF_EOpFactory(
const panzer::BlockedEpetraLinearObjFactory<panzer::Traits,int> & lof)
80 : W_graph_(lof.getGraph(0,0)) {}
82 virtual Teuchos::RCP<Epetra_Operator> create()
const
83 {
return Teuchos::rcp(
new Epetra_CrsMatrix(::Copy,*W_graph_)); }
93 const std::vector<Teuchos::RCP<Teuchos::Array<std::string> > >& p_names,
94 const std::vector<Teuchos::RCP<Teuchos::Array<double> > >& p_values,
95 const Teuchos::RCP<panzer::GlobalData>& global_data,
96 bool build_transient_support)
108 using Teuchos::rcp_dynamic_cast;
111 ae_tm_.buildObjects(builder);
118 Teuchos::RCP<panzer::BlockedEpetraLinearObjFactory<panzer::Traits,int> > ep_lof =
119 Teuchos::rcp_dynamic_cast<panzer::BlockedEpetraLinearObjFactory<panzer::Traits,int> >(lof);
122 if(ep_lof!=Teuchos::null)
125 TEUCHOS_ASSERT(
false);
133 const std::vector<Teuchos::RCP<Teuchos::Array<std::string> > >& p_names,
134 const std::vector<Teuchos::RCP<Teuchos::Array<double> > >& p_values,
135 const Teuchos::RCP<panzer::GlobalData>& global_data,
136 bool build_transient_support)
148 using Teuchos::rcp_dynamic_cast;
151 ae_tm_.buildObjects(builder);
164 using Teuchos::rcp_dynamic_cast;
166 TEUCHOS_TEST_FOR_EXCEPTION(
responseLibrary_==Teuchos::null,std::logic_error,
167 "panzer::ModelEvaluator_Epetra::initializeEpetraObjs: The response library "
168 "was not correctly initialized before calling initializeEpetraObjs.");
178 p_map_.push_back(local_map);
180 RCP<Epetra_Vector> ep_vec = rcp(
new Epetra_Vector(*local_map));
181 ep_vec->PutScalar(0.0);
195 const std::vector<Teuchos::RCP<Teuchos::Array<double> > >& p_values,
196 const Teuchos::RCP<panzer::ParamLib>& parameter_library)
200 for (std::vector<Teuchos::RCP<Teuchos::Array<std::string> > >
::size_type p = 0;
201 p < p_names.size(); ++p) {
204 for(
int i=0;i<p_names[p]->size();i++)
209 for(
int i=0;i<p_names[p]->size();i++) {
220 const Teuchos::RCP<Epetra_Map>& global_map,
221 const Teuchos::RCP<Epetra_Import>& importer,
222 const Teuchos::RCP<Epetra_Vector>& ghosted_vector)
225 int index =
static_cast<int>(
p_map_.size());
227 p_map_.push_back(global_map);
228 Teuchos::RCP<Epetra_Vector> ep_vec = Teuchos::rcp(
new Epetra_Vector(*global_map));
229 ep_vec->PutScalar(0.0);
232 Teuchos::RCP<Teuchos::Array<std::string> > tmp_names =
233 Teuchos::rcp(
new Teuchos::Array<std::string>);
234 tmp_names->push_back(name);
251Teuchos::RCP<const Epetra_Map>
257Teuchos::RCP<const Epetra_Map>
263Teuchos::RCP<const Epetra_Vector>
269Teuchos::RCP<const Epetra_Vector>
281Teuchos::RCP<Epetra_Operator>
287Teuchos::RCP<const Epetra_Map>
293Teuchos::RCP<const Teuchos::Array<std::string> >
299Teuchos::RCP<const Epetra_Vector>
305Teuchos::RCP<const Epetra_Map>
345 for(std::size_t i=0;i<
p_init_.size();i++) {
351 for(std::size_t i=0;i<
g_names_.size();i++) {
356 if(respJacBase!=Teuchos::null) {
358 Teuchos::RCP<panzer::ResponseMESupportBase<RespEvalT> > resp = Teuchos::rcp_dynamic_cast<panzer::ResponseMESupportBase<RespEvalT> >(respJacBase);
361 if(resp->supportsDerivative())
375 using Teuchos::ArrayRCP;
376 using Teuchos::Array;
378 using Teuchos::rcp_dynamic_cast;
390 ae_inargs.
alpha = 0.0;
391 ae_inargs.
beta = 1.0;
398 const RCP<panzer::ThyraObjContainer<double> > thGlobalContainer =
399 Teuchos::rcp_dynamic_cast<panzer::ThyraObjContainer<double> >(ae_inargs.
container_,
true);
401 TEUCHOS_ASSERT(!Teuchos::is_null(thGlobalContainer));
406 const RCP<panzer::ThyraObjContainer<double> > thGhostedContainer =
407 Teuchos::rcp_dynamic_cast<panzer::ThyraObjContainer<double> >(ae_inargs.
ghostedContainer_,
true);
408 TEUCHOS_ASSERT(!Teuchos::is_null(thGhostedContainer));
409 Thyra::assign(thGhostedContainer->get_f_th().ptr(),0.0);
418 thGlobalContainer->set_x_th(x);
424 RCP<panzer::LinearObjContainer> result =
lof_->buildLinearObjContainer();
427 Teuchos::rcp_dynamic_cast<panzer::ThyraObjContainer<double> >(counter)->set_f_th(thGlobalContainer->get_f_th());
430 Teuchos::rcp_dynamic_cast<panzer::ThyraObjContainer<double> >(result)->set_f_th(f);
433 lof_->applyDirichletBCs(*counter,*result);
440 using Teuchos::rcp_dynamic_cast;
449 using Teuchos::rcp_dynamic_cast;
454 bool has_x_dot =
false;
460 "ModelEvaluator was not built with transient support enabled!");
465 const RCP<Epetra_Vector> f_out = outArgs.
get_f();
466 const RCP<Epetra_Operator> W_out = outArgs.
get_W();
471 if(Teuchos::is_null(f_out) && Teuchos::is_null(W_out) &&
472 !requiredResponses && !requiredSensitivities) {
491 const RCP<const Epetra_Vector> x = inArgs.
get_x();
492 RCP<const Epetra_Vector> x_dot;
497 ae_inargs.
alpha = 0.0;
498 ae_inargs.
beta = 1.0;
521 for (
int i=0; i<inArgs.
Np(); i++) {
522 Teuchos::RCP<const Epetra_Vector> p = inArgs.
get_p(i);
530 for (Teuchos::Array<panzer::ParamVec>::size_type i=0; i <
parameter_vector_.size(); i++) {
537 for (std::vector<std::tuple<std::string,
int,Teuchos::RCP<Epetra_Import>,Teuchos::RCP<Epetra_Vector> > >::const_iterator i =
540 Teuchos::RCP<const Epetra_Vector> global_vec = inArgs.
get_p(std::get<1>(*i));
541 if (nonnull(global_vec)) {
543 Teuchos::RCP<Epetra_Import> importer = std::get<2>(*i);
544 if (nonnull(importer))
545 std::get<3>(*i)->Import(*global_vec,*importer,
Insert);
549 Teuchos::RCP<panzer::EpetraLinearObjContainer> container =
551 container->set_x(std::get<3>(*i));
556 const RCP<panzer::EpetraLinearObjContainer> epGlobalContainer =
557 Teuchos::rcp_dynamic_cast<panzer::EpetraLinearObjContainer>(ae_inargs.
container_);
559 TEUCHOS_ASSERT(!Teuchos::is_null(epGlobalContainer));
564 const RCP<panzer::EpetraLinearObjContainer> epGhostedContainer =
565 Teuchos::rcp_dynamic_cast<panzer::EpetraLinearObjContainer>(ae_inargs.
ghostedContainer_);
574 epGlobalContainer->set_x(Teuchos::rcp_const_cast<Epetra_Vector>(x));
576 epGlobalContainer->set_dxdt(Teuchos::rcp_const_cast<Epetra_Vector>(x_dot));
578 if (!Teuchos::is_null(f_out) && !Teuchos::is_null(W_out)) {
580 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(f and J)");
583 epGlobalContainer->set_f(f_out);
584 epGlobalContainer->set_A(Teuchos::rcp_dynamic_cast<Epetra_CrsMatrix>(W_out));
587 epGhostedContainer->get_f()->PutScalar(0.0);
588 epGhostedContainer->get_A()->PutScalar(0.0);
592 else if(!Teuchos::is_null(f_out) && Teuchos::is_null(W_out)) {
594 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(f)");
596 epGlobalContainer->set_f(f_out);
599 epGhostedContainer->get_f()->PutScalar(0.0);
603 f_out->Update(1.0, *(epGlobalContainer->get_f()), 0.0);
605 else if(Teuchos::is_null(f_out) && !Teuchos::is_null(W_out)) {
607 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(J)");
613 epGlobalContainer->set_A(Teuchos::rcp_dynamic_cast<Epetra_CrsMatrix>(W_out));
616 epGhostedContainer->get_A()->PutScalar(0.0);
623 epGlobalContainer->set_A(Teuchos::null);
626 if(requiredResponses) {
639 epGlobalContainer->set_x(Teuchos::null);
640 epGlobalContainer->set_dxdt(Teuchos::null);
641 epGlobalContainer->set_f(Teuchos::null);
642 epGlobalContainer->set_A(Teuchos::null);
656 for(std::size_t i=0;i<
g_names_.size();i++) {
657 Teuchos::RCP<Epetra_Vector> vec = outArgs.
get_g(i);
658 if(vec!=Teuchos::null) {
659 std::string responseName =
g_names_[i];
660 Teuchos::RCP<panzer::ResponseMESupportBase<panzer::Traits::Residual> > resp
662 resp->setVector(vec);
678 for(std::size_t i=0;i<
g_names_.size();i++) {
686 if(vec!=Teuchos::null) {
687 std::string responseName =
g_names_[i];
688 Teuchos::RCP<panzer::ResponseMESupportBase<panzer::Traits::Jacobian> > resp
690 resp->setDerivative(vec);
704 using Teuchos::rcp_dynamic_cast;
709 RCP<const Thyra::VectorSpaceBase<double> > glblVS = rcp_dynamic_cast<const ThyraObjFactory<double> >(
lof_,
true)->getThyraRangeSpace();;
711 std::vector<std::string> activeParameters;
714 int totalParameterCount = 0;
715 for(Teuchos::Array<panzer::ParamVec>::size_type i=0; i <
parameter_vector_.size(); i++) {
729 RCP<LinearObjContainer> globalContainer = loc_pair->getGlobalLOC();
732 RCP<Epetra_Vector> vec = Teuchos::rcpFromRef(*(*mVec)(j));
733 RCP<panzer::ThyraObjContainer<double> > thGlobalContainer =
734 Teuchos::rcp_dynamic_cast<panzer::ThyraObjContainer<double> >(globalContainer);
735 thGlobalContainer->set_f_th(Thyra::create_Vector(vec,glblVS));
738 std::string name =
"PARAMETER_SENSITIVIES: "+(*
p_names_[i])[j];
742 activeParameters.push_back(name);
743 totalParameterCount++;
752 for (Teuchos::Array<panzer::ParamVec>::size_type i=0; i <
parameter_vector_.size(); i++) {
767 p.fastAccessDx(paramIndex) = 1.0;
775 TEUCHOS_ASSERT(paramIndex==totalParameterCount);
777 if(totalParameterCount>0) {
785 bool activeGArgs =
false;
786 for(
int i=0;i<outArgs.
Ng();i++)
787 activeGArgs |= (outArgs.
get_g(i)!=Teuchos::null);
795 bool activeGArgs =
false;
796 for(
int i=0;i<outArgs.
Ng();i++) {
802 activeGArgs |= (!outArgs.
get_DgDx(i).isEmpty());
811 bool activeFPArgs =
false;
812 for(
int i=0;i<outArgs.
Np();i++) {
818 activeFPArgs |= (!outArgs.
get_DfDp(i).isEmpty());
833 using Teuchos::rcpFromRef;
834 using Teuchos::rcp_dynamic_cast;
836 using Teuchos::ArrayView;
837 using Teuchos::rcp_dynamic_cast;
841 TEUCHOS_TEST_FOR_EXCEPTION(numVecs != 1, std::runtime_error,
842 "epetraToThyra does not work with MV dimension != 1");
844 const RCP<const Thyra::ProductVectorBase<double> > prodThyraVec =
845 Thyra::castOrCreateProductVectorBase(rcpFromRef(thyraVec));
850 std::size_t offset = 0;
851 const int numBlocks = prodThyraVec->productSpace()->numBlocks();
852 for (
int b = 0; b < numBlocks; ++b) {
853 const RCP<const Thyra::VectorBase<double> > vec_b = prodThyraVec->getVectorBlock(b);
854 const RCP<const Thyra::SpmdVectorBase<double> > spmd_b =
855 rcp_dynamic_cast<const Thyra::SpmdVectorBase<double> >(vec_b,
true);
857 Teuchos::ArrayRCP<const double> thyraData;
858 spmd_b->getLocalData(Teuchos::ptrFromRef(thyraData));
860 for (Teuchos::ArrayRCP<const double>::size_type i=0; i < thyraData.size(); ++i) {
861 epetraData[i+offset] = thyraData[i];
863 offset += thyraData.size();
873 using Teuchos::ArrayView;
874 using Teuchos::rcpFromPtr;
875 using Teuchos::rcp_dynamic_cast;
879 TEUCHOS_TEST_FOR_EXCEPTION(numVecs != 1, std::runtime_error,
880 "ModelEvaluator_Epetra::copyEpetraToThyra does not work with MV dimension != 1");
882 const RCP<Thyra::ProductVectorBase<double> > prodThyraVec =
883 Thyra::castOrCreateNonconstProductVectorBase(rcpFromPtr(thyraVec));
885 const Teuchos::ArrayView<const double> epetraData(x[0], x.
Map().
NumMyElements());
890 std::size_t offset = 0;
891 const int numBlocks = prodThyraVec->productSpace()->numBlocks();
892 for (
int b = 0; b < numBlocks; ++b) {
893 const RCP<Thyra::VectorBase<double> > vec_b = prodThyraVec->getNonconstVectorBlock(b);
894 const RCP<Thyra::SpmdVectorBase<double> > spmd_b =
895 rcp_dynamic_cast<Thyra::SpmdVectorBase<double> >(vec_b,
true);
897 Teuchos::ArrayRCP<double> thyraData;
898 spmd_b->getNonconstLocalData(Teuchos::ptrFromRef(thyraData));
900 for (Teuchos::ArrayRCP<double>::size_type i=0; i < thyraData.size(); ++i) {
901 thyraData[i] = epetraData[i+offset];
903 offset += thyraData.size();
909Teuchos::RCP<panzer::ModelEvaluator_Epetra>
913 const std::vector<Teuchos::RCP<Teuchos::Array<std::string> > >& p_names,
914 const std::vector<Teuchos::RCP<Teuchos::Array<double> > >& p_values,
915 const Teuchos::RCP<panzer::GlobalData>& global_data,
916 bool build_transient_support)
919 using Teuchos::rcp_dynamic_cast;
922 std::stringstream ss;
923 ss <<
"panzer::buildEpetraME: Linear object factory is incorrect type. Should be one of: ";
925 RCP<BlockedEpetraLinearObjFactory<panzer::Traits,int> > ep_lof
926 = rcp_dynamic_cast<BlockedEpetraLinearObjFactory<panzer::Traits,int> >(lof);
929 if(ep_lof!=Teuchos::null)
930 return rcp(
new ModelEvaluator_Epetra(fmb,rLibrary,ep_lof,p_names,p_values,global_data,build_transient_support));
932 ss <<
"\"BlockedEpetraLinearObjFactory\", ";
934 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::logic_error,ss.str());
Teuchos::RCP< Epetra_MultiVector > getMultiVector() const
void setSupports(EInArgsMembers arg, bool supports=true)
void setModelEvalDescription(const std::string &modelEvalDescription)
bool supports(EInArgsMembers arg) const
Teuchos::RCP< const Epetra_Vector > get_p(int l) const
Teuchos::RCP< const Epetra_Vector > get_x() const
Teuchos::RCP< const Epetra_Vector > get_x_dot() const
void setModelEvalDescription(const std::string &modelEvalDescription)
void set_W_properties(const DerivativeProperties &properties)
void set_Np_Ng(int Np, int Ng)
void setSupports(EOutArgsMembers arg, bool supports=true)
Teuchos::RCP< Epetra_Operator > get_W() const
bool supports(EOutArgsMembers arg) const
Derivative get_DfDp(int l) const
Derivative get_DgDx(int j) const
Evaluation< Epetra_Vector > get_g(int j) const
Evaluation< Epetra_Vector > get_f() const
int NumMyElements() const
const Epetra_BlockMap & Map() const
void addGlobalEvaluationData(const std::string &key, const Teuchos::RCP< GlobalEvaluationData > &ged)
Teuchos::RCP< panzer::LinearObjContainer > ghostedContainer_
bool apply_dirichlet_beta
bool evaluate_transient_terms
Teuchos::RCP< panzer::LinearObjContainer > container_
virtual const Teuchos::RCP< Epetra_Map > getMap(int i) const
get the map from the matrix
Teuchos::RCP< const Epetra_Map > get_f_map() const
Teuchos::RCP< const Epetra_Map > get_x_map() const
OutArgs createOutArgs() const
Teuchos::RCP< const Epetra_Vector > get_x_init() const
Teuchos::RCP< const Epetra_Vector > get_x_dot_init() const
Teuchos::RCP< Epetra_Operator > create_W() const
Teuchos::RCP< const Epetra_Map > get_g_map(int l) const
void evalModel(const InArgs &inArgs, const OutArgs &outArgs) const
Teuchos::RCP< const Teuchos::Array< std::string > > get_p_names(int l) const
void set_t_init(double t)
Set initial time value.
InArgs createInArgs() const
double get_t_init() const
ModelEvaluator_Epetra(const Teuchos::RCP< panzer::FieldManagerBuilder > &fmb, const Teuchos::RCP< panzer::ResponseLibrary< panzer::Traits > > &rLibrary, const Teuchos::RCP< panzer::LinearObjFactory< panzer::Traits > > &lof, const std::vector< Teuchos::RCP< Teuchos::Array< std::string > > > &p_names, const std::vector< Teuchos::RCP< Teuchos::Array< double > > > &p_values, const Teuchos::RCP< panzer::GlobalData > &global_data, bool build_transient_support)
Teuchos::RCP< const Epetra_Map > get_p_map(int l) const
Teuchos::RCP< const Epetra_Vector > get_p_init(int l) const
Teuchos::RCP< Teuchos::AbstractFactory< Epetra_Operator > > epetraOperatorFactory_
void evalModel_basic_dgdx(AssemblyEngineInArgs ae_inargs, const InArgs &inArgs, const OutArgs &outArgs) const
Teuchos::RCP< const Epetra_Map > map_x_
void initializeEpetraObjs(panzer::BlockedEpetraLinearObjFactory< panzer::Traits, int > &lof)
void setOneTimeDirichletBeta(const double &beta) const
bool required_basic_dgdx(const OutArgs &outArgs) const
Are their required responses in the out args? DgDx.
Teuchos::RCP< LinearObjContainer > ghostedContainer_
void evalModel_basic_dfdp(AssemblyEngineInArgs ae_inargs, const InArgs &inArgs, const OutArgs &outArgs) const
bool required_basic_g(const OutArgs &outArgs) const
Are their required responses in the out args? g and DgDx.
Teuchos::RCP< panzer::LinearObjFactory< panzer::Traits > > lof_
int addDistributedParameter(const std::string name, const Teuchos::RCP< Epetra_Map > &global_map, const Teuchos::RCP< Epetra_Import > &importer, const Teuchos::RCP< Epetra_Vector > &ghosted_vector)
void evalModel_basic_g(AssemblyEngineInArgs ae_inargs, const InArgs &inArgs, const OutArgs &outArgs) const
Teuchos::RCP< panzer::FieldManagerBuilder > fmb_
double oneTimeDirichletBeta_
bool required_basic_dfdp(const OutArgs &outArgs) const
Are derivatives of the residual with respect to the parameters in the out args? DfDp.
std::vector< Teuchos::RCP< Epetra_Map > > p_map_
void evalModel_basic(const InArgs &inArgs, const OutArgs &outArgs) const
for evaluation and handling of normal quantities, x,f,W, etc
void initializeParameterVector(const std::vector< Teuchos::RCP< Teuchos::Array< std::string > > > &p_names, const std::vector< Teuchos::RCP< Teuchos::Array< double > > > &p_values, const Teuchos::RCP< panzer::ParamLib > ¶meter_library)
Teuchos::RCP< Epetra_Vector > x0_
bool oneTimeDirichletBeta_on_
void copyEpetraIntoThyra(const Epetra_MultiVector &x, const Teuchos::Ptr< Thyra::VectorBase< double > > &thyraVec) const
Teuchos::RCP< panzer::GlobalData > global_data_
panzer::AssemblyEngine_TemplateManager< panzer::Traits > ae_tm_
std::vector< std::tuple< std::string, int, Teuchos::RCP< Epetra_Import >, Teuchos::RCP< Epetra_Vector > > > distributed_parameter_container_
Teuchos::RCP< Epetra_Vector > dummy_f_
std::vector< Teuchos::RCP< Epetra_Vector > > p_init_
std::vector< std::string > g_names_
std::vector< bool > is_distributed_parameter_
std::vector< Teuchos::RCP< const Epetra_Map > > g_map_
Teuchos::RCP< Epetra_Vector > x_dot_init_
void applyDirichletBCs(const Teuchos::RCP< Thyra::VectorBase< double > > &x, const Teuchos::RCP< Thyra::VectorBase< double > > &f) const
bool build_transient_support_
std::vector< Teuchos::RCP< Teuchos::Array< std::string > > > p_names_
void copyThyraIntoEpetra(const Thyra::VectorBase< double > &thyraVec, Epetra_MultiVector &x) const
Teuchos::RCP< panzer::ResponseLibrary< panzer::Traits > > responseLibrary_
Teuchos::Array< panzer::ParamVec > parameter_vector_
Teuchos::RCP< ModelEvaluator_Epetra > buildEpetraME(const Teuchos::RCP< FieldManagerBuilder > &fmb, const Teuchos::RCP< ResponseLibrary< panzer::Traits > > &rLibrary, const Teuchos::RCP< LinearObjFactory< panzer::Traits > > &lof, const std::vector< Teuchos::RCP< Teuchos::Array< std::string > > > &p_names, const std::vector< Teuchos::RCP< Teuchos::Array< double > > > &p_values, const Teuchos::RCP< panzer::GlobalData > &global_data, bool build_transient_support)
void registerScalarParameter(const std::string name, panzer::ParamLib &pl, double realValue)