Thyra  Version of the Day
Thyra_DirectionalFiniteDiffCalculator_def.hpp
1 // @HEADER
2 // ***********************************************************************
3 //
4 // Thyra: Interfaces and Support for Abstract Numerical Algorithms
5 // Copyright (2004) Sandia Corporation
6 //
7 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
8 // license for use of this work by or on behalf of the U.S. Government.
9 //
10 // Redistribution and use in source and binary forms, with or without
11 // modification, are permitted provided that the following conditions are
12 // met:
13 //
14 // 1. Redistributions of source code must retain the above copyright
15 // notice, this list of conditions and the following disclaimer.
16 //
17 // 2. Redistributions in binary form must reproduce the above copyright
18 // notice, this list of conditions and the following disclaimer in the
19 // documentation and/or other materials provided with the distribution.
20 //
21 // 3. Neither the name of the Corporation nor the names of the
22 // contributors may be used to endorse or promote products derived from
23 // this software without specific prior written permission.
24 //
25 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 //
37 // Questions? Contact Roscoe A. Bartlett (bartlettra@ornl.gov)
38 //
39 // ***********************************************************************
40 // @HEADER
41 
42 #ifndef THYRA_DIRECTIONAL_FINITE_DIFF_CALCULATOR_DEF_HPP
43 #define THYRA_DIRECTIONAL_FINITE_DIFF_CALCULATOR_DEF_HPP
44 
45 
46 #include "Thyra_DirectionalFiniteDiffCalculator_decl.hpp"
47 #include "Thyra_ModelEvaluatorHelpers.hpp"
48 #include "Thyra_DetachedVectorView.hpp"
49 #include "Thyra_DetachedMultiVectorView.hpp"
50 #include "Thyra_StateFuncModelEvaluatorBase.hpp"
51 #include "Thyra_MultiVectorStdOps.hpp"
52 #include "Thyra_VectorStdOps.hpp"
53 #include "Teuchos_TimeMonitor.hpp"
54 #include "Teuchos_VerboseObjectParameterListHelpers.hpp"
55 
56 
57 namespace Thyra {
58 
59 
60 namespace DirectionalFiniteDiffCalculatorTypes {
61 
62 
63 //
64 // Undocumented utility class for setting support for new derivative objects
65 // on an OutArgs object! Warning, users should not attempt to play these
66 // tricks on their own!
67 //
68 // Note that because of the design of the OutArgs and OutArgsSetup classes,
69 // you can only change the list of supported arguments in a subclass of
70 // ModelEvaluatorBase since OutArgsSetup is a protected type. The fact that
71 // the only way to do this is convoluted is a feature!
72 //
73 template<class Scalar>
74 class OutArgsCreator : public StateFuncModelEvaluatorBase<Scalar>
75 {
76 public:
77  // Public functions overridden from ModelEvaulator.
78  RCP<const VectorSpaceBase<Scalar> > get_x_space() const
79  { TEUCHOS_TEST_FOR_EXCEPT(true); TEUCHOS_UNREACHABLE_RETURN(Teuchos::null); }
80  RCP<const VectorSpaceBase<Scalar> > get_f_space() const
81  { TEUCHOS_TEST_FOR_EXCEPT(true); TEUCHOS_UNREACHABLE_RETURN(Teuchos::null); }
82  ModelEvaluatorBase::InArgs<Scalar> createInArgs() const
83  { TEUCHOS_TEST_FOR_EXCEPT(true); TEUCHOS_UNREACHABLE_RETURN(ModelEvaluatorBase::InArgs<Scalar>()); }
84  ModelEvaluatorBase::OutArgs<Scalar> createOutArgs() const
85  { TEUCHOS_TEST_FOR_EXCEPT(true); TEUCHOS_UNREACHABLE_RETURN(ModelEvaluatorBase::OutArgs<Scalar>()); }
86  void evalModel(
87  const ModelEvaluatorBase::InArgs<Scalar> &inArgs,
88  const ModelEvaluatorBase::OutArgs<Scalar> &outArgs
89  ) const
90  { TEUCHOS_TEST_FOR_EXCEPT(true); }
91  // Static function that does the magic!
92  static ModelEvaluatorBase::OutArgs<Scalar> createOutArgs(
93  const ModelEvaluator<Scalar> &model,
94  const SelectedDerivatives &fdDerivatives
95  )
96  {
97 
98  typedef ModelEvaluatorBase MEB;
99 
100  const MEB::OutArgs<Scalar> wrappedOutArgs = model.createOutArgs();
101  const int Np = wrappedOutArgs.Np(), Ng = wrappedOutArgs.Ng();
102  MEB::OutArgsSetup<Scalar> outArgs;
103 
104  outArgs.setModelEvalDescription(
105  "DirectionalFiniteDiffCalculator: " + model.description()
106  );
107 
108  // Start off by supporting everything that the underlying model supports
109  // computing!
110 
111  outArgs.set_Np_Ng(Np,Ng);
112  outArgs.setSupports(wrappedOutArgs);
113 
114  // Add support for finite difference DfDp(l) if asked
115 
116  const SelectedDerivatives::supports_DfDp_t
117  &supports_DfDp = fdDerivatives.supports_DfDp_;
118  for(
119  SelectedDerivatives::supports_DfDp_t::const_iterator
120  itr = supports_DfDp.begin();
121  itr != supports_DfDp.end();
122  ++itr
123  )
124  {
125  const int l = *itr;
126  assert_p_space(model,l);
127  outArgs.setSupports(MEB::OUT_ARG_DfDp,l,MEB::DERIV_MV_BY_COL);
128  }
129 
130  // Add support for finite difference DgDp(j,l) if asked
131 
132  const SelectedDerivatives::supports_DgDp_t
133  &supports_DgDp = fdDerivatives.supports_DgDp_;
134  for(
135  SelectedDerivatives::supports_DgDp_t::const_iterator
136  itr = supports_DgDp.begin();
137  itr != supports_DgDp.end();
138  ++itr
139  )
140  {
141  const int j = itr->first;
142  const int l = itr->second;
143  assert_p_space(model,l);
144  outArgs.setSupports(MEB::OUT_ARG_DgDp,j,l,MEB::DERIV_MV_BY_COL);
145  }
146 
147  return outArgs;
148 
149  }
150 
151 private:
152 
153  static void assert_p_space( const ModelEvaluator<Scalar> &model, const int l )
154  {
155 #ifdef TEUCHOS_DEBUG
156  const bool p_space_l_is_in_core = model.get_p_space(l)->hasInCoreView();
158  !p_space_l_is_in_core, std::logic_error,
159  "Error, for the model " << model.description()
160  << ", the space p_space("<<l<<") must be in-core so that they can"
161  " act as the domain space for the multi-vector derivative!"
162  );
163 #endif
164  }
165 
166 };
167 
168 
169 } // namespace DirectionalFiniteDiffCalculatorTypes
170 
171 
172 // Private static data members
173 
174 
175 template<class Scalar>
176 const std::string& DirectionalFiniteDiffCalculator<Scalar>::FDMethod_name()
177 {
178  static std::string loc_FDMethod_name = "FD Method";
179  return loc_FDMethod_name;
180 }
181 
182 
183 template<class Scalar>
184 const RCP<
186  Thyra::DirectionalFiniteDiffCalculatorTypes::EFDMethodType
187  >
188 >&
189 DirectionalFiniteDiffCalculator<Scalar>::fdMethodValidator()
190 {
191  static RCP<Teuchos::StringToIntegralParameterEntryValidator<EFDMethodType> >
192  loc_fdMethodValidator
193  = Teuchos::rcp(
195  Teuchos::tuple<std::string>(
196  "order-one"
197  ,"order-two"
198  ,"order-two-central"
199  ,"order-two-auto"
200  ,"order-four"
201  ,"order-four-central"
202  ,"order-four-auto"
203  )
204  ,Teuchos::tuple<std::string>(
205  "Use O(eps) one sided finite differences (cramped bounds)"
206  ,"Use O(eps^2) one sided finite differences (cramped bounds)"
207  ,"Use O(eps^2) two sided central finite differences"
208  ,"Use \"order-two-central\" when not cramped by bounds, otherwise use \"order-two\""
209  ,"Use O(eps^4) one sided finite differences (cramped bounds)"
210  ,"Use O(eps^4) two sided central finite differences"
211  ,"Use \"order-four-central\" when not cramped by bounds, otherwise use \"order-four\""
212  )
213  ,Teuchos::tuple<Thyra::DirectionalFiniteDiffCalculatorTypes::EFDMethodType>(
214  Thyra::DirectionalFiniteDiffCalculatorTypes::FD_ORDER_ONE
215  ,Thyra::DirectionalFiniteDiffCalculatorTypes::FD_ORDER_TWO
216  ,Thyra::DirectionalFiniteDiffCalculatorTypes::FD_ORDER_TWO_CENTRAL
217  ,Thyra::DirectionalFiniteDiffCalculatorTypes::FD_ORDER_TWO_AUTO
218  ,Thyra::DirectionalFiniteDiffCalculatorTypes::FD_ORDER_FOUR
219  ,Thyra::DirectionalFiniteDiffCalculatorTypes::FD_ORDER_FOUR_CENTRAL
220  ,Thyra::DirectionalFiniteDiffCalculatorTypes::FD_ORDER_FOUR_AUTO
221  )
222  ,""
223  )
224  );
225  return loc_fdMethodValidator;
226 }
227 
228 
229 template<class Scalar>
230 const std::string&
231 DirectionalFiniteDiffCalculator<Scalar>::FDMethod_default()
232 {
233  static std::string loc_FDMethod_default = "order-one";
234  return loc_FDMethod_default;
235 }
236 
237 
238 template<class Scalar>
239 const std::string&
240 DirectionalFiniteDiffCalculator<Scalar>::FDStepSelectType_name()
241 {
242  static std::string loc_FDStepSelectType_name = "FD Step Select Type";
243  return loc_FDStepSelectType_name;
244 }
245 
246 
247 template<class Scalar>
248 const RCP<
250  Thyra::DirectionalFiniteDiffCalculatorTypes::EFDStepSelectType
251  >
252  >&
253 DirectionalFiniteDiffCalculator<Scalar>::fdStepSelectTypeValidator()
254 {
255  static const RCP<Teuchos::StringToIntegralParameterEntryValidator<EFDStepSelectType> >
256  loc_fdStepSelectTypeValidator
257  = Teuchos::rcp(
259  Teuchos::tuple<std::string>(
260  "Absolute"
261  ,"Relative"
262  )
263  ,Teuchos::tuple<std::string>(
264  "Use absolute step size \""+FDStepLength_name()+"\""
265  ,"Use relative step size \""+FDStepLength_name()+"\"*||xo||inf"
266  )
267  ,Teuchos::tuple<Thyra::DirectionalFiniteDiffCalculatorTypes::EFDStepSelectType>(
268  Thyra::DirectionalFiniteDiffCalculatorTypes::FD_STEP_ABSOLUTE
269  ,Thyra::DirectionalFiniteDiffCalculatorTypes::FD_STEP_RELATIVE
270  )
271  ,""
272  )
273  );
274  return loc_fdStepSelectTypeValidator;
275 }
276 
277 
278 template<class Scalar>
279 const std::string&
280 DirectionalFiniteDiffCalculator<Scalar>::FDStepSelectType_default()
281 {
282  static std::string loc_FDStepSelectType_default = "Absolute";
283  return loc_FDStepSelectType_default;
284 }
285 
286 
287 template<class Scalar>
288 const std::string&
289 DirectionalFiniteDiffCalculator<Scalar>::FDStepLength_name()
290 {
291  static std::string loc_FDStepLength_name = "FD Step Length";
292  return loc_FDStepLength_name;
293 }
294 
295 
296 template<class Scalar>
297 const double&
298 DirectionalFiniteDiffCalculator<Scalar>::FDStepLength_default()
299 {
300  static double loc_FDStepLength_default = -1.0;
301  return loc_FDStepLength_default;
302 }
303 
304 
305 // Constructors/initializer
306 
307 
308 template<class Scalar>
310  EFDMethodType fd_method_type_in
311  ,EFDStepSelectType fd_step_select_type_in
312  ,ScalarMag fd_step_size_in
313  ,ScalarMag fd_step_size_min_in
314  )
315  :fd_method_type_(fd_method_type_in)
316  ,fd_step_select_type_(fd_step_select_type_in)
317  ,fd_step_size_(fd_step_size_in)
318  ,fd_step_size_min_(fd_step_size_min_in)
319 {}
320 
321 
322 // Overriden from ParameterListAcceptor
323 
324 
325 template<class Scalar>
327  RCP<ParameterList> const& paramList
328  )
329 {
330  TEUCHOS_TEST_FOR_EXCEPT(paramList.get()==0);
331  paramList->validateParameters(*getValidParameters());
332  paramList_ = paramList;
333  fd_method_type_ = fdMethodValidator()->getIntegralValue(
334  *paramList_, FDMethod_name(), FDMethod_default());
335  fd_step_select_type_ = fdStepSelectTypeValidator()->getIntegralValue(
336  *paramList_, FDStepSelectType_name(), FDStepSelectType_default());
337  fd_step_size_ = paramList_->get(
338  FDStepLength_name(),FDStepLength_default());
339  Teuchos::readVerboseObjectSublist(&*paramList_,this);
340 }
341 
342 
343 template<class Scalar>
346 {
347  return paramList_;
348 }
349 
350 
351 template<class Scalar>
354 {
355  RCP<ParameterList> _paramList = paramList_;
356  paramList_ = Teuchos::null;
357  return _paramList;
358 }
359 
360 
361 template<class Scalar>
364 {
365  return paramList_;
366 }
367 
368 
369 template<class Scalar>
372 {
373  using Teuchos::rcp_implicit_cast;
375  static RCP<ParameterList> pl;
376  if(pl.get()==NULL) {
377  pl = Teuchos::parameterList();
378  pl->set(
379  FDMethod_name(), FDMethod_default(),
380  "The method used to compute the finite differences.",
381  rcp_implicit_cast<const PEV>(fdMethodValidator())
382  );
383  pl->set(
384  FDStepSelectType_name(), FDStepSelectType_default(),
385  "Method used to select the finite difference step length.",
386  rcp_implicit_cast<const PEV>(fdStepSelectTypeValidator())
387  );
388  pl->set(
389  FDStepLength_name(), FDStepLength_default()
390  ,"The length of the finite difference step to take.\n"
391  "A value of < 0.0 means that the step length will be determined automatically."
392  );
393  Teuchos::setupVerboseObjectSublist(&*pl);
394  }
395  return pl;
396 }
397 
398 
399 template<class Scalar>
402  const ModelEvaluator<Scalar> &model,
403  const SelectedDerivatives &fdDerivatives
404  )
405 {
406  return DirectionalFiniteDiffCalculatorTypes::OutArgsCreator<Scalar>::createOutArgs(
407  model, fdDerivatives );
408 }
409 
410 
411 template<class Scalar>
413  const ModelEvaluator<Scalar> &model,
414  const ModelEvaluatorBase::InArgs<Scalar> &bp, // basePoint
415  const ModelEvaluatorBase::InArgs<Scalar> &dir, // directions
416  const ModelEvaluatorBase::OutArgs<Scalar> &bfunc, // baseFunctionValues
417  const ModelEvaluatorBase::OutArgs<Scalar> &var // variations
418  ) const
419 {
420 
421  using std::string;
422 
423  THYRA_FUNC_TIME_MONITOR(
424  string("Thyra::DirectionalFiniteDiffCalculator<")+ST::name()+">::calcVariations(...)"
425  );
426 
427  using std::setw;
428  using std::endl;
429  using std::right;
430  using Teuchos::as;
431  typedef ModelEvaluatorBase MEB;
432  namespace DFDCT = DirectionalFiniteDiffCalculatorTypes;
433  typedef RCP<VectorBase<Scalar> > VectorPtr;
434 
435  RCP<Teuchos::FancyOStream> out = this->getOStream();
436  Teuchos::EVerbosityLevel verbLevel = this->getVerbLevel();
437  const bool trace = (static_cast<int>(verbLevel) >= static_cast<int>(Teuchos::VERB_MEDIUM));
438  Teuchos::OSTab tab(out);
439 
440  if(out.get() && trace)
441  *out << "\nEntering DirectionalFiniteDiffCalculator<Scalar>::calcVariations(...)\n";
442 
443  if(out.get() && trace)
444  *out
445  << "\nbasePoint=\n" << describe(bp,verbLevel)
446  << "\ndirections=\n" << describe(dir,verbLevel)
447  << "\nbaseFunctionValues=\n" << describe(bfunc,verbLevel)
448  << "\nvariations=\n" << describe(var,Teuchos::VERB_LOW);
449 
450 #ifdef TEUCHOS_DEBUG
452  var.isEmpty(), std::logic_error,
453  "Error, all of the variations can not be null!"
454  );
455 #endif
456 
457  //
458  // To illustrate the theory behind this implementation consider
459  // the generic multi-variable function h(z) <: R^n -> R. Now let's
460  // consider we have the base point zo and the vector v to
461  // perturb h(z) along. First form the function h(zo+a*v) and then
462  // let's compute d(h)/d(a) at a = 0:
463  //
464  // (1) d(h(zo+a*v))/d(a) at a = 0
465  // = sum( d(h)/d(x(i)) * d(x(i))/d(a), i = 1...n)
466  // = sum( d(h)/d(x(i)) * v(i), i = 1...n)
467  // = d(h)/d(a) * v
468  //
469  // Now we can approximate (1) using, for example, central differences as:
470  //
471  // (2) d(h(zo+a*v))/d(a) at a = 0
472  // \approx ( h(zo+h*v) - h(zo+h*v) ) / (2*h)
473  //
474  // If we equate (1) and (2) we have the approximation:
475  //
476  // (3) d(h)/d(a) * v \approx ( h(zo+h*v) - g(zo+h*v) ) / (2*h)
477  //
478  //
479 
480  // /////////////////////////////////////////
481  // Validate the input
482 
483  // ToDo: Validate input!
484 
485  switch(this->fd_method_type()) {
486  case DFDCT::FD_ORDER_ONE:
487  if(out.get()&&trace) *out<<"\nUsing one-sided, first-order finite differences ...\n";
488  break;
489  case DFDCT::FD_ORDER_TWO:
490  if(out.get()&&trace) *out<<"\nUsing one-sided, second-order finite differences ...\n";
491  break;
492  case DFDCT::FD_ORDER_TWO_CENTRAL:
493  if(out.get()&&trace) *out<<"\nUsing second-order central finite differences ...\n";
494  break;
495  case DFDCT::FD_ORDER_TWO_AUTO:
496  if(out.get()&&trace) *out<<"\nUsing auto selection of some second-order finite difference method ...\n";
497  break;
498  case DFDCT::FD_ORDER_FOUR:
499  if(out.get()&&trace) *out<<"\nUsing one-sided, fourth-order finite differences ...\n";
500  break;
501  case DFDCT::FD_ORDER_FOUR_CENTRAL:
502  if(out.get()&&trace) *out<<"\nUsing fourth-order central finite differences ...\n";
503  break;
504  case DFDCT::FD_ORDER_FOUR_AUTO:
505  if(out.get()&&trace) *out<<"\nUsing auto selection of some fourth-order finite difference method ...\n";
506  break;
507  default:
508  TEUCHOS_TEST_FOR_EXCEPT(true); // Should not get here!
509  }
510 
511  // ////////////////////////
512  // Find the step size
513 
514  //
515  // Get defaults for the optimal step sizes
516  //
517 
518  const ScalarMag
519  sqrt_epsilon = SMT::squareroot(SMT::eps()),
520  u_optimal_1 = sqrt_epsilon,
521  u_optimal_2 = SMT::squareroot(sqrt_epsilon),
522  u_optimal_4 = SMT::squareroot(u_optimal_2);
523 
524  ScalarMag
525  bp_norm = SMT::zero();
526  // ToDo above: compute a reasonable norm somehow based on the base-point vector(s)!
527 
528  ScalarMag
529  uh_opt = 0.0;
530  switch(this->fd_method_type()) {
531  case DFDCT::FD_ORDER_ONE:
532  uh_opt = u_optimal_1 * ( fd_step_select_type() == DFDCT::FD_STEP_ABSOLUTE ? 1.0 : bp_norm + 1.0 );
533  break;
534  case DFDCT::FD_ORDER_TWO:
535  case DFDCT::FD_ORDER_TWO_CENTRAL:
536  case DFDCT::FD_ORDER_TWO_AUTO:
537  uh_opt = u_optimal_2 * ( fd_step_select_type() == DFDCT::FD_STEP_ABSOLUTE ? 1.0 : bp_norm + 1.0 );
538  break;
539  case DFDCT::FD_ORDER_FOUR:
540  case DFDCT::FD_ORDER_FOUR_CENTRAL:
541  case DFDCT::FD_ORDER_FOUR_AUTO:
542  uh_opt = u_optimal_4 * ( fd_step_select_type() == DFDCT::FD_STEP_ABSOLUTE ? 1.0 : bp_norm + 1.0 );
543  break;
544  default:
545  TEUCHOS_TEST_FOR_EXCEPT(true); // Should not get here!
546  }
547 
548  if(out.get()&&trace) *out<<"\nDefault optimal step length uh_opt = " << uh_opt << " ...\n";
549 
550  //
551  // Set the step sizes used.
552  //
553 
554  ScalarMag
555  uh = this->fd_step_size();
556 
557  if( uh < 0 )
558  uh = uh_opt;
559  else if( fd_step_select_type() == DFDCT::FD_STEP_RELATIVE )
560  uh *= (bp_norm + 1.0);
561 
562  if(out.get()&&trace) *out<<"\nStep size to be used uh="<<uh<<"\n";
563 
564  //
565  // Find step lengths that stay in bounds!
566  //
567 
568  // ToDo: Add logic for variable bounds when needed!
569 
570  //
571  // Set the actual method being used
572  //
573  // ToDo: Consider cramped bounds and method order.
574  //
575 
576  DFDCT::EFDMethodType l_fd_method_type = this->fd_method_type();
577  switch(l_fd_method_type) {
578  case DFDCT::FD_ORDER_TWO_AUTO:
579  l_fd_method_type = DFDCT::FD_ORDER_TWO_CENTRAL;
580  break;
581  case DFDCT::FD_ORDER_FOUR_AUTO:
582  l_fd_method_type = DFDCT::FD_ORDER_FOUR_CENTRAL;
583  break;
584  default:
585  break; // Okay
586  }
587 
588  //if(out.get()&&trace) *out<<"\nStep size to fit in bounds: uh="<<uh"\n";
589 
590  int p_saved = -1;
591  if(out.get())
592  p_saved = out->precision();
593 
594  // ///////////////////////////////////////////////
595  // Compute the directional derivatives
596 
597  const int Np = var.Np(), Ng = var.Ng();
598 
599  // Setup storage for perturbed variables
600  VectorPtr per_x, per_x_dot, per_x_dot_dot;
601  std::vector<VectorPtr> per_p(Np);
602  MEB::InArgs<Scalar> pp = model.createInArgs();
603  pp.setArgs(bp); // Set all args to start with
604  if( bp.supports(MEB::IN_ARG_x) ) {
605  if( dir.get_x().get() )
606  pp.set_x(per_x=createMember(model.get_x_space()));
607  else
608  pp.set_x(bp.get_x());
609  }
610  if( bp.supports(MEB::IN_ARG_x_dot) ) {
611  if( dir.get_x_dot().get() )
612  pp.set_x_dot(per_x_dot=createMember(model.get_x_space()));
613  else
614  pp.set_x_dot(bp.get_x_dot());
615  }
616  if( bp.supports(MEB::IN_ARG_x_dot_dot) ) {
617  if( dir.get_x_dot_dot().get() )
618  pp.set_x_dot_dot(per_x_dot_dot=createMember(model.get_x_space()));
619  else
620  pp.set_x_dot_dot(bp.get_x_dot_dot());
621  }
622  for( int l = 0; l < Np; ++l ) {
623  if( dir.get_p(l).get() )
624  pp.set_p(l,per_p[l]=createMember(model.get_p_space(l)));
625  else
626  pp.set_p(l,bp.get_p(l));
627  }
628  if(out.get() && trace)
629  *out
630  << "\nperturbedPoint after initial setup (with some uninitialized vectors) =\n"
631  << describe(pp,verbLevel);
632 
633  // Setup storage for perturbed functions
634  bool all_funcs_at_base_computed = true;
635  MEB::OutArgs<Scalar> pfunc = model.createOutArgs();
636  {
637  VectorPtr f;
638  if( var.supports(MEB::OUT_ARG_f) && (f=var.get_f()).get() ) {
639  pfunc.set_f(createMember(model.get_f_space()));
640  assign(f.ptr(),ST::zero());
641  if(!bfunc.get_f().get()) all_funcs_at_base_computed = false;
642  }
643  for( int j = 0; j < Ng; ++j ) {
644  VectorPtr g_j;
645  if( (g_j=var.get_g(j)).get() ) {
646  pfunc.set_g(j,createMember(model.get_g_space(j)));
647  assign(g_j.ptr(),ST::zero());
648  if(!bfunc.get_g(j).get()) all_funcs_at_base_computed = false;
649  }
650  }
651  }
652  if(out.get() && trace)
653  *out
654  << "\nperturbedFunctions after initial setup (with some uninitialized vectors) =\n"
655  << describe(pfunc,verbLevel);
656 
657  const int dbl_p = 15;
658  if(out.get())
659  *out << std::setprecision(dbl_p);
660 
661  //
662  // Compute the weighted sum of the terms
663  //
664 
665  int num_evals = 0;
666  ScalarMag dwgt = SMT::zero();
667  switch(l_fd_method_type) {
668  case DFDCT::FD_ORDER_ONE: // may only need one eval if f(xo) etc is passed in
669  num_evals = 2;
670  dwgt = ScalarMag(1.0);
671  break;
672  case DFDCT::FD_ORDER_TWO: // may only need two evals if c(xo) etc is passed in
673  num_evals = 3;
674  dwgt = ScalarMag(2.0);
675  break;
676  case DFDCT::FD_ORDER_TWO_CENTRAL:
677  num_evals = 2;
678  dwgt = ScalarMag(2.0);
679  break;
680  case DFDCT::FD_ORDER_FOUR:
681  num_evals = 5;
682  dwgt = ScalarMag(12.0);
683  break;
684  case DFDCT::FD_ORDER_FOUR_CENTRAL:
685  num_evals = 4;
686  dwgt = ScalarMag(12.0);
687  break;
688  default:
689  TEUCHOS_TEST_FOR_EXCEPT(true); // Should not get here!
690  }
691  for( int eval_i = 1; eval_i <= num_evals; ++eval_i ) {
692  // Set the step constant and the weighting constant
693  ScalarMag
694  uh_i = 0.0,
695  wgt_i = 0.0;
696  switch(l_fd_method_type) {
697  case DFDCT::FD_ORDER_ONE: {
698  switch(eval_i) {
699  case 1:
700  uh_i = +0.0;
701  wgt_i = -1.0;
702  break;
703  case 2:
704  uh_i = +1.0;
705  wgt_i = +1.0;
706  break;
707  }
708  break;
709  }
710  case DFDCT::FD_ORDER_TWO: {
711  switch(eval_i) {
712  case 1:
713  uh_i = +0.0;
714  wgt_i = -3.0;
715  break;
716  case 2:
717  uh_i = +1.0;
718  wgt_i = +4.0;
719  break;
720  case 3:
721  uh_i = +2.0;
722  wgt_i = -1.0;
723  break;
724  }
725  break;
726  }
727  case DFDCT::FD_ORDER_TWO_CENTRAL: {
728  switch(eval_i) {
729  case 1:
730  uh_i = -1.0;
731  wgt_i = -1.0;
732  break;
733  case 2:
734  uh_i = +1.0;
735  wgt_i = +1.0;
736  break;
737  }
738  break;
739  }
740  case DFDCT::FD_ORDER_FOUR: {
741  switch(eval_i) {
742  case 1:
743  uh_i = +0.0;
744  wgt_i = -25.0;
745  break;
746  case 2:
747  uh_i = +1.0;
748  wgt_i = +48.0;
749  break;
750  case 3:
751  uh_i = +2.0;
752  wgt_i = -36.0;
753  break;
754  case 4:
755  uh_i = +3.0;
756  wgt_i = +16.0;
757  break;
758  case 5:
759  uh_i = +4.0;
760  wgt_i = -3.0;
761  break;
762  }
763  break;
764  }
765  case DFDCT::FD_ORDER_FOUR_CENTRAL: {
766  switch(eval_i) {
767  case 1:
768  uh_i = -2.0;
769  wgt_i = +1.0;
770  break;
771  case 2:
772  uh_i = -1.0;
773  wgt_i = -8.0;
774  break;
775  case 3:
776  uh_i = +1.0;
777  wgt_i = +8.0;
778  break;
779  case 4:
780  uh_i = +2.0;
781  wgt_i = -1.0;
782  break;
783  }
784  break;
785  }
786  case DFDCT::FD_ORDER_TWO_AUTO:
787  case DFDCT::FD_ORDER_FOUR_AUTO:
788  break; // Okay
789  default:
791  }
792 
793  if(out.get() && trace)
794  *out << "\neval_i="<<eval_i<<", uh_i="<<uh_i<<", wgt_i="<<wgt_i<<"\n";
795  Teuchos::OSTab tab2(out);
796 
797  // Compute the weighted term and add it to the sum
798  if(uh_i == ST::zero()) {
799  MEB::OutArgs<Scalar> bfuncall;
800  if(!all_funcs_at_base_computed) {
801  // Compute missing functions at the base point
802  bfuncall = model.createOutArgs();
803  if( pfunc.supports(MEB::OUT_ARG_f) && pfunc.get_f().get() && !bfunc.get_f().get() ) {
804  bfuncall.set_f(createMember(model.get_f_space()));
805  }
806  for( int j = 0; j < Ng; ++j ) {
807  if( pfunc.get_g(j).get() && !bfunc.get_g(j).get() ) {
808  bfuncall.set_g(j,createMember(model.get_g_space(j)));
809  }
810  }
811  model.evalModel(bp,bfuncall);
812  bfuncall.setArgs(bfunc);
813  }
814  else {
815  bfuncall = bfunc;
816  }
817  // Use functions at the base point
818  if(out.get() && trace)
819  *out << "\nSetting variations = wgt_i * basePoint ...\n";
820  VectorPtr f;
821  if( pfunc.supports(MEB::OUT_ARG_f) && (f=var.get_f()).get() ) {
822  V_StV<Scalar>(f.ptr(), wgt_i, *bfuncall.get_f());
823  }
824  for( int j = 0; j < Ng; ++j ) {
825  VectorPtr g_j;
826  if( (g_j=var.get_g(j)).get() ) {
827  V_StV<Scalar>(g_j.ptr(), wgt_i, *bfuncall.get_g(j));
828  }
829  }
830  }
831  else {
832  if(out.get() && trace)
833  *out << "\nSetting perturbedPoint = basePoint + uh_i*uh*direction ...\n";
834  // z = zo + uh_i*uh*v
835  {
836  if ( dir.supports(MEB::IN_ARG_x) && dir.get_x().get() )
837  V_StVpV(per_x.ptr(),as<Scalar>(uh_i*uh),*dir.get_x(),*bp.get_x());
838  if ( dir.supports(MEB::IN_ARG_x_dot) && dir.get_x_dot().get() )
839  V_StVpV(per_x_dot.ptr(), as<Scalar>(uh_i*uh), *dir.get_x_dot(), *bp.get_x_dot());
840  if ( dir.supports(MEB::IN_ARG_x_dot_dot) && dir.get_x_dot_dot().get() )
841  V_StVpV(per_x_dot_dot.ptr(), as<Scalar>(uh_i*uh), *dir.get_x_dot_dot(), *bp.get_x_dot_dot());
842  for ( int l = 0; l < Np; ++l ) {
843  if( dir.get_p(l).get() )
844  V_StVpV(per_p[l].ptr(), as<Scalar>(uh_i*uh), *dir.get_p(l), *bp.get_p(l));
845  }
846  }
847  if(out.get() && trace)
848  *out << "\nperturbedPoint=\n" << describe(pp,verbLevel);
849  // Compute perturbed function values h(zo+uh_i*uh)
850  if(out.get() && trace)
851  *out << "\nCompute perturbedFunctions at perturbedPoint...\n";
852  model.evalModel(pp,pfunc);
853  if(out.get() && trace)
854  *out << "\nperturbedFunctions=\n" << describe(pfunc,verbLevel);
855  // Sum perturbed function values into total variation
856  {
857  // var_h += wgt_i*perturbed_h
858  if(out.get() && trace)
859  *out << "\nComputing variations += wgt_i*perturbedfunctions ...\n";
860  VectorPtr f;
861  if( pfunc.supports(MEB::OUT_ARG_f) && (f=pfunc.get_f()).get() )
862  Vp_StV<Scalar>(var.get_f().ptr(), wgt_i, *f);
863  for( int j = 0; j < Ng; ++j ) {
864  VectorPtr g_j;
865  if( (g_j=pfunc.get_g(j)).get() )
866  Vp_StV<Scalar>(var.get_g(j).ptr(), wgt_i, *g_j);
867  }
868  }
869  }
870  if(out.get() && trace)
871  *out << "\nvariations=\n" << describe(var,verbLevel);
872  }
873 
874  //
875  // Multiply by the scaling factor!
876  //
877 
878  {
879  // var_h *= 1.0/(dwgt*uh)
880  const Scalar alpha = ST::one()/(dwgt*uh);
881  if(out.get() && trace)
882  *out
883  << "\nComputing variations *= (1.0)/(dwgt*uh),"
884  << " where (1.0)/(dwgt*uh) = (1.0)/("<<dwgt<<"*"<<uh<<") = "<<alpha<<" ...\n";
885  VectorPtr f;
886  if( var.supports(MEB::OUT_ARG_f) && (f=var.get_f()).get() )
887  Vt_S(f.ptr(),alpha);
888  for( int j = 0; j < Ng; ++j ) {
889  VectorPtr g_j;
890  if( (g_j=var.get_g(j)).get() )
891  Vt_S(g_j.ptr(),alpha);
892  }
893  if(out.get() && trace)
894  *out << "\nFinal variations=\n" << describe(var,verbLevel);
895  }
896 
897  if(out.get())
898  *out << std::setprecision(p_saved);
899 
900  if(out.get() && trace)
901  *out << "\nLeaving DirectionalFiniteDiffCalculator<Scalar>::calcVariations(...)\n";
902 
903 }
904 
905 
906 template<class Scalar>
908  const ModelEvaluator<Scalar> &model,
909  const ModelEvaluatorBase::InArgs<Scalar> &bp, // basePoint
910  const ModelEvaluatorBase::OutArgs<Scalar> &bfunc, // baseFunctionValues
911  const ModelEvaluatorBase::OutArgs<Scalar> &deriv // derivatives
912  ) const
913 {
914 
915  using std::string;
916  //typedef Teuchos::ScalarTraits<Scalar> ST;
917 
918  THYRA_FUNC_TIME_MONITOR(
919  string("Thyra::DirectionalFiniteDiffCalculator<")+ST::name()+">::calcDerivatives(...)"
920  );
921 
922  typedef ModelEvaluatorBase MEB;
923  typedef RCP<VectorBase<Scalar> > VectorPtr;
924  typedef RCP<MultiVectorBase<Scalar> > MultiVectorPtr;
925 
926  RCP<Teuchos::FancyOStream> out = this->getOStream();
927  Teuchos::EVerbosityLevel verbLevel = this->getVerbLevel();
928  const bool trace = (static_cast<int>(verbLevel) >= static_cast<int>(Teuchos::VERB_MEDIUM));
929  Teuchos::OSTab tab(out);
930 
931  if(out.get() && trace)
932  *out << "\nEntering DirectionalFiniteDiffCalculator<Scalar>::calcDerivatives(...)\n";
933 
934  if(out.get() && trace)
935  *out
936  << "\nbasePoint=\n" << describe(bp,verbLevel)
937  << "\nbaseFunctionValues=\n" << describe(bfunc,verbLevel)
938  << "\nderivatives=\n" << describe(deriv,Teuchos::VERB_LOW);
939 
940  //
941  // We will only compute finite differences w.r.t. p(l) for now
942  //
943  const int Np = bp.Np(), Ng = bfunc.Ng();
944  MEB::InArgs<Scalar> dir = model.createInArgs();
945  MEB::OutArgs<Scalar> var = model.createOutArgs();
946  MultiVectorPtr DfDp_l;
947  std::vector<MEB::DerivativeMultiVector<Scalar> > DgDp_l(Ng);
948  std::vector<VectorPtr> var_g(Ng);
949  for( int l = 0; l < Np; ++l ) {
950  if(out.get() && trace)
951  *out << "\nComputing derivatives for parameter subvector p("<<l<<") ...\n";
952  Teuchos::OSTab tab2(out);
953  //
954  // Load up OutArgs var object of derivative variations to compute
955  //
956  bool hasDerivObject = false;
957  // DfDp(l)
958  if (
959  !deriv.supports(MEB::OUT_ARG_DfDp,l).none()
960  && !deriv.get_DfDp(l).isEmpty()
961  )
962  {
963  hasDerivObject = true;
964  std::ostringstream name; name << "DfDp("<<l<<")";
965  DfDp_l = get_mv(deriv.get_DfDp(l),name.str(),MEB::DERIV_MV_BY_COL);
966  }
967  else {
968  DfDp_l = Teuchos::null;
969  }
970  // DgDp(j=1...Ng,l)
971  for ( int j = 0; j < Ng; ++j ) {
972  if (
973  !deriv.supports(MEB::OUT_ARG_DgDp,j,l).none()
974  &&
975  !deriv.get_DgDp(j,l).isEmpty()
976  )
977  {
978  hasDerivObject = true;
979  std::ostringstream name; name << "DgDp("<<j<<","<<l<<")";
980  DgDp_l[j] = get_dmv(deriv.get_DgDp(j,l),name.str());
981  if( DgDp_l[j].getMultiVector().get() && !var_g[j].get() )
982  {
983  // Need a temporary vector for the variation for g(j)
984  var_g[j] = createMember(model.get_g_space(j));
985  }
986  }
987  else{
988  DgDp_l[j] = MEB::DerivativeMultiVector<Scalar>();
989  var_g[j] = Teuchos::null;
990  }
991  }
992  //
993  // Compute derivative variations by finite differences
994  //
995  if (hasDerivObject) {
996  VectorPtr e_i = createMember(model.get_p_space(l));
997  dir.set_p(l,e_i);
998  assign(e_i.ptr(),ST::zero());
999  const int np_l = e_i->space()->dim();
1000  for( int i = 0 ; i < np_l; ++ i ) {
1001  if(out.get() && trace)
1002  *out << "\nComputing derivatives for single variable p("<<l<<")("<<i<<") ...\n";
1003  Teuchos::OSTab tab3(out);
1004  if(DfDp_l.get()) var.set_f(DfDp_l->col(i)); // Compute DfDp(l)(i) in place!
1005  for(int j = 0; j < Ng; ++j) {
1006  MultiVectorPtr DgDp_j_l;
1007  if( (DgDp_j_l=DgDp_l[j].getMultiVector()).get() ) {
1008  var.set_g(j,var_g[j]); // Computes d(g(j))/d(p(l)(i))
1009  }
1010  }
1011  set_ele(i,ST::one(),e_i.ptr());
1012  this->calcVariations(
1013  model,bp,dir,bfunc,var
1014  );
1015  set_ele(i,ST::zero(),e_i.ptr());
1016  if (DfDp_l.get()) var.set_f(Teuchos::null);
1017  for (int j = 0; j < Ng; ++j) {
1018  MultiVectorPtr DgDp_j_l;
1019  if ( !is_null(DgDp_j_l=DgDp_l[j].getMultiVector()) ) {
1020  assign( DgDp_j_l->col(i).ptr(), *var_g[j] );
1021  }
1022  }
1023  }
1024  dir.set_p(l,Teuchos::null);
1025  }
1026  }
1027 
1028  if(out.get() && trace)
1029  *out
1030  << "\nderivatives=\n" << describe(deriv,verbLevel);
1031 
1032  if(out.get() && trace)
1033  *out << "\nLeaving DirectionalFiniteDiffCalculator<Scalar>::calcDerivatives(...)\n";
1034 
1035 }
1036 
1037 
1038 } // namespace Thyra
1039 
1040 
1041 #endif // THYRA_DIRECTIONAL_FINITE_DIFF_CALCULATOR_DEF_HPP
Thyra::ModelEvaluatorBase::OutArgs::get_g
Evaluation< VectorBase< Scalar > > get_g(int j) const
Precondition: supports(OUT_ARG_g)==true..
Definition: Thyra_ModelEvaluatorBase_def.hpp:919
is_null
bool is_null(const boost::shared_ptr< T > &p)
as
TypeTo as(const TypeFrom &t)
Thyra::ModelEvaluatorBase::InArgs::get_x_dot
RCP< const VectorBase< Scalar > > get_x_dot() const
Precondition: supports(IN_ARG_x_dot)==true.
Definition: Thyra_ModelEvaluatorBase_def.hpp:152
Thyra::ModelEvaluatorBase::ModelEvaluatorBase
ModelEvaluatorBase()
constructor
Definition: Thyra_ModelEvaluatorBase.cpp:50
Thyra::ModelEvaluatorBase::InArgs::get_x_dot_dot
RCP< const VectorBase< Scalar > > get_x_dot_dot() const
Precondition: supports(IN_ARG_x_dot_dot)==true.
Definition: Thyra_ModelEvaluatorBase_def.hpp:140
TEUCHOS_TEST_FOR_EXCEPT
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
Thyra::ModelEvaluator::createOutArgs
virtual ModelEvaluatorBase::OutArgs< Scalar > createOutArgs() const =0
Create an empty output functions/derivatives object that can be set up and passed to evalModel().
Thyra::ModelEvaluatorBase::OutArgs::get_f
Evaluation< VectorBase< Scalar > > get_f() const
Precondition: supports(OUT_ARG_f)==true.
Definition: Thyra_ModelEvaluatorBase_def.hpp:900
Thyra::ModelEvaluator::get_x_space
virtual RCP< const VectorSpaceBase< Scalar > > get_x_space() const =0
Return the vector space for the state variables x <: RE^n_x.
Teuchos::ParameterEntryValidator
Thyra::DirectionalFiniteDiffCalculator::calcDerivatives
void calcDerivatives(const ModelEvaluator< Scalar > &model, const ModelEvaluatorBase::InArgs< Scalar > &basePoint, const ModelEvaluatorBase::OutArgs< Scalar > &baseFunctionValues, const ModelEvaluatorBase::OutArgs< Scalar > &derivatives) const
Compute entire derivative objects using finite differences.
Definition: Thyra_DirectionalFiniteDiffCalculator_def.hpp:907
VERB_LOW
VERB_LOW
Thyra::DirectionalFiniteDiffCalculator::EFDStepSelectType
DirectionalFiniteDiffCalculatorTypes::EFDStepSelectType EFDStepSelectType
Definition: Thyra_DirectionalFiniteDiffCalculator_decl.hpp:148
Thyra::ModelEvaluatorBase::OutArgs::Np
int Np() const
Return the number of parameter subvectors p(l) supported (Np >= 0).
Definition: Thyra_ModelEvaluatorBase_def.hpp:764
Thyra::ModelEvaluatorBase::InArgs::supports
bool supports(EInArgsMembers arg) const
Determines if an input argument is supported or not.
Definition: Thyra_ModelEvaluatorBase_def.hpp:115
Teuchos::rcp
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Teuchos::EVerbosityLevel
EVerbosityLevel
Teuchos::RCP
Thyra::ModelEvaluatorBase::OutArgs
Concrete aggregate class for all output arguments computable by a ModelEvaluator subclass object.
Definition: Thyra_ModelEvaluatorBase_decl.hpp:787
Thyra::ModelEvaluator::evalModel
virtual void evalModel(const ModelEvaluatorBase::InArgs< Scalar > &inArgs, const ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const =0
Compute all of the requested functions/derivatives at the given point.
Thyra::ModelEvaluatorBase::OutArgs::get_DfDp
Derivative< Scalar > get_DfDp(int l) const
Precondition: supports(OUT_ARG_DfDp,l)==true.
Definition: Thyra_ModelEvaluatorBase_def.hpp:1061
Thyra::ModelEvaluatorBase::OutArgs::get_DgDp
Derivative< Scalar > get_DgDp(int j, int l) const
Precondition: supports(OUT_ARG_DgDp,j,l)==true.
Definition: Thyra_ModelEvaluatorBase_def.hpp:1229
Thyra::ModelEvaluator::createInArgs
virtual ModelEvaluatorBase::InArgs< Scalar > createInArgs() const =0
Create an empty input arguments object that can be set up and passed to evalModel().
Teuchos::ParameterList::set
ParameterList & set(std::string const &name, T const &value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
Thyra::DirectionalFiniteDiffCalculator::EFDMethodType
DirectionalFiniteDiffCalculatorTypes::EFDMethodType EFDMethodType
Definition: Thyra_DirectionalFiniteDiffCalculator_decl.hpp:146
VERB_MEDIUM
VERB_MEDIUM
Thyra::ModelEvaluator::get_f_space
virtual RCP< const VectorSpaceBase< Scalar > > get_f_space() const =0
Return the vector space for the state function f(...) <: RE^n_x.
Teuchos::ParameterList::validateParameters
void validateParameters(ParameterList const &validParamList, int const depth=1000, EValidateUsed const validateUsed=VALIDATE_USED_ENABLED, EValidateDefaults const validateDefaults=VALIDATE_DEFAULTS_ENABLED) const
Thyra::ModelEvaluatorBase::OutArgs::isEmpty
bool isEmpty() const
Definition: Thyra_ModelEvaluatorBase_def.hpp:1458
Thyra::ModelEvaluatorBase::InArgs::get_x
RCP< const VectorBase< Scalar > > get_x() const
Precondition: supports(IN_ARG_x)==true.
Definition: Thyra_ModelEvaluatorBase_def.hpp:165
Thyra::DirectionalFiniteDiffCalculator::getParameterList
RCP< const ParameterList > getParameterList() const
Definition: Thyra_DirectionalFiniteDiffCalculator_def.hpp:363
Thyra::ModelEvaluatorBase::InArgs::get_p
RCP< const VectorBase< Scalar > > get_p(int l) const
Get p(l) where 0 <= l && l < this->Np().
Definition: Thyra_ModelEvaluatorBase_def.hpp:234
Thyra::ModelEvaluator
Pure abstract base interface for evaluating a stateless "model" that can be mapped into a number of d...
Definition: Thyra_ModelEvaluator.hpp:698
Teuchos::ParameterList::getIntegralValue
IntegralType getIntegralValue(ParameterList const &paramList, std::string const &paramName)
Thyra::DirectionalFiniteDiffCalculator::calcVariations
void calcVariations(const ModelEvaluator< Scalar > &model, const ModelEvaluatorBase::InArgs< Scalar > &basePoint, const ModelEvaluatorBase::InArgs< Scalar > &directions, const ModelEvaluatorBase::OutArgs< Scalar > &baseFunctionValues, const ModelEvaluatorBase::OutArgs< Scalar > &variations) const
Compute variations using directional finite differences..
Definition: Thyra_DirectionalFiniteDiffCalculator_def.hpp:412
Thyra::ModelEvaluator::get_p_space
virtual RCP< const VectorSpaceBase< Scalar > > get_p_space(int l) const =0
Return the vector space for the auxiliary parameters p(l) <: RE^n_p_l.
Thyra::DirectionalFiniteDiffCalculator::ScalarMag
ST::magnitudeType ScalarMag
Definition: Thyra_DirectionalFiniteDiffCalculator_decl.hpp:142
Thyra::ModelEvaluatorBase::InArgs
Concrete aggregate class for all input arguments computable by a ModelEvaluator subclass object.
Definition: Thyra_ModelEvaluatorBase_decl.hpp:159
Thyra::ModelEvaluatorDefaultBase::Ng
int Ng() const
Definition: Thyra_ModelEvaluatorDefaultBase.hpp:387
Teuchos::StringToIntegralParameterEntryValidator
Thyra::DirectionalFiniteDiffCalculator::getNonconstParameterList
RCP< ParameterList > getNonconstParameterList()
Definition: Thyra_DirectionalFiniteDiffCalculator_def.hpp:345
Thyra::DirectionalFiniteDiffCalculator::unsetParameterList
RCP< ParameterList > unsetParameterList()
Definition: Thyra_DirectionalFiniteDiffCalculator_def.hpp:353
Thyra::ModelEvaluator::get_g_space
virtual RCP< const VectorSpaceBase< Scalar > > get_g_space(int j) const =0
Return the vector space for the auxiliary response functions g(j) <: RE^n_g_j.
Teuchos::basic_OSTab
Teuchos::RCP::get
T * get() const
Thyra::ModelEvaluatorBase
Base subclass for ModelEvaluator that defines some basic types.
Definition: Thyra_ModelEvaluatorBase_decl.hpp:83
Thyra::DirectionalFiniteDiffCalculator::DirectionalFiniteDiffCalculator
DirectionalFiniteDiffCalculator(EFDMethodType fd_method_type=DirectionalFiniteDiffCalculatorTypes::FD_ORDER_FOUR_AUTO, EFDStepSelectType fd_step_select_type=DirectionalFiniteDiffCalculatorTypes::FD_STEP_ABSOLUTE, ScalarMag fd_step_size=-1.0, ScalarMag fd_step_size_min=-1.0)
Definition: Thyra_DirectionalFiniteDiffCalculator_def.hpp:309
Thyra::DirectionalFiniteDiffCalculator::createOutArgs
ModelEvaluatorBase::OutArgs< Scalar > createOutArgs(const ModelEvaluator< Scalar > &model, const SelectedDerivatives &fdDerivatives)
Create an augmented out args object for holding finite difference objects.
Definition: Thyra_DirectionalFiniteDiffCalculator_def.hpp:401
Thyra::ModelEvaluatorBase::InArgs::Np
int Np() const
Return the number of parameter subvectors p(l) supported (Np >= 0).
Definition: Thyra_ModelEvaluatorBase_def.hpp:111
Thyra::DirectionalFiniteDiffCalculator::getValidParameters
RCP< const ParameterList > getValidParameters() const
Definition: Thyra_DirectionalFiniteDiffCalculator_def.hpp:371
Thyra::DirectionalFiniteDiffCalculatorTypes::SelectedDerivatives
Simple utility class used to select finite difference derivatives for OutArgs object.
Definition: Thyra_DirectionalFiniteDiffCalculator_decl.hpp:86
TEUCHOS_TEST_FOR_EXCEPTION
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Thyra::ModelEvaluatorBase::OutArgs::supports
bool supports(EOutArgsMembers arg) const
Determine if an input argument is supported or not.
Definition: Thyra_ModelEvaluatorBase_def.hpp:774
Thyra::ModelEvaluatorDefaultBase::Np
int Np() const
Definition: Thyra_ModelEvaluatorDefaultBase.hpp:379
Thyra::ModelEvaluatorBase::OutArgs::Ng
int Ng() const
Return the number of axillary response functions g(j)(...) supported (Ng >= 0).
Definition: Thyra_ModelEvaluatorBase_def.hpp:769
TEUCHOS_UNREACHABLE_RETURN
#define TEUCHOS_UNREACHABLE_RETURN(dummyReturnVal)
Thyra::DirectionalFiniteDiffCalculator::setParameterList
void setParameterList(RCP< ParameterList > const &paramList)
Definition: Thyra_DirectionalFiniteDiffCalculator_def.hpp:326