void AlgebraFitFunction::init() { auto *off = this; omxState *currentState = off->matrix->currentState; AlgebraFitFunction *aff = this; aff->ff = off; ProtectedSEXP Ralg(R_do_slot(rObj, Rf_install("algebra"))); aff->algebra = omxMatrixLookupFromState1(Ralg, currentState); ProtectedSEXP Runit(R_do_slot(rObj, Rf_install("units"))); off->setUnitsFromName(CHAR(STRING_ELT(Runit, 0))); ProtectedSEXP Rgr(R_do_slot(rObj, Rf_install("gradient"))); aff->gradient = omxMatrixLookupFromState1(Rgr, currentState); if (aff->gradient) off->gradientAvailable = TRUE; ProtectedSEXP Rh(R_do_slot(rObj, Rf_install("hessian"))); aff->hessian = omxMatrixLookupFromState1(Rh, currentState); if (aff->hessian) off->hessianAvailable = TRUE; ProtectedSEXP Rverb(R_do_slot(rObj, Rf_install("verbose"))); aff->verbose = Rf_asInteger(Rverb); off->canDuplicate = true; }
typename Feel::detail::product::Product<SpaceList...>::ptrtype product( SpaceList... spaces ) { typedef typename Feel::detail::product::Product<SpaceList...> product_type; typedef typename product_type::type space_type; typedef typename product_type::ptrtype space_ptrtype; std::cout << "sizeof " << sizeof...(SpaceList) << "\n"; space_ptrtype Rh( space_type::NewFromList( spaces... ) ); return Rh; }
BlockOperator & ParBlockNonlinearForm::GetGradient(const Vector &x) const { if (pBlockGrad == NULL) { pBlockGrad = new BlockOperator(block_trueOffsets); } Array<const ParFiniteElementSpace *> pfes(fes.Size()); for (int s1=0; s1<fes.Size(); ++s1) { pfes[s1] = ParFESpace(s1); for (int s2=0; s2<fes.Size(); ++s2) { phBlockGrad(s1,s2)->Clear(); } } GetLocalGradient(x); // gradients are stored in 'Grads' if (fnfi.Size() > 0) { MFEM_ABORT("TODO: assemble contributions from shared face terms"); } for (int s1=0; s1<fes.Size(); ++s1) { for (int s2=0; s2<fes.Size(); ++s2) { OperatorHandle dA(phBlockGrad(s1,s2)->Type()), Ph(phBlockGrad(s1,s2)->Type()), Rh(phBlockGrad(s1,s2)->Type()); if (s1 == s2) { dA.MakeSquareBlockDiag(pfes[s1]->GetComm(), pfes[s1]->GlobalVSize(), pfes[s1]->GetDofOffsets(), Grads(s1,s1)); Ph.ConvertFrom(pfes[s1]->Dof_TrueDof_Matrix()); phBlockGrad(s1,s1)->MakePtAP(dA, Ph); } else { dA.MakeRectangularBlockDiag(pfes[s1]->GetComm(), pfes[s1]->GlobalVSize(), pfes[s2]->GlobalVSize(), pfes[s1]->GetDofOffsets(), pfes[s2]->GetDofOffsets(), Grads(s1,s2)); Rh.ConvertFrom(pfes[s1]->Dof_TrueDof_Matrix()); Ph.ConvertFrom(pfes[s2]->Dof_TrueDof_Matrix()); phBlockGrad(s1,s2)->MakeRAP(Rh, dA, Ph); } pBlockGrad->SetBlock(s1, s2, phBlockGrad(s1,s2)->Ptr()); } } return *pBlockGrad; }
float R(float H,float S,float Br) { return Br+Rh(H)*S*(1-Br); }