cb-geo / mpm

CB-Geo High-Performance Material Point Method
https://www.cb-geo.com/research/mpm
Other
238 stars 82 forks source link

Semi-Implicit two-phase solver for saturated soil with incompressible flow #688

Open tianchiTJ opened 3 years ago

tianchiTJ commented 3 years ago

Summary

This RFC is to propose the Semi-Implicit two-phase solver in branch solver/two-phase-semiimplicit. The solver utilized semi-implicit Chorin's projection scheme which is mainly to be used for modeling hydraulic-coupled problem in saturated soil with incompressible fluids. This work will be carried out after both the two-phase-explicit and navier-stokes are merged into the develop branch.

Motivation

Use the Semi-Implicit two-phase solver can get a much more stable results for hydraulic-coupled problem. The time step will be free from the limitation of fluid part and almost the same with single phase MPM, then it will increase the computation efficiency. The permeability can also be defined in a wider range than the explicit solver.

Design Detail

The following classes and functionality were implemented:

  1. MPMSemiImplicitTwoPhase solver class
  2. Some necessary functions will be added into the TwoPhaseParticle
  3. The matrix equation parts will be quite similar with the solver/navier-stokes including three parts: 1) Solving the intermediate velocity; 2) Solving the pore pressure (Poisson equation); 3) Correct the velocity

a. The assembler class is made to assemble the global system of equations. First, all nodes will be assigned an active_id to specify the index of each node in the global systems of equations; this id is changing every time step as the particles move over the background grids. Then, when the explicit step is completed, a Intermediate (Momentum equations for mixture and fluid) and laplacian matrix are constructed in all cells. We store this local matrix with size of (nnodes x nnodes) as Eigen matrices in Cell along with the correction_matrix as:

  //! Local Intermediate matrix
  Eigen::MatrixXd K_inter_matrix_;
  //! Local laplacian matrix
  Eigen::MatrixXd laplacian_matrix_;
  //! Local correction matrix
  Eigen::MatrixXd correction_matrix_;

These local matrices are by default has zero sizes, and only initialized when the initialise_element_matrix function is called by the solver. Each time set, the assembler job is to organize all the cell's local stiffness matrix to a global matrix and RHS vector and to apply constraints to the assembled systems through row-column modification.

b. The linear solver solves the given assembled coefficient matrix and corresponding vectors, and it is independent of dimension. The solver_type should be specified in the input .json.

virtual Eigen::VectorXd solve(const Eigen::SparseMatrix<double>& A,
                                const Eigen::VectorXd& b,
                                std::string solver_type) = 0;

Drawbacks

The currecnt eigen solver for the matrix equations may not be efficient especially for 3D cases.

Rationale and Alternatives

After the merge of the Semi-Implicit two-phase solver, we will extend it into the two-layer Semi-Implicit two-phase solver.

Prior Art

Markert B, Heider Y, Ehlers W. Comparison of monolithic and splitting solution schemes for dynamic porous media problems[J]. International journal for numerical methods in engineering, 2010, 82(11): 1341-1383.

stale[bot] commented 3 years ago

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.

stale[bot] commented 3 years ago

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.