| 861 | } // resetKSPPC |
| 862 | |
| 863 | PetscErrorCode |
| 864 | KrylovMobilitySolver::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); |
nothing calls this directly
no test coverage detected