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

Method CIBSaddlePointSolver

src/IB/CIBSaddlePointSolver.cpp:119–315  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

117/////////////////////////////// PUBLIC ///////////////////////////////////////
118
119CIBSaddlePointSolver::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");

Callers

nothing calls this directly

Tested by

no test coverage detected