Stokhos Package Browser (Single Doxygen Collection)  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Stokhos_MPInverseModelEvaluator.cpp
Go to the documentation of this file.
1 // @HEADER
2 // *****************************************************************************
3 // Stokhos Package
4 //
5 // Copyright 2009 NTESS and the Stokhos contributors.
6 // SPDX-License-Identifier: BSD-3-Clause
7 // *****************************************************************************
8 // @HEADER
9 
11 
12 #include "Teuchos_Assert.hpp"
16 #include "Epetra_Map.h"
17 
20  const Teuchos::Array<int>& mp_p_index_map_,
21  const Teuchos::Array<int>& mp_g_index_map_,
22  const Teuchos::Array< Teuchos::RCP<const Epetra_Map> >& base_g_maps_) :
23  me(me_),
24  mp_p_index_map(mp_p_index_map_),
25  mp_g_index_map(mp_g_index_map_),
26  base_g_maps(base_g_maps_),
27  num_p(0),
28  num_g(0),
29  num_p_mp(mp_p_index_map.size()),
30  num_g_mp(mp_g_index_map.size())
31 {
32  InArgs me_inargs = me->createInArgs();
33  OutArgs me_outargs = me->createOutArgs();
34  num_p = me_inargs.Np() - num_p_mp;
35  num_g = me_outargs.Ng();
36 
38  base_g_maps.size() != num_g_mp, std::logic_error,
39  std::endl
40  << "Error! Stokhos::MPInverseModelEvaluator::MPInverseModelEvaluator():"
41  << " Base response map array size does not match size of index array!");
42 }
43 
44 // Overridden from EpetraExt::ModelEvaluator
45 
48 get_x_map() const
49 {
50  return Teuchos::null;
51 }
52 
55 get_f_map() const
56 {
57  return Teuchos::null;
58 }
59 
62 get_p_map(int l) const
63 {
65  l >= num_p || l < 0, std::logic_error,
66  std::endl << "Error! Stokhos::MPInverseModelEvaluator::get_p_map():"
67  << " Invalid parameter index l = " << l << std::endl);
68  return me->get_p_map(l);
69 }
70 
73 get_g_map(int l) const
74 {
76  l >= num_g || l < 0, std::logic_error,
77  std::endl << "Error! Stokhos::MPInverseModelEvaluator::get_g_map():"
78  << " Invalid response index l = " << l << std::endl);
79  return base_g_maps[l];
80 }
81 
84 get_p_names(int l) const
85 {
87  l >= num_p || l < 0, std::logic_error,
88  std::endl << "Error! Stokhos::MPInverseModelEvaluator::get_p_names():"
89  << " Invalid parameter index l = " << l << std::endl);
90  return me->get_p_names(l);
91 }
92 
95 get_p_init(int l) const
96 {
98  l >= num_p || l < 0, std::logic_error,
99  std::endl << "Error! Stokhos::MPInverseModelEvaluator::get_p_init():"
100  << " Invalid parameter index l = " << l << std::endl);
101  return me->get_p_init(l);
102 }
103 
104 EpetraExt::ModelEvaluator::InArgs
106 {
107  InArgsSetup inArgs;
108  InArgs me_inargs = me->createInArgs();
109 
110  inArgs.setModelEvalDescription(this->description());
111  inArgs.set_Np(num_p);
112  for (int i=0; i<num_p_mp; i++)
113  inArgs.setSupports(IN_ARG_p_mp, mp_p_index_map[i], true);
114 
115  return inArgs;
116 }
117 
118 EpetraExt::ModelEvaluator::OutArgs
120 {
121  OutArgsSetup outArgs;
122  OutArgs me_outargs = me->createOutArgs();
123 
124  outArgs.setModelEvalDescription(this->description());
125 
126  outArgs.set_Np_Ng(num_p, num_g);
127  for (int i=0; i<num_g_mp; i++) {
128  outArgs.setSupports(OUT_ARG_g_mp, mp_g_index_map[i], true);
129  for (int j=0; j<num_p; j++)
130  outArgs.setSupports(OUT_ARG_DgDp_mp, mp_g_index_map[i], j,
131  me_outargs.supports(OUT_ARG_DgDp,i,j));
132  }
133 
134  return outArgs;
135 }
136 
137 void
139  const OutArgs& outArgs) const
140 {
141  // Create underlying inargs
142  InArgs me_inargs = me->createInArgs();
143 
144  // Pass parameters
145  for (int i=0; i<num_p; i++)
146  me_inargs.set_p(i, inArgs.get_p(i));
147 
148  // Pass MP parameters
149  for (int i=0; i<num_p_mp; i++) {
150  mp_const_vector_t p_mp = inArgs.get_p_mp(mp_p_index_map[i]);
151  if (p_mp != Teuchos::null) {
152  me_inargs.set_p(i+num_p, p_mp->getBlockVector());
153  }
154  }
155 
156  // Create underlying outargs
157  OutArgs me_outargs = me->createOutArgs();
158 
159 
160  // MP Responses
161  for (int i=0; i<num_g_mp; i++) {
162  int ii = mp_g_index_map[i];
163 
164  // g
165  mp_vector_t g_mp = outArgs.get_g_mp(ii);
166  if (g_mp != Teuchos::null) {
167  me_outargs.set_g(i, Teuchos::rcp_dynamic_cast<Epetra_Vector>(g_mp->getBlockVector()));
168  }
169 
170  // dg/dp
171  for (int j=0; j<num_p; j++) {
172  if (!outArgs.supports(OUT_ARG_DgDp_mp, ii, j).none()) {
173  MPDerivative dgdp_mp = outArgs.get_DgDp_mp(ii,j);
175  dgdp_mp.getMultiVector();
176  Teuchos::RCP<Epetra_Operator> dgdp_mp_op =
177  dgdp_mp.getLinearOp();
178  if (dgdp_mp_mv != Teuchos::null) {
179  me_outargs.set_DgDp(
180  i, j, Derivative(dgdp_mp_mv->getBlockMultiVector(),
181  dgdp_mp.getMultiVectorOrientation()));
182  }
183  else if (dgdp_mp_op != Teuchos::null) {
184  me_outargs.set_DgDp(i, j, Derivative(dgdp_mp_op));
185  }
186  }
187  }
188 
189  }
190 
191  // Compute the functions
192  me->evalModel(me_inargs, me_outargs);
193 
194 }
OutArgs createOutArgs() const
Create OutArgs.
void evalModel(const InArgs &inArgs, const OutArgs &outArgs) const
Evaluate model on InArgs.
int num_g_mp
Number of multi-point response vectors.
MPInverseModelEvaluator(const Teuchos::RCP< EpetraExt::ModelEvaluator > &me, const Teuchos::Array< int > &mp_p_index_map, const Teuchos::Array< int > &mp_g_index_map, const Teuchos::Array< Teuchos::RCP< const Epetra_Map > > &base_g_maps)
int num_p_mp
Number of multi-point parameter vectors.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Teuchos::RCP< const Epetra_Map > get_f_map() const
Return residual vector map.
Teuchos::Array< Teuchos::RCP< const Epetra_Map > > base_g_maps
Base maps of block g vectors.
Teuchos::RCP< const Epetra_Map > get_x_map() const
Return solution vector map.
Teuchos::RCP< EpetraExt::BlockMultiVector > getBlockMultiVector()
Get block vector.
Teuchos::RCP< const Epetra_Vector > get_p_init(int l) const
Return initial parameters.
Teuchos::RCP< EpetraExt::ModelEvaluator > me
Underlying model evaluator.
Teuchos::RCP< const Teuchos::Array< std::string > > get_p_names(int l) const
Return array of parameter names.
Teuchos::RCP< const Epetra_Map > get_g_map(int l) const
Return response map.
Teuchos::RCP< const Epetra_Map > get_p_map(int l) const
Return parameter vector map.