JNIEXPORT jint JNICALL Java_edu_berkeley_bid_CUMATD_dmv (JNIEnv *env, jobject obj, jobject ja, jint nr, jint nc, jobject jb, jobject jc, jint trans) { double *a = (double*)getPointer(env, ja); double *b = (double*)getPointer(env, jb); double *c = (double*)getPointer(env, jc); return dmv(a, nr, nc, b, c, trans); }
NOX::Abstract::Group::ReturnType LOCA::Epetra::ModelEvaluatorInterface:: computeDfDp(LOCA::MultiContinuation::AbstractGroup& grp, const vector<int>& param_ids, NOX::Abstract::MultiVector& result, bool isValidF) const { // Break result into f and df/dp NOX::Epetra::Vector& f = dynamic_cast<NOX::Epetra::Vector&>(result[0]); Epetra_Vector& epetra_f = f.getEpetraVector(); std::vector<int> dfdp_index(result.numVectors()-1); for (unsigned int i=0; i<dfdp_index.size(); i++) dfdp_index[i] = i+1; Teuchos::RefCountPtr<NOX::Epetra::MultiVector> dfdp = Teuchos::rcp_dynamic_cast<NOX::Epetra::MultiVector>(result.subView(dfdp_index)); Epetra_MultiVector& epetra_dfdp = dfdp->getEpetraMultiVector(); // Create inargs EpetraExt::ModelEvaluator::InArgs inargs = model_->createInArgs(); const NOX::Epetra::Vector& x = dynamic_cast<const NOX::Epetra::Vector&>(grp.getX()); const Epetra_Vector& epetra_x = x.getEpetraVector(); inargs.set_x(Teuchos::rcp(&epetra_x, false)); inargs.set_p(0, Teuchos::rcp(¶m_vec, false)); if (inargs.supports(EpetraExt::ModelEvaluator::IN_ARG_x_dot)) { // Create x_dot, filled with zeros if (x_dot == NULL) x_dot = new Epetra_Vector(epetra_x.Map()); inargs.set_x_dot(Teuchos::rcp(x_dot, false)); } // Create outargs EpetraExt::ModelEvaluator::OutArgs outargs = model_->createOutArgs(); if (!isValidF) { EpetraExt::ModelEvaluator::Evaluation<Epetra_Vector> eval_f; Teuchos::RefCountPtr<Epetra_Vector> F = Teuchos::rcp(&epetra_f, false); eval_f.reset(F, EpetraExt::ModelEvaluator::EVAL_TYPE_EXACT); outargs.set_f(eval_f); } Teuchos::RefCountPtr<Epetra_MultiVector> DfDp = Teuchos::rcp(&epetra_dfdp, false); Teuchos::Array<int> param_indexes(param_ids.size()); for (unsigned int i=0; i<param_ids.size(); i++) param_indexes[i] = param_ids[i]; EpetraExt::ModelEvaluator::DerivativeMultiVector dmv(DfDp, EpetraExt::ModelEvaluator::DERIV_MV_BY_COL, param_indexes); EpetraExt::ModelEvaluator::Derivative deriv(dmv); outargs.set_DfDp(0, deriv); model_->evalModel(inargs, outargs); return NOX::Abstract::Group::Ok; }
NOX::Abstract::Group::ReturnType LOCA::Thyra::Group::computeDfDpMulti(const std::vector<int>& paramIDs, NOX::Abstract::MultiVector& fdfdp, bool isValidF) { // Currently this does not work because the thyra modelevaluator is not // setting the parameter names correctly in the epetraext modelevalator, // so we are disabling this for now implement_dfdp = false; // Use default implementation if we don't want to use model evaluator, or // it doesn't support it if (!implement_dfdp || !out_args_.supports(::Thyra::ModelEvaluatorBase::OUT_ARG_DfDp, param_index).supports(::Thyra::ModelEvaluatorBase::DERIV_MV_BY_COL)) { NOX::Abstract::Group::ReturnType res = LOCA::Abstract::Group::computeDfDpMulti(paramIDs, fdfdp, isValidF); return res; } // Split fdfdp into f and df/dp int num_vecs = fdfdp.numVectors()-1; std::vector<int> index_dfdp(num_vecs); for (int i=0; i<num_vecs; i++) index_dfdp[i] = i+1; NOX::Thyra::Vector& f = dynamic_cast<NOX::Thyra::Vector&>(fdfdp[0]); Teuchos::RCP<NOX::Abstract::MultiVector> dfdp = fdfdp.subView(index_dfdp); // Right now this isn't very efficient because we have to compute // derivatives with respect to all of the parameters, not just // paramIDs. Will have to work out with Ross how to selectively get // parameter derivatives int np = params.length(); Teuchos::RCP<NOX::Thyra::MultiVector> dfdp_full = Teuchos::rcp_dynamic_cast<NOX::Thyra::MultiVector>(dfdp->clone(np)); ::Thyra::ModelEvaluatorBase::DerivativeMultiVector<double> dmv(dfdp_full->getThyraMultiVector(), ::Thyra::ModelEvaluatorBase::DERIV_MV_BY_COL); ::Thyra::ModelEvaluatorBase::Derivative<double> deriv(dmv); in_args_.set_x(x_vec_->getThyraRCPVector().assert_not_null()); if (in_args_.supports(::Thyra::ModelEvaluatorBase::IN_ARG_x_dot)) in_args_.set_x_dot(x_dot_vec); in_args_.set_p(param_index, param_thyra_vec); if (!isValidF) out_args_.set_f(f.getThyraRCPVector().assert_not_null()); out_args_.set_DfDp(param_index, deriv); // Evaluate model model_->evalModel(in_args_, out_args_); // Copy back dfdp for (int i=0; i<num_vecs; i++) (*dfdp)[i] = (*dfdp_full)[paramIDs[i]]; // Reset inargs/outargs in_args_.set_x(Teuchos::null); in_args_.set_p(param_index, Teuchos::null); out_args_.set_f(Teuchos::null); out_args_.set_DfDp(param_index, ::Thyra::ModelEvaluatorBase::Derivative<double>()); if (out_args_.isFailed()) return NOX::Abstract::Group::Failed; return NOX::Abstract::Group::Ok; }