49 Teuchos::RCP<EpetraExt::ModelEvaluator> underlyingME_,
50 const Teuchos::RCP<EpetraExt::MultiComm> &globalComm_,
51 const std::vector<Epetra_Vector*> initGuessVec_,
52 Teuchos::RCP<std::vector< Teuchos::RCP<Epetra_Vector> > > q_vec_,
53 Teuchos::RCP<std::vector< Teuchos::RCP<Epetra_Vector> > > matching_vec_
62#ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
65#ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
68#ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
71#ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
78 std::cout <<
"----------MultiPoint Partition Info------------"
79 <<
"\n\tNumProcs = " << globalComm->NumProc()
80 <<
"\n\tSpatial Decomposition = " << globalComm->SubDomainComm().NumProc()
81 <<
"\n\tNumber of Domains = " << numTimeDomains
82 <<
"\n\tSteps on Domain 0 = " << timeStepsOnTimeDomain
83 <<
"\n\tTotal Number of Steps = " << globalComm->NumTimeSteps();
84 std::cout <<
"\n-----------------------------------------------" << std::endl;
92#ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
93 if(
split_W->RowMatrixRowMap().GlobalIndicesInt()) {
95 rowStencil_int = new std::vector< std::vector<int> >(timeStepsOnTimeDomain);
96 rowIndex_int = new std::vector<int>;
97 for (int i=0; i < timeStepsOnTimeDomain; i++) {
98 (*rowStencil_int)[i].push_back(0);
99 (*rowIndex_int).push_back(i + globalComm->FirstTimeStepOnDomain());
106#ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
107 if(split_W->RowMatrixRowMap().GlobalIndicesInt()) {
109 rowStencil_LL = new std::vector< std::vector<long long> >(timeStepsOnTimeDomain);
110 rowIndex_LL = new std::vector<long long>;
111 for (int i=0; i < timeStepsOnTimeDomain; i++) {
112 (*rowStencil_LL)[i].push_back(0);
113 (*rowIndex_LL).push_back(i + globalComm->FirstTimeStepOnDomain());
116 *rowStencil_LL, *rowIndex_LL, *globalComm));
120 throw "EpetraExt::MultiPointModelEvaluator::MultiPointModelEvaluator: Global indices unknown";
125 underlyingNg = underlyingOutArgs.
Ng();
127 if (underlyingOutArgs.
supports(OUT_ARG_DgDp,0,0).supports(DERIV_TRANS_MV_BY_ROW))
128 orientation_DgDp = DERIV_TRANS_MV_BY_ROW;
130 orientation_DgDp = DERIV_MV_BY_COL;
134 TEUCHOS_TEST_FOR_EXCEPT(underlyingOutArgs.
Np()!=2);
137 const Epetra_Map& split_map = split_W->RowMatrixRowMap();
138 num_p0 = underlyingME_->get_p_map(0)->NumMyElements();
139 if (underlyingNg) num_g0 = underlyingME_->get_g_map(0)->NumMyElements();
141 num_dg0dp0 = num_g0 * num_p0;
144 block_x =
new EpetraExt::BlockVector(split_map, block_W->RowMap());
145 block_f =
new EpetraExt::BlockVector(*block_x);
146 block_DfDp =
new EpetraExt::BlockMultiVector(split_map, block_W->RowMap(), num_p0);
148 block_DgDx =
new EpetraExt::BlockMultiVector(split_map, block_W->RowMap(), num_g0);
151 split_x = Teuchos::rcp(
new Epetra_Vector(split_map));
152 split_f = Teuchos::rcp(
new Epetra_Vector(split_map));
153 split_DfDp = Teuchos::rcp(
new Epetra_MultiVector(split_map, num_p0));
155 split_DgDx = Teuchos::rcp(
new Epetra_MultiVector(split_map, num_g0));
157 if(orientation_DgDp == DERIV_TRANS_MV_BY_ROW)
158 split_DgDp = Teuchos::rcp(
new Epetra_MultiVector(*(underlyingME_->get_p_map(0)), num_g0));
160 split_DgDp = Teuchos::rcp(
new Epetra_MultiVector(*(underlyingME_->get_g_map(0)), num_p0));
163 split_g = Teuchos::rcp(
new Epetra_Vector(*(underlyingME_->get_g_map(0))));
166 derivMV_DfDp =
new EpetraExt::ModelEvaluator::DerivativeMultiVector(split_DfDp);
167 deriv_DfDp =
new EpetraExt::ModelEvaluator::Derivative(*derivMV_DfDp);
169 derivMV_DgDx =
new EpetraExt::ModelEvaluator::DerivativeMultiVector(split_DgDx, DERIV_TRANS_MV_BY_ROW);
170 deriv_DgDx =
new EpetraExt::ModelEvaluator::Derivative(*derivMV_DgDx);
171 derivMV_DgDp =
new EpetraExt::ModelEvaluator::DerivativeMultiVector(split_DgDp, orientation_DgDp);
172 deriv_DgDp =
new EpetraExt::ModelEvaluator::Derivative(*derivMV_DgDp);
183 solution_init = Teuchos::rcp(
new EpetraExt::BlockVector(*block_x));
186#ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
187 for (
int i=0; i < timeStepsOnTimeDomain; i++)
188 solution_init->LoadBlockValues(*(initGuessVec_[i]), (*rowIndex_LL)[i]);
192#ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
193 for (
int i=0; i < timeStepsOnTimeDomain; i++)
194 solution_init->LoadBlockValues(*(initGuessVec_[i]), (*rowIndex_int)[i]);
200 if (Teuchos::is_null(matching_vec)) matchingProblem =
false;
201 else matchingProblem =
true;
203 if (matchingProblem) {
204 TEUCHOS_TEST_FOR_EXCEPT(as<int>(matching_vec->size())!=timeStepsOnTimeDomain);
205 TEUCHOS_TEST_FOR_EXCEPT(!(*matching_vec)[0]->Map().SameAs(*(underlyingME_->get_g_map(0))));
206 TEUCHOS_TEST_FOR_EXCEPT(num_g0 != 1);
339 Teuchos::RCP<const Epetra_Vector> p_in = inArgs.
get_p(0);
340 if (p_in.get()) underlyingInArgs.
set_p(0, p_in);
342 Teuchos::RCP<const Epetra_Vector> x_in = inArgs.
get_x();
343 block_x->Epetra_Vector::operator=(*x_in);
346 Teuchos::RCP<Epetra_Vector> f_out = outArgs.
get_f();
348 Teuchos::RCP<Epetra_Operator> W_out = outArgs.
get_W();
349 Teuchos::RCP<EpetraExt::BlockCrsMatrix> W_block =
350 Teuchos::rcp_dynamic_cast<EpetraExt::BlockCrsMatrix>(W_out);
352 Teuchos::RCP<Epetra_Vector> g_out;
354 if (g_out.get()) g_out->PutScalar(0.0);
369 bool need_g = g_out.get();
382#ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
387#ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
407 underlyingME->evalModel(underlyingInArgs, underlyingOutArgs);
413 double diff = (*split_g)[0] - (*(*matching_vec)[i])[0];
415 (*split_g)[0] = 0.5 * diff * diff/(nrmlz*nrmlz);
423#ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
425 if (W_out.get()) W_block->LoadBlock(*
split_W, i, 0);
432#ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
434 if (W_out.get()) W_block->LoadBlock(*
split_W, i, 0);
442 if (g_out.get()) g_out->Update(1.0, *
split_g, 1.0);
450 if (f_out.get()) f_out->operator=(*block_f);
458 double factorToZeroOutCopies = 0.0;
459 if (
globalComm->SubDomainComm().MyPID()==0) factorToZeroOutCopies = 1.0;
461 (*g_out).Scale(factorToZeroOutCopies);
462 double* vPtr = &((*g_out)[0]);