MCPcopy Create free account
hub / github.com/IBAMR/IBAMR / MatVecMult_KMInv

Method MatVecMult_KMInv

src/IB/KrylovMobilitySolver.cpp:863–941  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

861} // resetKSPPC
862
863PetscErrorCode
864KrylovMobilitySolver::MatVecMult_KMInv(Mat A, Vec x, Vec y)
865{
866 PetscFunctionBeginUser;
867 void* p_ctx;
868 MatShellGetContext(A, &p_ctx);
869 auto solver = static_cast<KrylovMobilitySolver*>(p_ctx);
870 Pointer<IBStrategy> ib_method_ops = solver->d_cib_strategy;
871
872#if !defined(NDEBUG)
873 TBOX_ASSERT(solver);
874 TBOX_ASSERT(solver->d_petsc_mat);
875 TBOX_ASSERT(ib_method_ops);
876#endif
877
878 // Some constants
879 static const double gamma = solver->d_scale_spread;
880 static const double beta = solver->d_scale_interp;
881 static const double delta = solver->d_reg_mob_factor;
882 const double half_time = 0.5 * (solver->d_new_time + solver->d_current_time);
883
884 // Use homogeneous BCs with Stokes solver in the preconditioner.
885 dynamic_cast<IBTK::LinearSolver*>(solver->d_LInv.getPointer())->setHomogeneousBc(true);
886
887 // Set y:= [J L^-1 S + \delta]x
888 // 1) Spread force.
889 solver->d_samrai_temp[0]->setToScalar(0.0);
890 solver->d_cib_strategy->setConstraintForce(x, half_time, gamma);
891 ib_method_ops->spreadForce(solver->d_samrai_temp[0]->getComponentDescriptorIndex(0),
892 nullptr,
893 std::vector<Pointer<RefineSchedule<NDIM>>>(),
894 half_time);
895 if (solver->d_normalize_spread_force)
896 {
897 solver->d_cib_strategy->subtractMeanConstraintForce(
898 x, solver->d_samrai_temp[0]->getComponentDescriptorIndex(0), gamma);
899 }
900 // 2) Solve Stokes system.
901 solver->d_LInv->solveSystem(*solver->d_samrai_temp[1], *solver->d_samrai_temp[0]);
902
903 // 3a) Fill velocity ghost cells.
904 int u_data_idx = solver->d_samrai_temp[1]->getComponentDescriptorIndex(0);
905 using InterpolationTransactionComponent = IBTK::HierarchyGhostCellInterpolation::InterpolationTransactionComponent;
906 std::vector<InterpolationTransactionComponent> transaction_comps;
907 InterpolationTransactionComponent u_component(u_data_idx,
908 DATA_REFINE_TYPE,
909 USE_CF_INTERPOLATION,
910 DATA_COARSEN_TYPE,
911 BDRY_EXTRAP_TYPE,
912 CONSISTENT_TYPE_2_BDRY,
913 solver->d_u_bc_coefs,
914 solver->d_fill_pattern);
915 transaction_comps.push_back(u_component);
916 solver->d_hier_bdry_fill->resetTransactionComponents(transaction_comps);
917 static const bool homogeneous_bc = true;
918 solver->d_hier_bdry_fill->setHomogeneousBc(homogeneous_bc);
919 solver->d_hier_bdry_fill->fillData(half_time);
920 solver->d_hier_bdry_fill->resetTransactionComponents(solver->d_transaction_comps);

Callers

nothing calls this directly

Calls 13

abs_equal_epsFunction · 0.85
setConstraintForceMethod · 0.80
fillDataMethod · 0.80
setHomogeneousBcMethod · 0.45
spreadForceMethod · 0.45
solveSystemMethod · 0.45
push_backMethod · 0.45

Tested by

no test coverage detected