Thyra Version of the Day
Loading...
Searching...
No Matches
Thyra_DefaultModelEvaluatorWithSolveFactory.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_DEFAULT_MODEL_EVALUATOR_WITH_SOLVE_FACTORY_HPP
43#define THYRA_DEFAULT_MODEL_EVALUATOR_WITH_SOLVE_FACTORY_HPP
44
45
46#include "Thyra_ModelEvaluatorDelegatorBase.hpp"
47#include "Thyra_LinearOpWithSolveFactoryHelpers.hpp"
48#include "Teuchos_Time.hpp"
49
50
51namespace Thyra {
52
53
62template<class Scalar>
64 : virtual public ModelEvaluatorDelegatorBase<Scalar>
65{
66public:
67
70
73
76 const RCP<ModelEvaluator<Scalar> > &thyraModel,
78 );
79
81 void initialize(
82 const RCP<ModelEvaluator<Scalar> > &thyraModel,
84 );
85
87 void uninitialize(
88 RCP<ModelEvaluator<Scalar> > *thyraModel = NULL,
90 );
91
93
96
98 std::string description() const;
99
101
104
107
109
112
115
117
118private:
119
122
124 ModelEvaluatorBase::OutArgs<Scalar> createOutArgsImpl() const;
126 void evalModelImpl(
129 ) const;
130
132
133private:
134
136
137};
138
139
140// /////////////////////////////////
141// Implementations
142
143
144// Constructors/initializers/accessors/utilities
145
146
147template<class Scalar>
149{}
150
151
152template<class Scalar>
154 const RCP<ModelEvaluator<Scalar> > &thyraModel,
156 )
157{
158 initialize(thyraModel,W_factory);
159}
160
161
162template<class Scalar>
164 const RCP<ModelEvaluator<Scalar> > &thyraModel,
166 )
167{
169 W_factory_ = W_factory;
170}
171
172
173template<class Scalar>
175 RCP<ModelEvaluator<Scalar> > *thyraModel,
177 )
178{
179 if(thyraModel) *thyraModel = this->getUnderlyingModel();
180 if(W_factory) *W_factory = W_factory_;
182 W_factory_ = Teuchos::null;
183}
184
185
186// Public functions overridden from Teuchos::Describable
187
188
189template<class Scalar>
191{
193 thyraModel = this->getUnderlyingModel();
194 std::ostringstream oss;
195 oss << "Thyra::DefaultModelEvaluatorWithSolveFactory{";
196 oss << "thyraModel=";
197 if(thyraModel.get())
198 oss << "\'"<<thyraModel->description()<<"\'";
199 else
200 oss << "NULL";
201 oss << ",W_factory=";
202 if(W_factory_.get())
203 oss << "\'"<<W_factory_->description()<<"\'";
204 else
205 oss << "NULL";
206 oss << "}";
207 return oss.str();
208}
209
210
211// Overridden from ModelEvaluator.
212
213
214template<class Scalar>
217{
219 W_factory_.get()==NULL, std::logic_error
220 ,"Thyra::DefaultModelEvaluatorWithSolveFactory<Scalar>::create_W(): "
221 "Error, the client did not set a LinearOpWithSolveFactoryBase object for W!"
222 );
223 W_factory_->setOStream(this->getOStream());
224 W_factory_->setVerbLevel(this->getVerbLevel());
225 return W_factory_->createOp();
226}
227
228
229// Overridden from ModelEvaluatorDelegatorBase.
230
231
232template<class Scalar>
235{
236 return W_factory_;
237}
238
239
240// Private functions overridden from ModelEvaluatorDefaultBase.
241
242
243template<class Scalar>
246{
247 typedef ModelEvaluatorBase MEB;
249 thyraModel = this->getUnderlyingModel();
250 const MEB::OutArgs<Scalar> wrappedOutArgs = thyraModel->createOutArgs();
251 MEB::OutArgsSetup<Scalar> outArgs;
252 outArgs.setModelEvalDescription(this->description());
253 outArgs.set_Np_Ng(wrappedOutArgs.Np(),wrappedOutArgs.Ng());
254 outArgs.setSupports(wrappedOutArgs);
255 outArgs.setSupports(MEB::OUT_ARG_W,
256 wrappedOutArgs.supports(MEB::OUT_ARG_W_op)&&W_factory_.get()!=NULL);
257 return outArgs;
258}
259
260
261template<class Scalar>
262void DefaultModelEvaluatorWithSolveFactory<Scalar>::evalModelImpl(
263 const ModelEvaluatorBase::InArgs<Scalar> &inArgs,
264 const ModelEvaluatorBase::OutArgs<Scalar> &outArgs
265 ) const
266{
267 typedef ModelEvaluatorBase MEB;
268 using Teuchos::rcp;
269 using Teuchos::rcp_const_cast;
270 using Teuchos::rcp_dynamic_cast;
271 using Teuchos::OSTab;
272
273 THYRA_MODEL_EVALUATOR_DECORATOR_EVAL_MODEL_BEGIN(
274 "Thyra::DefaultModelEvaluatorWithSolveFactory",inArgs,outArgs
275 );
276
277 Teuchos::Time timer("");
278
280 VOTSLOWSF;
281 VOTSLOWSF W_factory_outputTempState(W_factory_,out,verbLevel);
282
283 // InArgs
284
285 MEB::InArgs<Scalar> wrappedInArgs = thyraModel->createInArgs();
286
287 wrappedInArgs.setArgs(inArgs,true);
288
289 // OutArgs
290
291 MEB::OutArgs<Scalar> wrappedOutArgs = thyraModel->createOutArgs();
292
293 wrappedOutArgs.setArgs(outArgs,true);
294
295 RCP<LinearOpWithSolveBase<Scalar> > W;
296 RCP<const LinearOpBase<Scalar> > fwdW;
297 if( outArgs.supports(MEB::OUT_ARG_W) && (W = outArgs.get_W()).get() ) {
298 Thyra::uninitializeOp<Scalar>(*W_factory_, W.ptr(), outArg(fwdW));
299
300 {
301 // Handle this case later if we need to!
302 const bool both_W_and_W_op_requested = nonnull(outArgs.get_W_op());
303 TEUCHOS_TEST_FOR_EXCEPT(both_W_and_W_op_requested);
304 }
305
306 RCP<LinearOpBase<Scalar> > nonconst_fwdW;
307 if(fwdW.get()) {
308 nonconst_fwdW = rcp_const_cast<LinearOpBase<Scalar> >(fwdW);
309 }
310 else {
311 nonconst_fwdW = thyraModel->create_W_op();
312 fwdW = nonconst_fwdW;
313 }
314
315 wrappedOutArgs.set_W_op(nonconst_fwdW);
316 }
317
318 // Do the evaluation
319
320 if(out.get() && includesVerbLevel(verbLevel,Teuchos::VERB_LOW))
321 *out << "\nEvaluating the output functions on model \'"
322 << thyraModel->description() << "\' ...\n";
323 timer.start(true);
324
325 thyraModel->evalModel(wrappedInArgs,wrappedOutArgs);
326
327 timer.stop();
328 if(out.get() && includesVerbLevel(verbLevel,Teuchos::VERB_LOW))
329 OSTab(out).o() << "\nTime to evaluate underlying model = "
330 << timer.totalElapsedTime()<<" sec\n";
331
332 // Postprocess arguments
333
334 if(out.get() && includesVerbLevel(verbLevel,Teuchos::VERB_LOW))
335 *out << "\nPost processing the output objects ...\n";
336 timer.start(true);
337
338 if( W.get() ) {
339 Thyra::initializeOp<Scalar>(*W_factory_, fwdW, W.ptr());
340 W->setVerbLevel(this->getVerbLevel());
341 W->setOStream(this->getOStream());
342 }
343
344 timer.stop();
345 if(out.get() && includesVerbLevel(verbLevel,Teuchos::VERB_LOW))
346 OSTab(out).o() << "\nTime to process output objects = "
347 << timer.totalElapsedTime()<<" sec\n";
348
349 THYRA_MODEL_EVALUATOR_DECORATOR_EVAL_MODEL_END();
350
351}
352
353
354} // namespace Thyra
355
356
357#endif // THYRA_DEFAULT_MODEL_EVALUATOR_WITH_SOLVE_FACTORY_HPP
T * get() const
This class wraps any ModelEvaluator object and uses a compatible LinearOpWithSolveFactory object to c...
void initialize(const RCP< ModelEvaluator< Scalar > > &thyraModel, const RCP< LinearOpWithSolveFactoryBase< Scalar > > &W_factory)
RCP< const LinearOpWithSolveFactoryBase< Scalar > > get_W_factory() const
Factory interface for creating LinearOpWithSolveBase objects from compatible LinearOpBase objects.
Concrete aggregate class for all input arguments computable by a ModelEvaluator subclass object.
Concrete aggregate class for all output arguments computable by a ModelEvaluator subclass object.
Base subclass for ModelEvaluator that defines some basic types.
This is a base class that delegetes almost all function to a wrapped model evaluator object.
void initialize(const RCP< ModelEvaluator< Scalar > > &model)
Initialize given a non-const model evaluator.
Pure abstract base interface for evaluating a stateless "model" that can be mapped into a number of d...
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
basic_OSTab< char > OSTab
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
TEUCHOSCORE_LIB_DLL_EXPORT bool includesVerbLevel(const EVerbosityLevel verbLevel, const EVerbosityLevel requestedVerbLevel, const bool isDefaultLevel=false)