Thyra Package Browser (Single Doxygen Collection) Version of the Day
Loading...
Searching...
No Matches
Simple2DTpetraModelEvaluator_UnitTests.cpp
Go to the documentation of this file.
1/*
2// @HEADER
3// ***********************************************************************
4//
5// Thyra: Interfaces and Support for Abstract Numerical Algorithms
6// Copyright (2004) Sandia Corporation
7//
8// Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
9// license for use of this work by or on behalf of the U.S. Government.
10//
11// Redistribution and use in source and binary forms, with or without
12// modification, are permitted provided that the following conditions are
13// met:
14//
15// 1. Redistributions of source code must retain the above copyright
16// notice, this list of conditions and the following disclaimer.
17//
18// 2. Redistributions in binary form must reproduce the above copyright
19// notice, this list of conditions and the following disclaimer in the
20// documentation and/or other materials provided with the distribution.
21//
22// 3. Neither the name of the Corporation nor the names of the
23// contributors may be used to endorse or promote products derived from
24// this software without specific prior written permission.
25//
26// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
27// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
30// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37//
38// Questions? Contact Roscoe A. Bartlett (bartlettra@ornl.gov)
39//
40// ***********************************************************************
41// @HEADER
42*/
43
44
46
48
49
50namespace {
51
52
53using Teuchos::null;
54using Teuchos::RCP;
55typedef Thyra::ModelEvaluatorBase MEB;
56
57
58//
59// Unit tests
60//
61
62
64{
65 RCP<Simple2DTpetraModelEvaluator<Scalar> > model = simple2DTpetraModelEvaluator<Scalar>();
66 TEST_ASSERT(model != null);
67 TEST_EQUALITY(model->Np(), 0);
68 TEST_EQUALITY(model->Ng(), 0);
69 TEST_ASSERT(model->get_x_space() != null);
70 TEST_EQUALITY(model->get_x_space()->dim(), 2);
71 TEST_ASSERT(model->get_f_space() != null);
72 TEST_EQUALITY(model->get_f_space()->dim(), 2);
73 TEST_ASSERT(nonnull(model->getNominalValues().get_x()));
74 TEST_ASSERT(model->create_W_op() != null);
75 //TEST_ASSERT(model->get_W_factory() != null);
76 MEB::InArgs<Scalar> inArgs = model->createInArgs();
77 TEST_ASSERT(inArgs.supports(MEB::IN_ARG_x));
78 TEST_EQUALITY(inArgs.Np(), 0);
79}
80
81#if !defined(HAVE_TPETRA_EXPLICIT_INSTANTIATION) || defined(HAVE_TPETRA_INST_DOUBLE)
84#endif
85
86#if !defined(HAVE_TPETRA_EXPLICIT_INSTANTIATION) || defined(HAVE_TPETRA_INST_FLOAT)
89#endif
90
91
93{
94 using Thyra::LinearOpBase;
95 using Thyra::VectorBase;
98 using Teuchos::as;
99 using Teuchos::rcp_dynamic_cast;
100 using Teuchos::tuple;
102 typedef Tpetra::Map<>::local_ordinal_type LO;
104 typedef typename ST::magnitudeType ScalarMag;
106
107 RCP<Simple2DTpetraModelEvaluator<Scalar> > model = simple2DTpetraModelEvaluator<Scalar>();
108
109 const Scalar d = 7.0;
110 model->set_d(d);
111
112 const Scalar p_0 = 2.0, p_1 = 6.0;
113 model->set_p(tuple<Scalar>(p_0, p_1));
114
115 const Scalar x_0 = 3.0, x_1 = 4.0;
116 model->set_x0(tuple<Scalar>(x_0, x_1));
117
118 MEB::InArgs<Scalar> inArgs = model->getNominalValues();
119 MEB::OutArgs<Scalar> outArgs = model->createOutArgs();
120 const RCP<VectorBase<Scalar> > f = createMember(model->get_f_space());
121 const RCP<LinearOpBase<Scalar> > W_op = model->create_W_op();
122 outArgs.set_f(f);
123 outArgs.set_W_op(W_op);
124 model->evalModel(inArgs, outArgs);
125
126 const ScalarMag tol = 100.0 * SMT::eps();
127
128 const RCP<const Tpetra::Vector<Scalar> > f_tpetra =
129 ConverterT::getConstTpetraVector(f);
130
131 const ArrayRCP<const Scalar> f_tpetra_vals = f_tpetra->get1dView();
132 TEST_FLOATING_EQUALITY(f_tpetra_vals[0], as<Scalar>(x_0 + x_1*x_1 - p_0), tol);
133 TEST_FLOATING_EQUALITY(f_tpetra_vals[1], as<Scalar>(d * (x_0*x_0 - x_1 - p_1)), tol);
134
135 const RCP<const Tpetra::CrsMatrix<Scalar> > W_tpetra =
136 rcp_dynamic_cast<Tpetra::CrsMatrix<Scalar> >(
137 ConverterT::getTpetraOperator(W_op));
138 using crs_t = Tpetra::CrsMatrix<Scalar>;
139 typename crs_t::local_inds_host_view_type row_indices;
140 typename crs_t::values_host_view_type row_values;
141
142 W_tpetra->getLocalRowView(0, row_indices, row_values);
143 // FIXME (mfh 22 Oct 2015) This test assumes that local indices
144 // occur in a particular order. Tpetra does not necessarily
145 // guarantee this.
146 TEST_EQUALITY( row_indices[0], static_cast<LO> (0) );
147 TEST_EQUALITY( row_indices[1], static_cast<LO> (1) );
148 TEST_FLOATING_EQUALITY( row_values[0], as<Scalar>(1.0), tol );
149 TEST_FLOATING_EQUALITY( row_values[1], as<Scalar>(2.0*x_1), tol );
150
151 W_tpetra->getLocalRowView(1, row_indices, row_values);
152 TEST_EQUALITY( row_indices[0], static_cast<LO> (0) );
153 TEST_EQUALITY( row_indices[1], static_cast<LO> (1) );
154 TEST_FLOATING_EQUALITY( row_values[0], as<Scalar>(d*2.0*x_0), tol );
155 TEST_FLOATING_EQUALITY( row_values[1], as<Scalar>(-d), tol );
156
157}
158
159#if !defined(HAVE_TPETRA_EXPLICIT_INSTANTIATION) || defined(HAVE_TPETRA_INST_DOUBLE)
162#endif
163
164#if !defined(HAVE_TPETRA_EXPLICIT_INSTANTIATION) || defined(HAVE_TPETRA_INST_FLOAT)
167#endif
168
169
170
171} // namespace
#define TEST_FLOATING_EQUALITY(v1, v2, tol)
#define TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT_DOUBLE(TEST_GROUP, TEST_NAME)
#define TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT_FLOAT(TEST_GROUP, TEST_NAME)
Simple 2d simulation only ModelEvaluator for f(x) = 0 using Tpetra objects.
Traits class that enables the extraction of Tpetra operator/vector objects wrapped in Thyra operator/...
void f()
bool nonnull(const boost::shared_ptr< T > &p)
TypeTo as(const TypeFrom &t)
TEST_ASSERT(castedDep1->getValuesAndValidators().size()==2)
TEST_EQUALITY(rcp_dynamic_cast< const EnhancedNumberValidator< double > >(castedDep1->getValuesAndValidators().find("val1") ->second, true) ->getMax(), double1Vali->getMax())
TEUCHOS_UNIT_TEST_TEMPLATE_1_DECL(Comm, ReduceSum, PacketType)