本文整理汇总了C++中InArgs::get_p方法的典型用法代码示例。如果您正苦于以下问题:C++ InArgs::get_p方法的具体用法?C++ InArgs::get_p怎么用?C++ InArgs::get_p使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类InArgs
的用法示例。
在下文中一共展示了InArgs::get_p方法的13个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: evalModel
void Simple_ModelEval::evalModel( const InArgs& inArgs,
const OutArgs& outArgs ) const
{
// Parse InArgs
Teuchos::RCP<const Epetra_Vector> p_in = inArgs.get_p(0);
if (!p_in.get()) cout << "ERROR: Simple_ModelEval requires p as inargs" << endl;
int numParameters = p_in->GlobalLength();
// Parse OutArgs
Teuchos::RCP<Epetra_Vector> g_out = outArgs.get_g(0);
// Parse out-args for sensitivity calculation
Teuchos::RCP<Epetra_MultiVector> dgdp_out;
dgdp_out = outArgs.get_DgDp(0,0).getMultiVector();
if (!is_null(g_out)) {
(*g_out)[0] = 1.0 - (*p_in)[0];
(*g_out)[1] = 1.2 - (*p_in)[1];
(*g_out)[2] = 4.0 - (*p_in)[2] - 0.5* (1.0 - (*p_in)[0]);
}
if (dgdp_out != Teuchos::null) {
// Must initialize since Thyra will init with NaN
dgdp_out->PutScalar(0.0);
// Set gradient of above g equations (derived by hand)
for (int i=0; i<numParameters; i++) {
(*dgdp_out)[i][i] = -1.0;
}
(*dgdp_out)[0][2] = 0.5; //DERIV_BY_COL: [p][g]
}
}
示例2: if
void
Stokhos::MPInverseModelEvaluator::evalModel(const InArgs& inArgs,
const OutArgs& outArgs) const
{
// Create underlying inargs
InArgs me_inargs = me->createInArgs();
// Pass parameters
for (int i=0; i<num_p; i++)
me_inargs.set_p(i, inArgs.get_p(i));
// Pass MP parameters
for (int i=0; i<num_p_mp; i++) {
mp_const_vector_t p_mp = inArgs.get_p_mp(mp_p_index_map[i]);
if (p_mp != Teuchos::null) {
me_inargs.set_p(i+num_p, p_mp->getBlockVector());
}
}
// Create underlying outargs
OutArgs me_outargs = me->createOutArgs();
// MP Responses
for (int i=0; i<num_g_mp; i++) {
int ii = mp_g_index_map[i];
// g
mp_vector_t g_mp = outArgs.get_g_mp(ii);
if (g_mp != Teuchos::null) {
me_outargs.set_g(i, Teuchos::rcp_dynamic_cast<Epetra_Vector>(g_mp->getBlockVector()));
}
// dg/dp
for (int j=0; j<num_p; j++) {
if (!outArgs.supports(OUT_ARG_DgDp_mp, ii, j).none()) {
MPDerivative dgdp_mp = outArgs.get_DgDp_mp(ii,j);
Teuchos::RCP<Stokhos::ProductEpetraMultiVector> dgdp_mp_mv =
dgdp_mp.getMultiVector();
Teuchos::RCP<Epetra_Operator> dgdp_mp_op =
dgdp_mp.getLinearOp();
if (dgdp_mp_mv != Teuchos::null) {
me_outargs.set_DgDp(
i, j, Derivative(dgdp_mp_mv->getBlockMultiVector(),
dgdp_mp.getMultiVectorOrientation()));
}
else if (dgdp_mp_op != Teuchos::null) {
me_outargs.set_DgDp(i, j, Derivative(dgdp_mp_op));
}
}
}
}
// Compute the functions
me->evalModel(me_inargs, me_outargs);
}
示例3: modelOutArgs
void Piro::Epetra::MatrixFreeDecorator::evalModel( const InArgs& inArgs,
const OutArgs& outArgs ) const
{
using Teuchos::RCP;
using Teuchos::rcp;
RCP<Epetra_Operator> W_out = outArgs.get_W();
if (W_out == Teuchos::null) {
// Just pass through as is: nothing to Decorate
model->evalModel(inArgs, outArgs);
}
else {
RCP<Piro::Epetra::MatrixFreeOperator> W_mfo =
Teuchos::rcp_dynamic_cast<Piro::Epetra::MatrixFreeOperator>(W_out);
TEUCHOS_TEST_FOR_EXCEPTION(W_mfo==Teuchos::null, std::logic_error,
"Epetra_Operator sent as W to Piro::Epetra::MatrixFreeDecorator\n"
"be of type Piro::Epetra::MatrixFreeOperator");
// Do base case for MatrixFree: set f instead of W
OutArgs modelOutArgs(outArgs);
InArgs modelInArgs(inArgs);
// Store f_out in case it was also requested
RCP<Epetra_Vector> f_out = outArgs.get_f();
modelOutArgs.set_f(fBase);
modelOutArgs.set_W(Teuchos::null);
//Evaluate the underlying model
model->evalModel(modelInArgs, modelOutArgs);
// If f_out was requested, return it.
if (f_out != Teuchos::null) *f_out = *fBase;
// Save unperturbed solution (deep copy inArgs, shallow f)
InArgs clonedInArgs = inArgs;
for (int l = 0; l < inArgs.Np(); ++l) {
const RCP<const Epetra_Vector> p_l = inArgs.get_p(l);
if (nonnull(p_l))
clonedInArgs.set_p(l, Teuchos::rcp(new Epetra_Vector(*p_l)));
}
clonedInArgs.set_x(Teuchos::rcp(new Epetra_Vector(*inArgs.get_x())));
bool haveXdot = false;
if (inArgs.supports(IN_ARG_x_dot)) {
RCP<const Epetra_Vector> xdot = inArgs.get_x_dot();
if (nonnull(xdot)) {
clonedInArgs.set_x_dot(Teuchos::rcp(new Epetra_Vector(*inArgs.get_x_dot())));
haveXdot = true;
}
}
W_mfo->setBase(clonedInArgs, fBase, haveXdot);
}
}
示例4: double
void
twoD_diffusion_ME::
evalModel(const InArgs& inArgs, const OutArgs& outArgs) const
{
//
// Determinisic calculation
//
// Solution vector
Teuchos::RCP<const Epetra_Vector> det_x = inArgs.get_x();
// Parameters
Teuchos::RCP<const Epetra_Vector> p = inArgs.get_p(0);
if (p == Teuchos::null)
p = p_init;
Teuchos::RCP<Epetra_Vector> f = outArgs.get_f();
Teuchos::RCP<Epetra_Operator> W = outArgs.get_W();
Teuchos::RCP<Epetra_Operator> WPrec = outArgs.get_WPrec();
if (f != Teuchos::null || W != Teuchos::null || WPrec != Teuchos::null) {
if (basis != Teuchos::null) {
for (int i=0; i<point.size(); i++)
point[i] = (*p)[i];
basis->evaluateBases(point, basis_vals);
A->PutScalar(0.0);
for (int k=0;k<A_k.size();k++)
EpetraExt::MatrixMatrix::Add((*A_k[k]), false, basis_vals[k], *A, 1.0);
}
else {
*A = *(A_k[0]);
for (int k=1;k<A_k.size();k++)
EpetraExt::MatrixMatrix::Add((*A_k[k]), false, (*p)[k-1], *A, 1.0);
}
A->FillComplete();
A->OptimizeStorage();
}
// Residual
if (f != Teuchos::null) {
Teuchos::RCP<Epetra_Vector> kx = Teuchos::rcp(new Epetra_Vector(*x_map));
A->Apply(*det_x,*kx);
f->Update(1.0,*kx,-1.0, *b, 0.0);
}
// Jacobian
if (W != Teuchos::null) {
Teuchos::RCP<Epetra_CrsMatrix> jac =
Teuchos::rcp_dynamic_cast<Epetra_CrsMatrix>(W, true);
*jac = *A;
jac->FillComplete();
jac->OptimizeStorage();
}
// Preconditioner
if (WPrec != Teuchos::null)
precFactory->recompute(A, WPrec);
// Responses (mean value)
Teuchos::RCP<Epetra_Vector> g = outArgs.get_g(0);
if (g != Teuchos::null) {
(det_x->MeanValue(&(*g)[0]));
(*g)[0] *= double(det_x->GlobalLength()) / double(mesh.size());
}
//
// Stochastic Galerkin calculation
//
// Stochastic solution vector
InArgs::sg_const_vector_t x_sg = inArgs.get_x_sg();
// Stochastic parameters
InArgs::sg_const_vector_t p_sg = inArgs.get_p_sg(0);
// Stochastic residual
OutArgs::sg_vector_t f_sg = outArgs.get_f_sg();
if (f_sg != Teuchos::null) {
// Get stochastic expansion data
Teuchos::RCP<Stokhos::OrthogPolyExpansion<int,double> > expn =
inArgs.get_sg_expansion();
typedef Stokhos::Sparse3Tensor<int,double> Cijk_type;
Teuchos::RCP<const Cijk_type> Cijk = expn->getTripleProduct();
const Teuchos::Array<double>& norms = basis->norm_squared();
if (sg_kx_vec_all.size() != basis->size()) {
sg_kx_vec_all.resize(basis->size());
for (int i=0;i<basis->size();i++) {
sg_kx_vec_all[i] = Teuchos::rcp(new Epetra_Vector(*x_map));
}
}
f_sg->init(0.0);
Cijk_type::k_iterator k_begin = Cijk->k_begin();
Cijk_type::k_iterator k_end = Cijk->k_end();
for (Cijk_type::k_iterator k_it=k_begin; k_it!=k_end; ++k_it) {
int k = Stokhos::index(k_it);
for (Cijk_type::kj_iterator j_it = Cijk->j_begin(k_it);
j_it != Cijk->j_end(k_it); ++j_it) {
//.........这里部分代码省略.........
示例5: evalModel
void MockModelEval_A::evalModel( const InArgs& inArgs,
const OutArgs& outArgs ) const
{
// Parse InArgs
RCP<const Epetra_Vector> p_in = inArgs.get_p(0);
if (!p_in.get()) cout << "ERROR: MockModelEval_A requires p as inargs" << endl;
//int numParameters = p_in->GlobalLength();
RCP<const Epetra_Vector> x_in = inArgs.get_x();
if (!x_in.get()) cout << "ERROR: MockModelEval_A requires x as inargs" << endl;
int vecLength = x_in->GlobalLength();
int myVecLength = x_in->MyLength();
// Parse OutArgs
RCP<Epetra_Vector> f_out = outArgs.get_f();
RCP<Epetra_Vector> g_out = outArgs.get_g(0);
Teuchos::RCP<Epetra_Operator> W_out = outArgs.get_W();
Teuchos::RCP<Epetra_MultiVector> dfdp_out;
if (outArgs.Np() > 0)
dfdp_out = outArgs.get_DfDp(0).getMultiVector();
RCP<Epetra_MultiVector> dgdp_out;
dgdp_out = outArgs.get_DgDp(0,0).getMultiVector();
RCP<Epetra_MultiVector> dgdx_out;
dgdx_out = outArgs.get_DgDx(0).getMultiVector();
if (f_out != Teuchos::null) {
for (int i=0; i<myVecLength; i++) {
int gid = x_in->Map().GID(i);
if (gid==0) // x_0^2 = p_0
(*f_out)[i] = (*x_in)[i] * (*x_in)[i] - (*p_in)[i];
else // x^2 = (i+p_1)^2
(*f_out)[i] = (*x_in)[i] * (*x_in)[i] - (gid + (*p_in)[1])*(gid + (*p_in)[1]);
}
}
if (W_out != Teuchos::null) {
Teuchos::RCP<Epetra_CrsMatrix> W_out_crs =
Teuchos::rcp_dynamic_cast<Epetra_CrsMatrix>(W_out, true);
W_out_crs->PutScalar(0.0);
double diag=0.0;
for (int i=0; i<myVecLength; i++) {
diag = 2.0 * (*x_in)[i];
W_out_crs->ReplaceMyValues(i, 1, &diag, &i);
}
}
if (dfdp_out != Teuchos::null) {
dfdp_out->PutScalar(0.0);
for (int i=0; i<myVecLength; i++) {
int gid = x_in->Map().GID(i);
if (gid==0) (*dfdp_out)[0][i] = -1.0;
else (*dfdp_out)[1][i] = -2.0* (gid + (*p_in)[1]);
}
}
// ObjFn = 0.5*(Sum(x)-Sum(p)-12)^2 + 0.5*(p0-1)^2: min at 1,3
double term1, term2;
x_in->MeanValue(&term1);
term1 = vecLength * term1 - ((*p_in)[0] + (*p_in)[1]) - 12.0;
term2 = (*p_in)[0] - 1.0;
if (!is_null(g_out)) {
(*g_out)[0] = 0.5*term1*term1 + 0.5*term2*term2;
}
if (dgdx_out != Teuchos::null) {
dgdx_out->PutScalar(term1);
}
if (dgdp_out != Teuchos::null) {
dgdp_out->PutScalar(0.0);
(*dgdp_out)[0][0] = -term1 + term2;
(*dgdp_out)[0][1] = -term1;
}
// Modify for time dependent (implicit timeintegration or eigensolves
// Check if time dependent
RCP<const Epetra_Vector> x_dot = inArgs.get_x_dot();
if (x_dot.get()) {
double alpha = inArgs.get_alpha();
double beta = inArgs.get_beta();
if (alpha==0.0 && beta==0.0) {
cout << "MockModelEval Warning: alpha=beta=0 -- setting beta=1" << endl;
beta = 1.0;
}
if (f_out != Teuchos::null) {
for (int i=0; i<myVecLength; i++) {
(*f_out)[i] = -alpha*(*x_dot)[i] + beta * (*f_out)[i];
}
}
if (dfdp_out != Teuchos::null) {
dfdp_out->Scale(beta);
}
if (W_out != Teuchos::null) {
Teuchos::RCP<Epetra_CrsMatrix> W_out_crs =
Teuchos::rcp_dynamic_cast<Epetra_CrsMatrix>(W_out, true);
//.........这里部分代码省略.........
示例6: Timer
void
Albany::ModelEvaluator::evalModel(const InArgs& inArgs,
const OutArgs& outArgs) const
{
Teuchos::TimeMonitor Timer(*timer); //start timer
//
// Get the input arguments
//
Teuchos::RCP<const Epetra_Vector> x = inArgs.get_x();
Teuchos::RCP<const Epetra_Vector> x_dot;
Teuchos::RCP<const Epetra_Vector> x_dotdot;
double alpha = 0.0;
double omega = 0.0;
double beta = 1.0;
double curr_time = 0.0;
x_dot = inArgs.get_x_dot();
x_dotdot = inArgs.get_x_dotdot();
if (x_dot != Teuchos::null || x_dotdot != Teuchos::null) {
alpha = inArgs.get_alpha();
omega = inArgs.get_omega();
beta = inArgs.get_beta();
curr_time = inArgs.get_t();
}
for (int i=0; i<num_param_vecs; i++) {
Teuchos::RCP<const Epetra_Vector> p = inArgs.get_p(i);
if (p != Teuchos::null) {
for (unsigned int j=0; j<sacado_param_vec[i].size(); j++)
sacado_param_vec[i][j].baseValue = (*p)[j];
}
}
for (int i=0; i<num_dist_param_vecs; i++) {
Teuchos::RCP<const Epetra_Vector> p = inArgs.get_p(i+num_param_vecs);
if (p != Teuchos::null) {
*(distParamLib->get(dist_param_names[i])->vector()) = *p;
}
}
//
// Get the output arguments
//
EpetraExt::ModelEvaluator::Evaluation<Epetra_Vector> f_out = outArgs.get_f();
Teuchos::RCP<Epetra_Operator> W_out = outArgs.get_W();
// Cast W to a CrsMatrix, throw an exception if this fails
Teuchos::RCP<Epetra_CrsMatrix> W_out_crs;
if (W_out != Teuchos::null)
W_out_crs = Teuchos::rcp_dynamic_cast<Epetra_CrsMatrix>(W_out, true);
int test_var = 0;
if(test_var != 0){
std::cout << "The current solution length is: " << x->MyLength() << std::endl;
x->Print(std::cout);
}
// Get preconditioner operator, if requested
Teuchos::RCP<Epetra_Operator> WPrec_out;
if (outArgs.supports(OUT_ARG_WPrec)) WPrec_out = outArgs.get_WPrec();
//
// Compute the functions
//
bool f_already_computed = false;
// W matrix
if (W_out != Teuchos::null) {
app->computeGlobalJacobian(alpha, beta, omega, curr_time, x_dot.get(), x_dotdot.get(),*x,
sacado_param_vec, f_out.get(), *W_out_crs);
f_already_computed=true;
if(test_var != 0){
//std::cout << "The current rhs length is: " << f_out->MyLength() << std::endl;
//f_out->Print(std::cout);
std::cout << "The current Jacobian length is: " << W_out_crs->NumGlobalRows() << std::endl;
W_out_crs->Print(std::cout);
}
}
if (WPrec_out != Teuchos::null) {
app->computeGlobalJacobian(alpha, beta, omega, curr_time, x_dot.get(), x_dotdot.get(), *x,
sacado_param_vec, f_out.get(), *Extra_W_crs);
f_already_computed=true;
if(test_var != 0){
//std::cout << "The current rhs length is: " << f_out->MyLength() << std::endl;
//f_out->Print(std::cout);
std::cout << "The current preconditioner length is: " << Extra_W_crs->NumGlobalRows() << std::endl;
Extra_W_crs->Print(std::cout);
}
app->computeGlobalPreconditioner(Extra_W_crs, WPrec_out);
}
// scalar df/dp
for (int i=0; i<num_param_vecs; i++) {
Teuchos::RCP<Epetra_MultiVector> dfdp_out =
outArgs.get_DfDp(i).getMultiVector();
if (dfdp_out != Teuchos::null) {
Teuchos::Array<int> p_indexes =
outArgs.get_DfDp(i).getDerivativeMultiVector().getParamIndexes();
Teuchos::RCP<ParamVec> p_vec;
//.........这里部分代码省略.........
示例7: Timer
void
Albany::ModelEvaluator::evalModel(const InArgs& inArgs,
const OutArgs& outArgs) const
{
Teuchos::TimeMonitor Timer(*timer); //start timer
//
// Get the input arguments
//
Teuchos::RCP<const Epetra_Vector> x = inArgs.get_x();
Teuchos::RCP<const Epetra_Vector> x_dot;
Teuchos::RCP<const Epetra_Vector> x_dotdot;
//create comm and node objects for Epetra -> Tpetra conversions
Teuchos::RCP<const Teuchos::Comm<int> > commT = app->getComm();
Teuchos::RCP<Epetra_Comm> comm = Albany::createEpetraCommFromTeuchosComm(commT);
//Create Tpetra copy of x, call it xT
Teuchos::RCP<const Tpetra_Vector> xT;
if (x != Teuchos::null)
xT = Petra::EpetraVector_To_TpetraVectorConst(*x, commT);
double alpha = 0.0;
double omega = 0.0;
double beta = 1.0;
double curr_time = 0.0;
if(num_time_deriv > 0)
x_dot = inArgs.get_x_dot();
if(num_time_deriv > 1)
x_dotdot = inArgs.get_x_dotdot();
//Declare and create Tpetra copy of x_dot, call it x_dotT
Teuchos::RCP<const Tpetra_Vector> x_dotT;
if (Teuchos::nonnull(x_dot))
x_dotT = Petra::EpetraVector_To_TpetraVectorConst(*x_dot, commT);
//Declare and create Tpetra copy of x_dotdot, call it x_dotdotT
Teuchos::RCP<const Tpetra_Vector> x_dotdotT;
if (Teuchos::nonnull(x_dotdot))
x_dotdotT = Petra::EpetraVector_To_TpetraVectorConst(*x_dotdot, commT);
if (Teuchos::nonnull(x_dot)){
alpha = inArgs.get_alpha();
beta = inArgs.get_beta();
curr_time = inArgs.get_t();
}
if (Teuchos::nonnull(x_dotdot)) {
omega = inArgs.get_omega();
}
for (int i=0; i<num_param_vecs; i++) {
Teuchos::RCP<const Epetra_Vector> p = inArgs.get_p(i);
if (p != Teuchos::null) {
for (unsigned int j=0; j<sacado_param_vec[i].size(); j++) {
sacado_param_vec[i][j].baseValue = (*p)[j];
}
}
}
for (int i=0; i<num_dist_param_vecs; i++) {
Teuchos::RCP<const Epetra_Vector> p = inArgs.get_p(i+num_param_vecs);
//create Tpetra copy of p
Teuchos::RCP<const Tpetra_Vector> pT;
if (p != Teuchos::null) {
pT = Petra::EpetraVector_To_TpetraVectorConst(*p, commT);
//*(distParamLib->get(dist_param_names[i])->vector()) = *p;
*(distParamLib->get(dist_param_names[i])->vector()) = *pT;
}
}
//
// Get the output arguments
//
EpetraExt::ModelEvaluator::Evaluation<Epetra_Vector> f_out = outArgs.get_f();
Teuchos::RCP<Epetra_Operator> W_out = outArgs.get_W();
// Cast W to a CrsMatrix, throw an exception if this fails
Teuchos::RCP<Epetra_CrsMatrix> W_out_crs;
#ifdef WRITE_MASS_MATRIX_TO_MM_FILE
//IK, 7/15/14: adding object to hold mass matrix to be written to matrix market file
Teuchos::RCP<Epetra_CrsMatrix> Mass;
//IK, 7/15/14: needed for writing mass matrix out to matrix market file
EpetraExt::ModelEvaluator::Evaluation<Epetra_Vector> ftmp = outArgs.get_f();
#endif
if (W_out != Teuchos::null) {
W_out_crs = Teuchos::rcp_dynamic_cast<Epetra_CrsMatrix>(W_out, true);
#ifdef WRITE_MASS_MATRIX_TO_MM_FILE
//IK, 7/15/14: adding object to hold mass matrix to be written to matrix market file
Mass = Teuchos::rcp_dynamic_cast<Epetra_CrsMatrix>(W_out, true);
#endif
}
int test_var = 0;
if(test_var != 0){
std::cout << "The current solution length is: " << x->MyLength() << std::endl;
x->Print(std::cout);
}
// Get preconditioner operator, if requested
//.........这里部分代码省略.........
示例8: if
void
Stokhos::SGQuadModelEvaluator::
evalModel(const InArgs& inArgs, const OutArgs& outArgs) const
{
// Create underlying inargs
InArgs me_inargs = me->createInArgs();
if (me_inargs.supports(IN_ARG_x))
me_inargs.set_x(inArgs.get_x());
if (me_inargs.supports(IN_ARG_x_dot))
me_inargs.set_x_dot(inArgs.get_x_dot());
if (me_inargs.supports(IN_ARG_alpha))
me_inargs.set_alpha(inArgs.get_alpha());
if (me_inargs.supports(IN_ARG_beta))
me_inargs.set_beta(inArgs.get_beta());
if (me_inargs.supports(IN_ARG_t))
me_inargs.set_t(inArgs.get_t());
for (int i=0; i<num_p; i++)
me_inargs.set_p(i, inArgs.get_p(i));
// Create underlying outargs
OutArgs me_outargs = me->createOutArgs();
if (me_outargs.supports(OUT_ARG_f))
me_outargs.set_f(outArgs.get_f());
if (me_outargs.supports(OUT_ARG_W))
me_outargs.set_W(outArgs.get_W());
for (int j=0; j<num_p; j++)
if (!outArgs.supports(OUT_ARG_DfDp, j).none())
me_outargs.set_DfDp(j, outArgs.get_DfDp(j));
for (int i=0; i<num_g; i++) {
me_outargs.set_g(i, outArgs.get_g(i));
if (!outArgs.supports(OUT_ARG_DgDx, i).none())
me_outargs.set_DgDx(i, outArgs.get_DgDx(i));
if (!outArgs.supports(OUT_ARG_DgDx_dot, i).none())
me_outargs.set_DgDx(i, outArgs.get_DgDx_dot(i));
for (int j=0; j<num_p; j++)
if (!outArgs.supports(OUT_ARG_DgDp, i, j).none())
me_outargs.set_DgDp(i, j, outArgs.get_DgDp(i,j));
}
bool do_quad = false;
InArgs::sg_const_vector_t x_sg;
InArgs::sg_const_vector_t x_dot_sg;
Teuchos::Array<InArgs::sg_const_vector_t> p_sg(num_p);
OutArgs::sg_vector_t f_sg;
OutArgs::sg_operator_t W_sg;
Teuchos::Array<SGDerivative> dfdp_sg(num_p);
Teuchos::Array<OutArgs::sg_vector_t> g_sg(num_g);
Teuchos::Array<SGDerivative> dgdx_sg(num_g);
Teuchos::Array<SGDerivative> dgdx_dot_sg(num_g);
Teuchos::Array< Teuchos::Array<SGDerivative> > dgdp_sg(num_g);
TEUCHOS_TEST_FOR_EXCEPTION(inArgs.get_sg_basis() == Teuchos::null,
std::logic_error,
"Error! Stokhos::SGQuadModelEvaluator::evalModel(): " <<
"SG basis inArg cannot be null!");
TEUCHOS_TEST_FOR_EXCEPTION(inArgs.get_sg_quadrature() == Teuchos::null,
std::logic_error,
"Error! Stokhos::SGQuadModelEvaluator::evalModel(): " <<
"SG quadrature inArg cannot be null!");
Teuchos::RCP<const Stokhos::OrthogPolyBasis<int,double> > basis =
inArgs.get_sg_basis();
Teuchos::RCP< const Stokhos::Quadrature<int,double> > quad =
inArgs.get_sg_quadrature();
if (inArgs.supports(IN_ARG_x_sg)) {
x_sg = inArgs.get_x_sg();
if (x_sg != Teuchos::null) {
do_quad = true;
}
}
if (inArgs.supports(IN_ARG_x_dot_sg)) {
x_dot_sg = inArgs.get_x_dot_sg();
if (x_dot_sg != Teuchos::null) {
do_quad = true;
}
}
for (int i=0; i<num_p; i++) {
p_sg[i] = inArgs.get_p_sg(i);
if (p_sg[i] != Teuchos::null) {
do_quad = true;
}
}
if (outArgs.supports(OUT_ARG_f_sg)) {
f_sg = outArgs.get_f_sg();
if (f_sg != Teuchos::null)
f_sg->init(0.0);
}
if (outArgs.supports(OUT_ARG_W_sg)) {
W_sg = outArgs.get_W_sg();
if (W_sg != Teuchos::null)
W_sg->init(0.0);
}
for (int i=0; i<num_p; i++) {
if (!outArgs.supports(OUT_ARG_DfDp_sg, i).none()) {
dfdp_sg[i] = outArgs.get_DfDp_sg(i);
if (dfdp_sg[i].getMultiVector() != Teuchos::null)
dfdp_sg[i].getMultiVector()->init(0.0);
else if (dfdp_sg[i].getLinearOp() != Teuchos::null)
dfdp_sg[i].getLinearOp()->init(0.0);
}
}
//.........这里部分代码省略.........
示例9: rcp
void Piro::Epetra::TrapezoidRuleSolver::evalModel( const InArgs& inArgs,
const OutArgs& outArgs ) const
{
using Teuchos::RCP;
using Teuchos::rcp;
EpetraExt::ModelEvaluator::InArgs nox_inargs = noxSolver->createInArgs();
EpetraExt::ModelEvaluator::OutArgs nox_outargs = noxSolver->createOutArgs();
// Parse InArgs
RCP<const Epetra_Vector> p_in;
if (num_p > 0) {
p_in = inArgs.get_p(0);
nox_inargs.set_p(0, p_in);
}
// Parse OutArgs: always 1 extra
RCP<Epetra_Vector> g_out;
if (num_g > 0) {
g_out = outArgs.get_g(0);
nox_outargs.set_g(0, g_out);
}
RCP<Epetra_Vector> gx_out = outArgs.get_g(num_g);
nox_outargs.set_g(num_g, gx_out);
RCP<Epetra_Vector> x = rcp(new Epetra_Vector(*model->get_x_init()));
RCP<Epetra_Vector> v = rcp(new Epetra_Vector(*model->get_x_dot_init()));
RCP<Epetra_Vector> a = rcp(new Epetra_Vector(*model->get_f_map()));
RCP<Epetra_Vector> x_pred = rcp(new Epetra_Vector(*model->get_f_map()));
RCP<Epetra_Vector> a_old = rcp(new Epetra_Vector(*model->get_f_map()));
TEUCHOS_TEST_FOR_EXCEPTION(v == Teuchos::null || x == Teuchos::null,
Teuchos::Exceptions::InvalidParameter,
std::endl << "Error in Piro::Epetra::TrapezoidRuleSolver " <<
"Requires initial x and x_dot: " << std::endl);
double nrm;
v->Norm2(&nrm); *out << "Initial Velocity = " << nrm << endl;
double t = t_init;
//calculate intial acceleration using small time step (1.0e-3*delta_t)
{
double pert= 1.0e6 * 4.0 / (delta_t * delta_t);
*x_pred = *x;
model->injectData(x_pred, x_pred, pert, t);
noxSolver->evalModel(nox_inargs, nox_outargs);
a->Update(pert, *gx_out, -pert, *x_pred,0.0);
a->Norm2(&nrm); *out << "Calculated a_init = " << nrm << endl;
}
// Start integration loop
double fdt2 = 4.0 / (delta_t * delta_t);
double dt2f = delta_t * delta_t / 4.0;
double hdt = delta_t/ 2.0;
for (int timeStep = 1; timeStep <= numTimeSteps; timeStep++) {
t += delta_t;
*a_old = *a;
*x_pred = *x;
x_pred->Update(delta_t, *v, dt2f, *a, 1.0);
model->injectData(x, x_pred, fdt2, t);
noxSolver->evalModel(nox_inargs, nox_outargs);
// Copy out final solution from nonlinear solver
*x = *gx_out;
// Compute a and v and new conditions
a->Update(fdt2, *x, -fdt2, *x_pred,0.0);
v->Update(hdt, *a, hdt, *a_old, 1.0);
if (observer != Teuchos::null) observer->observeSolution(*x,t);
if (g_out != Teuchos::null)
g_out->Print(*out << "Responses at time step(time) = " << timeStep << "("<<t<<")\n");
}
}
示例10: Kvec
void
QCAD::GenEigensolver::evalModel(const InArgs& inArgs,
const OutArgs& outArgs ) const
{
// type definitions
typedef Epetra_MultiVector MV;
typedef Epetra_Operator OP;
typedef Anasazi::MultiVecTraits<double, Epetra_MultiVector> MVT;
// Get the stiffness and mass matrices
InArgs model_inArgs = model->createInArgs();
OutArgs model_outArgs = model->createOutArgs();
//input args
model_inArgs.set_t(0.0);
Teuchos::RCP<const Epetra_Vector> x = model->get_x_init();
Teuchos::RCP<const Epetra_Vector> x_dot = model->get_x_dot_init();
model_inArgs.set_x(x);
model_inArgs.set_x_dot(x_dot);
model_inArgs.set_alpha(0.0);
model_inArgs.set_beta(1.0);
for(int i=0; i<model_num_p; i++)
model_inArgs.set_p(i, inArgs.get_p(i));
//output args
Teuchos::RCP<Epetra_CrsMatrix> K =
Teuchos::rcp_dynamic_cast<Epetra_CrsMatrix>(model->create_W(), true);
model_outArgs.set_W(K);
model->evalModel(model_inArgs, model_outArgs); //compute K matrix
// reset alpha and beta to compute the mass matrix
model_inArgs.set_alpha(1.0);
model_inArgs.set_beta(0.0);
Teuchos::RCP<Epetra_CrsMatrix> M =
Teuchos::rcp_dynamic_cast<Epetra_CrsMatrix>(model->create_W(), true);
model_outArgs.set_W(M);
model->evalModel(model_inArgs, model_outArgs); //compute M matrix
Teuchos::RCP<Epetra_MultiVector> ivec = Teuchos::rcp( new Epetra_MultiVector(K->OperatorDomainMap(), blockSize) );
ivec->Random();
// Create the eigenproblem.
Teuchos::RCP<Anasazi::BasicEigenproblem<double, MV, OP> > eigenProblem =
Teuchos::rcp( new Anasazi::BasicEigenproblem<double, MV, OP>(K, M, ivec) );
// Inform the eigenproblem that the operator A is symmetric
eigenProblem->setHermitian(bHermitian);
// Set the number of eigenvalues requested
eigenProblem->setNEV( nev );
// Inform the eigenproblem that you are finishing passing it information
bool bSuccess = eigenProblem->setProblem();
TEUCHOS_TEST_FOR_EXCEPTION(!bSuccess, Teuchos::Exceptions::InvalidParameter,
"Anasazi::BasicEigenproblem::setProblem() returned an error.\n" << std::endl);
// Create parameter list to pass into the solver manager
//
Teuchos::ParameterList eigenPL;
eigenPL.set( "Which", which );
eigenPL.set( "Block Size", blockSize );
eigenPL.set( "Maximum Iterations", maxIters );
eigenPL.set( "Convergence Tolerance", conv_tol );
eigenPL.set( "Full Ortho", true );
eigenPL.set( "Use Locking", true );
eigenPL.set( "Verbosity", Anasazi::IterationDetails );
// Create the solver manager
Anasazi::LOBPCGSolMgr<double, MV, OP> eigenSolverMan(eigenProblem, eigenPL);
// Solve the problem
Anasazi::ReturnType returnCode = eigenSolverMan.solve();
// Get the eigenvalues and eigenvectors from the eigenproblem
Anasazi::Eigensolution<double,MV> sol = eigenProblem->getSolution();
std::vector<Anasazi::Value<double> > evals = sol.Evals;
Teuchos::RCP<MV> evecs = sol.Evecs;
std::vector<double> evals_real(sol.numVecs);
for(int i=0; i<sol.numVecs; i++) evals_real[i] = evals[i].realpart;
// Compute residuals.
std::vector<double> normR(sol.numVecs);
if (sol.numVecs > 0) {
Teuchos::SerialDenseMatrix<int,double> T(sol.numVecs, sol.numVecs);
Epetra_MultiVector Kvec( K->OperatorDomainMap(), evecs->NumVectors() );
Epetra_MultiVector Mvec( M->OperatorDomainMap(), evecs->NumVectors() );
T.putScalar(0.0);
for (int i=0; i<sol.numVecs; i++) {
T(i,i) = evals_real[i];
}
K->Apply( *evecs, Kvec );
M->Apply( *evecs, Mvec );
MVT::MvTimesMatAddMv( -1.0, Mvec, T, 1.0, Kvec );
MVT::MvNorm( Kvec, normR );
//.........这里部分代码省略.........
示例11: x
void
MockModelEval_D::
evalModel(const InArgs& inArgs, const OutArgs& outArgs) const
{
int proc = comm->MyPID();
//
// Deterministic calculation
//
// Parse InArgs
RCP<const Epetra_Vector> p1_in = inArgs.get_p(0);
if (p1_in == Teuchos::null)
p1_in = p1_init;
RCP<const Epetra_Vector> p2_in = inArgs.get_p(1);
if (p2_in == Teuchos::null)
p2_in = p2_init;
RCP<const Epetra_Vector> x_in = inArgs.get_x();
// Parse OutArgs
RCP<Epetra_Vector> f_out = outArgs.get_f();
if (f_out != Teuchos::null) {
double p = (*p1_in)[0];
double xi = (*p2_in)[0];
if (proc == 0) {
double x = (*x_in)[0];
(*f_out)[0] = x - p + xi;
}
}
RCP<Epetra_CrsMatrix> W_out =
Teuchos::rcp_dynamic_cast<Epetra_CrsMatrix>(outArgs.get_W());
if (W_out != Teuchos::null) {
if (proc == 0) {
double val = 1.0;
int i = 0;
W_out->ReplaceMyValues(i, 1, &val, &i);
}
}
RCP<Epetra_MultiVector> dfdp1 = outArgs.get_DfDp(0).getMultiVector();
if (dfdp1 != Teuchos::null) {
if (proc == 0)
(*dfdp1)[0][0] = -1.0;
}
RCP<Epetra_MultiVector> dfdp2 = outArgs.get_DfDp(1).getMultiVector();
if (dfdp2 != Teuchos::null) {
if (proc == 0)
(*dfdp2)[0][0] = 1.0;
}
RCP<Epetra_Vector> g_out = outArgs.get_g(0);
if (g_out != Teuchos::null) {
if (proc == 0) {
double x = (*x_in)[0];
(*g_out)[0] = 1.0 / x;
}
}
RCP<Epetra_MultiVector> dgdx = outArgs.get_DgDx(0).getMultiVector();
if (dgdx != Teuchos::null) {
if (proc == 0) {
double x = (*x_in)[0];
(*dgdx)[0][0] = -1.0 / (x*x);
}
}
RCP<Epetra_MultiVector> dgdp1 = outArgs.get_DgDp(0,0).getMultiVector();
if (dgdp1 != Teuchos::null) {
if (proc == 0) {
(*dgdp1)[0][0] = 0.0;
}
}
RCP<Epetra_MultiVector> dgdp2 = outArgs.get_DgDp(0,1).getMultiVector();
if (dgdp2 != Teuchos::null) {
if (proc == 0) {
(*dgdp2)[0][0] = 0.0;
}
}
//
// Stochastic calculation
//
#ifdef Piro_ENABLE_Stokhos
// Parse InArgs
RCP<const Stokhos::OrthogPolyBasis<int,double> > basis =
inArgs.get_sg_basis();
RCP<Stokhos::OrthogPolyExpansion<int,double> > expn =
inArgs.get_sg_expansion();
InArgs::sg_const_vector_t x_sg = inArgs.get_x_sg();
InArgs::sg_const_vector_t p1_sg = inArgs.get_p_sg(0);
InArgs::sg_const_vector_t p2_sg = inArgs.get_p_sg(1);
// Parse OutArgs
OutArgs::sg_vector_t f_sg = outArgs.get_f_sg();
if (f_sg != Teuchos::null && proc == 0) {
for (int block=0; block<f_sg->size(); block++) {
//.........这里部分代码省略.........
示例12: fabs
void EpetraExt::MultiPointModelEvaluator::evalModel( const InArgs& inArgs,
const OutArgs& outArgs ) const
{
EpetraExt::ModelEvaluator::InArgs underlyingInArgs = underlyingME->createInArgs();
EpetraExt::ModelEvaluator::OutArgs underlyingOutArgs = underlyingME->createOutArgs();
//temp code for multipoint param q vec
/*
Teuchos::RefCountPtr<Epetra_Vector> q =
Teuchos::rcp(new Epetra_Vector(*(underlyingME->get_p_map(1))));
*/
// Parse InArgs
Teuchos::RefCountPtr<const Epetra_Vector> p_in = inArgs.get_p(0);
if (p_in.get()) underlyingInArgs.set_p(0, p_in);
Teuchos::RefCountPtr<const Epetra_Vector> x_in = inArgs.get_x();
block_x->Epetra_Vector::operator=(*x_in); //copy into block vector
// Parse OutArgs
Teuchos::RefCountPtr<Epetra_Vector> f_out = outArgs.get_f();
Teuchos::RefCountPtr<Epetra_Operator> W_out = outArgs.get_W();
Teuchos::RefCountPtr<EpetraExt::BlockCrsMatrix> W_block =
Teuchos::rcp_dynamic_cast<EpetraExt::BlockCrsMatrix>(W_out);
Teuchos::RefCountPtr<Epetra_Vector> g_out;
if (underlyingNg) g_out = outArgs.get_g(0);
if (g_out.get()) g_out->PutScalar(0.0);
EpetraExt::ModelEvaluator::Derivative DfDp_out = outArgs.get_DfDp(0);
EpetraExt::ModelEvaluator::Derivative DgDx_out;
EpetraExt::ModelEvaluator::Derivative DgDp_out;
if (underlyingNg) {
DgDx_out = outArgs.get_DgDx(0);
DgDp_out = outArgs.get_DgDp(0,0);
if (!DgDx_out.isEmpty()) DgDx_out.getMultiVector()->PutScalar(0.0);
if (!DgDp_out.isEmpty()) DgDp_out.getMultiVector()->PutScalar(0.0);
}
// For mathcingProblems, g is needed to calc DgDx DgDp, so ask for
// g even if it isn't requested.
bool need_g = g_out.get();
if (matchingProblem)
if ( !DgDx_out.isEmpty() || !DgDp_out.isEmpty() ) need_g = true;
// Begin loop over Points (steps) owned on this proc
for (int i=0; i < timeStepsOnTimeDomain; i++) {
// Set MultiPoint parameter vector
underlyingInArgs.set_p(1, (*q_vec)[i]);
// Set InArgs
if(longlong) {
#ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
block_x->ExtractBlockValues(*split_x, (*rowIndex_LL)[i]);
#endif
}
else {
#ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
block_x->ExtractBlockValues(*split_x, (*rowIndex_int)[i]);
#endif
}
underlyingInArgs.set_x(split_x);
// Set OutArgs
if (f_out.get()) underlyingOutArgs.set_f(split_f);
if (need_g) underlyingOutArgs.set_g(0, split_g);
if (W_out.get()) underlyingOutArgs.set_W(split_W);
if (!DfDp_out.isEmpty()) underlyingOutArgs.set_DfDp(0, *deriv_DfDp);
if (!DgDx_out.isEmpty()) underlyingOutArgs.set_DgDx(0, *deriv_DgDx);
if (!DgDp_out.isEmpty()) underlyingOutArgs.set_DgDp(0, 0, *deriv_DgDp);
//********Eval Model ********/
underlyingME->evalModel(underlyingInArgs, underlyingOutArgs);
//********Eval Model ********/
// If matchingProblem, modify all g-related quantitites G = 0.5*(g-g*)^2 / g*^2
if (matchingProblem) {
if (need_g) {
double diff = (*split_g)[0] - (*(*matching_vec)[i])[0];
double nrmlz = fabs((*(*matching_vec)[i])[0]) + 1.0e-6;
(*split_g)[0] = 0.5 * diff * diff/(nrmlz*nrmlz);
if (!DgDx_out.isEmpty()) split_DgDx->Scale(diff/(nrmlz*nrmlz));
if (!DgDp_out.isEmpty()) split_DgDp->Scale(diff/(nrmlz*nrmlz));
}
}
// Repackage block components into global block matrx/vector/multivector
if(longlong) {
#ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
if (f_out.get()) block_f->LoadBlockValues(*split_f, (*rowIndex_LL)[i]);
//.........这里部分代码省略.........
示例13: if
void Piro::Epetra::NOXSolver::evalModel(const InArgs& inArgs,
const OutArgs& outArgs ) const
{
// Parse input parameters
for (int i=0; i<num_p; i++) {
Teuchos::RCP<const Epetra_Vector> p_in = inArgs.get_p(i);
if (p_in != Teuchos::null)
interface->inargs_set_p(p_in, i); // Pass "p_in" through to inargs
}
// Reset initial guess, if the user requests
if(piroParams->sublist("NOX").get("Reset Initial Guess",false)==true)
*currentSolution=*model->get_x_init();
// Solve
solver->reset(*currentSolution);
NOX::StatusTest::StatusType status = solver->solve();
// Print status
if (status == NOX::StatusTest::Converged)
//utils.out() << "Step Converged" << std::endl;
;
else {
utils.out() << "Nonlinear solver failed to converge!" << std::endl;
outArgs.setFailed();
}
// Get the NOX and Epetra_Vector with the final solution from the solver
(*currentSolution)=grp->getX();
Teuchos::RCP<const Epetra_Vector> finalSolution =
Teuchos::rcp(&(currentSolution->getEpetraVector()), false);
// Print solution
if (utils.isPrintType(NOX::Utils::Details)) {
utils.out() << std::endl << "Final Solution" << std::endl
<< "****************" << std::endl;
finalSolution->Print(utils.pout());
}
// Output the parameter list
if (utils.isPrintType(NOX::Utils::Parameters)) {
utils.out() << std::endl << "Final Parameters" << std::endl
<< "****************" << std::endl;
piroParams->print(utils.out());
utils.out() << std::endl;
}
// Print stats
bool print_stats = piroParams->get("Print Convergence Stats", true);
if (print_stats) {
static int totalNewtonIters=0;
static int totalKrylovIters=0;
static int stepNum=0;
int NewtonIters = piroParams->sublist("NOX").
sublist("Output").get("Nonlinear Iterations", -1000);
int KrylovIters = linsys->getLinearItersTotal() - totalKrylovIters;
int lastSolveKrylovIters = linsys->getLinearItersLastSolve();
totalNewtonIters += NewtonIters;
totalKrylovIters += KrylovIters;
stepNum++;
utils.out() << "Convergence Stats: for step #" << stepNum << " : Newton, Krylov, Kr/Ne; LastKrylov, LastTol: "
<< NewtonIters << " " << KrylovIters << " "
<< (double) KrylovIters / (double) NewtonIters << " "
<< lastSolveKrylovIters << " " << linsys->getAchievedTol() << std::endl;
if (stepNum > 1)
utils.out() << "Convergence Stats: running total: Newton, Krylov, Kr/Ne, Kr/Step: "
<< totalNewtonIters << " " << totalKrylovIters << " "
<< (double) totalKrylovIters / (double) totalNewtonIters
<< " " << (double) totalKrylovIters / (double) stepNum << std::endl;
}
//
// Do Sensitivity Calc, if requested. See 3 main steps
//
// Set inargs and outargs
EpetraExt::ModelEvaluator::InArgs model_inargs = model->createInArgs();
EpetraExt::ModelEvaluator::OutArgs model_outargs = model->createOutArgs();
model_inargs.set_x(finalSolution);
// We make different choices for layouts of df/dp, dg/dx depending on
// whether we are doing forward or adjoint sensitivities
std::string sensitivity_method = piroParams->get("Sensitivity Method",
"Forward");
bool do_sens = false;
for (int i=0; i<num_p; i++) {
// p
model_inargs.set_p(i, inArgs.get_p(i));
// df/dp
do_sens = false;
for (int j=0; j<num_g; j++) {
if (!outArgs.supports(OUT_ARG_DgDp, j, i).none() &&
!outArgs.get_DgDp(j,i).isEmpty()) {
//.........这里部分代码省略.........