39 const int num_global_elements,
const Scalar z_min,
40 const Scalar z_max,
const Scalar a,
const Scalar k)
42 num_global_elements_(num_global_elements),
47 showGetInvalidArg_(false)
51 using ::Thyra::VectorBase;
52 typedef ::Thyra::ModelEvaluatorBase MEB;
53 typedef Teuchos::ScalarTraits<Scalar> ST;
55 TEUCHOS_ASSERT(nonnull(
comm_));
64 if (
comm_->NumProc() == 1) {
68 int OverlapNumMyElements;
70 OverlapNumMyElements =
x_owned_map_->NumMyElements() + 2;
71 if ((
comm_->MyPID() == 0) || (
comm_->MyPID() == (
comm_->NumProc() - 1)))
72 OverlapNumMyElements--;
74 if (
comm_->MyPID() == 0)
79 int* OverlapMyGlobalElements =
new int[OverlapNumMyElements];
81 for (
int i = 0; i < OverlapNumMyElements; i++)
82 OverlapMyGlobalElements[i] = OverlapMinMyGID + i;
85 -1, OverlapNumMyElements, OverlapMyGlobalElements, 0, *
comm_));
87 delete[] OverlapMyGlobalElements;
97 V_S(
x0_.ptr(), ST::zero());
110 for (
int i = 0; i <
x_owned_map_->NumMyElements(); i++) {
111 (*node_coordinates_)[i] =
116 MEB::InArgsSetup<Scalar> inArgs;
117 inArgs.setModelEvalDescription(this->description());
118 inArgs.setSupports(MEB::IN_ARG_t);
119 inArgs.setSupports(MEB::IN_ARG_x);
120 inArgs.setSupports(MEB::IN_ARG_beta);
121 inArgs.setSupports(MEB::IN_ARG_x_dot);
122 inArgs.setSupports(MEB::IN_ARG_alpha);
125 MEB::OutArgsSetup<Scalar> outArgs;
126 outArgs.setModelEvalDescription(this->description());
127 outArgs.setSupports(MEB::OUT_ARG_f);
128 outArgs.setSupports(MEB::OUT_ARG_W);
129 outArgs.setSupports(MEB::OUT_ARG_W_op);
130 outArgs.setSupports(MEB::OUT_ARG_W_prec);
141 auto x_dot_init = Thyra::createMember(this->
get_x_space());
142 Thyra::put_scalar(Scalar(0.0), x_dot_init.ptr());
299 const Thyra::ModelEvaluatorBase::InArgs<Scalar>& inArgs,
300 const Thyra::ModelEvaluatorBase::OutArgs<Scalar>& outArgs)
const
304 using Teuchos::rcp_dynamic_cast;
306 TEUCHOS_ASSERT(nonnull(inArgs.get_x()));
307 TEUCHOS_ASSERT(nonnull(inArgs.get_x_dot()));
311 const RCP<Thyra::VectorBase<Scalar> > f_out = outArgs.get_f();
312 const RCP<Thyra::LinearOpBase<Scalar> > W_out = outArgs.get_W_op();
313 const RCP<Thyra::PreconditionerBase<Scalar> > W_prec_out =
314 outArgs.get_W_prec();
316 if (nonnull(f_out) || nonnull(W_out) || nonnull(W_prec_out)) {
321 RCP<Epetra_Vector> f;
322 if (nonnull(f_out)) {
323 f = Thyra::get_Epetra_Vector(*f_owned_map_, outArgs.get_f());
326 RCP<Epetra_CrsMatrix> J;
327 if (nonnull(W_out)) {
328 RCP<Epetra_Operator> W_epetra = Thyra::get_Epetra_Operator(*W_out);
329 J = rcp_dynamic_cast<Epetra_CrsMatrix>(W_epetra);
330 TEUCHOS_ASSERT(nonnull(J));
333 RCP<Epetra_CrsMatrix> M_inv;
334 if (nonnull(W_prec_out)) {
335 RCP<Epetra_Operator> M_epetra =
336 Thyra::get_Epetra_Operator(*(W_prec_out->getNonconstRightPrecOp()));
337 M_inv = rcp_dynamic_cast<Epetra_CrsMatrix>(M_epetra);
338 TEUCHOS_ASSERT(nonnull(M_inv));
339 J_diagonal_ = Teuchos::rcp(
new Epetra_Vector(*x_owned_map_));
347 if (comm_->MyPID() == 0) {
348 RCP<Thyra::VectorBase<Scalar> > x =
349 Teuchos::rcp_const_cast<Thyra::VectorBase<Scalar> >(inArgs.get_x());
350 (*Thyra::get_Epetra_Vector(*x_owned_map_, x))[0] = 1.0;
354 u_ptr = Teuchos::rcp(
new Epetra_Vector(*x_ghosted_map_));
356 u_ptr->Import(*(Thyra::get_Epetra_Vector(*x_owned_map_, inArgs.get_x())),
359 if (is_null(u_dot_ptr))
360 u_dot_ptr = Teuchos::rcp(
new Epetra_Vector(*x_ghosted_map_));
363 *(Thyra::get_Epetra_Vector(*x_owned_map_, inArgs.get_x_dot())),
366 if (is_null(x_ptr)) {
367 x_ptr = Teuchos::rcp(
new Epetra_Vector(*x_ghosted_map_));
368 x_ptr->Import(*node_coordinates_, *importer_, Insert);
371 Epetra_Vector& u = *u_ptr;
372 Epetra_Vector& u_dot = *u_dot_ptr;
373 Epetra_Vector& x = *x_ptr;
376 int OverlapNumMyElements = x_ghosted_map_->NumMyElements();
382 const auto alpha = inArgs.get_alpha();
383 const auto beta = inArgs.get_beta();
386 if (nonnull(f)) f->PutScalar(0.0);
387 if (nonnull(J)) J->PutScalar(0.0);
388 if (nonnull(M_inv)) M_inv->PutScalar(0.0);
391 for (
int ne = 0; ne < OverlapNumMyElements - 1; ne++) {
393 for (
int gp = 0; gp < 2; gp++) {
399 uu_dot[0] = u_dot[ne];
400 uu_dot[1] = u_dot[ne + 1];
405 for (
int i = 0; i < 2; i++) {
406 int row = x_ghosted_map_->GID(ne + i);
409 if (x_owned_map_->MyGID(row)) {
411 (*f)[x_owned_map_->LID(x_ghosted_map_->GID(ne + i))] +=
412 +basis.
wt * basis.
dz *
414 + (a_ / basis.
dz * basis.
duu * basis.
phi[i]
415 + 1.0 / (basis.
dz * basis.
dz)) *
417 + k_ * basis.
uu * basis.
uu * basis.
phi[i]);
422 for (
int j = 0; j < 2; j++) {
423 if (x_owned_map_->MyGID(row)) {
424 int column = x_ghosted_map_->GID(ne + j);
425 double jac = basis.
wt * basis.
dz *
426 (alpha * basis.
phi[i] * basis.
phi[j]
427 + beta * (+a_ / basis.
dz * basis.
dphide[j] *
429 + (1.0 / (basis.
dz * basis.
dz)) *
432 + 2.0 * k_ * basis.
uu * basis.
phi[j] *
435 ierr = J->SumIntoGlobalValues(row, 1, &jac, &column);
439 if (nonnull(M_inv)) {
440 for (
int j = 0; j < 2; j++) {
441 if (x_owned_map_->MyGID(row)) {
442 int column = x_ghosted_map_->GID(ne + j);
447 basis.
wt * basis.
dz *
448 (alpha * basis.
phi[i] * basis.
phi[j]
449 + beta * (+a_ / basis.
dz * basis.
dphide[j] *
451 + (1.0 / (basis.
dz * basis.
dz)) *
454 + 2.0 * k_ * basis.
uu * basis.
phi[j] *
457 ierr = M_inv->SumIntoGlobalValues(row, 1, &jac, &column);
468 if (comm_->MyPID() == 0) {
476 ierr = J->ReplaceGlobalValues(0, 1, &jac, &column);
479 ierr = J->ReplaceGlobalValues(0, 1, &jac, &column);
481 if (nonnull(M_inv)) {
484 ierr = M_inv->ReplaceGlobalValues(0, 1, &jac, &column);
487 ierr = M_inv->ReplaceGlobalValues(0, 1, &jac, &column);
491 if (nonnull(J)) J->FillComplete();
493 if (nonnull(M_inv)) {
495 M_inv->ExtractDiagonalCopy(*J_diagonal_);
497 for (
int i = 0; i < J_diagonal_->MyLength(); ++i)
498 (*J_diagonal_)[i] = 1.0 / ((*J_diagonal_)[i]);
500 M_inv->PutScalar(0.0);
501 M_inv->ReplaceDiagonalValues(*J_diagonal_);
502 M_inv->FillComplete();
505 TEUCHOS_ASSERT(ierr > -1);