| 117 | /////////////////////////////// PUBLIC /////////////////////////////////////// |
| 118 | |
| 119 | CIBSaddlePointSolver::CIBSaddlePointSolver(std::string object_name, |
| 120 | Pointer<Database> input_db, |
| 121 | Pointer<INSStaggeredHierarchyIntegrator> navier_stokes_integrator, |
| 122 | Pointer<CIBStrategy> cib_strategy, |
| 123 | std::string default_options_prefix, |
| 124 | MPI_Comm petsc_comm) |
| 125 | : d_object_name(std::move(object_name)), |
| 126 | d_options_prefix(std::move(default_options_prefix)), |
| 127 | d_petsc_comm(petsc_comm), |
| 128 | d_ins_integrator(navier_stokes_integrator), |
| 129 | d_cib_strategy(cib_strategy), |
| 130 | d_num_rigid_parts(cib_strategy->getNumberOfRigidStructures()) |
| 131 | { |
| 132 | // Get values from the input database. |
| 133 | if (input_db) getFromInput(input_db); |
| 134 | |
| 135 | // Create the linear operator for the extended Stokes (Krylov) solver. |
| 136 | d_A = new CIBStaggeredStokesOperator(d_object_name + "CIBStaggeredStokesOperator", |
| 137 | d_cib_strategy, |
| 138 | /*homogeneous_bc*/ false); |
| 139 | d_A->setInterpScaleFactor(d_scale_interp); |
| 140 | d_A->setSpreadScaleFactor(d_scale_spread); |
| 141 | d_A->setRegularizeMobilityFactor(d_reg_mob_factor); |
| 142 | d_A->setNormalizeSpreadForce(d_normalize_spread_force); |
| 143 | |
| 144 | // Create the mobility solver and pass-in some parameters. |
| 145 | d_mob_solver = |
| 146 | new CIBMobilitySolver(d_object_name + "CIBMobilitySolver", input_db, d_ins_integrator, d_cib_strategy); |
| 147 | d_mob_solver->setInterpScale(d_scale_interp); |
| 148 | d_mob_solver->setSpreadScale(d_scale_spread); |
| 149 | d_mob_solver->setRegularizeMobilityScale(d_reg_mob_factor); |
| 150 | d_mob_solver->setNormalizeSpreadForce(d_normalize_spread_force); |
| 151 | |
| 152 | // Create the Stokes solver (LInv) for the preconditioner. |
| 153 | // Create databases for setting up LInv solver. |
| 154 | Pointer<Database> LInv_db = input_db->getDatabase("PCStokesSolver"); |
| 155 | if (LInv_db->keyExists("normalize_pressure")) d_normalize_pressure = LInv_db->getBool("normalize_pressure"); |
| 156 | if (LInv_db->keyExists("normalize_velocity")) d_normalize_velocity = LInv_db->getBool("normalize_velocity"); |
| 157 | |
| 158 | std::string stokes_solver_type = StaggeredStokesSolverManager::PETSC_KRYLOV_SOLVER; |
| 159 | Pointer<Database> stokes_solver_db = nullptr; |
| 160 | if (LInv_db->keyExists("stokes_solver_type")) |
| 161 | { |
| 162 | stokes_solver_type = LInv_db->getString("stokes_solver_type"); |
| 163 | if (LInv_db->keyExists("stokes_solver_db")) stokes_solver_db = LInv_db->getDatabase("stokes_solver_db"); |
| 164 | } |
| 165 | if (!stokes_solver_db) |
| 166 | { |
| 167 | stokes_solver_db = new MemoryDatabase("stokes_solver_db"); |
| 168 | stokes_solver_db->putString("ksp_type", "fgmres"); |
| 169 | } |
| 170 | |
| 171 | std::string stokes_precond_type = StaggeredStokesSolverManager::DEFAULT_BLOCK_PRECONDITIONER; |
| 172 | Pointer<Database> stokes_precond_db = nullptr; |
| 173 | if (LInv_db->keyExists("stokes_precond_type")) |
| 174 | { |
| 175 | stokes_precond_type = LInv_db->getString("stokes_precond_type"); |
| 176 | if (LInv_db->keyExists("stokes_precond_db")) stokes_precond_db = LInv_db->getDatabase("stokes_precond_db"); |
nothing calls this directly
no test coverage detected