Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorover0219 <over0219@umn.edu>2020-06-24 07:09:08 +0300
committerover0219 <over0219@umn.edu>2020-06-24 07:09:08 +0300
commit77ca7ab9b3bee0a2dc1ea0fecaafabc2d2c506ac (patch)
tree3c0a6bff10c2de330cba012d3fe0d7ef20a0a33d
parent9e2042ca033a2ff8134abd719e60292ce65e720c (diff)
init guess on x
-rw-r--r--extern/softbody/src/admmpd_solver.cpp12
1 files changed, 7 insertions, 5 deletions
diff --git a/extern/softbody/src/admmpd_solver.cpp b/extern/softbody/src/admmpd_solver.cpp
index f4956e8d476..7e0c177ea18 100644
--- a/extern/softbody/src/admmpd_solver.cpp
+++ b/extern/softbody/src/admmpd_solver.cpp
@@ -77,7 +77,6 @@ int Solver::solve(
update_constraints(options,data,collision);
// Solve Ax=b s.t. Kx=l
- data->b.noalias() = data->M_xbar + data->DtW2*(data->z-data->u);
solve_conjugate_gradients(options,data);
} // end solver iters
@@ -108,9 +107,9 @@ void Solver::init_solve(
for (int i=0; i<nx; ++i)
{
data->v.row(i) += dt*options->grav;
- data->M_xbar.row(i) =
- data->m[i] * data->x.row(i) +
- dt*data->m[i]*data->v.row(i);
+ RowVector3d xbar_i = data->x.row(i) + dt*data->v.row(i);
+ data->M_xbar.row(i) = data->m[i]*xbar_i;
+ data->x.row(i) = xbar_i; // initial geuss
}
// ADMM variables
@@ -229,9 +228,9 @@ void Solver::solve_conjugate_gradients(
BLI_assert(options != NULL);
int nx = data->x.rows();
BLI_assert(nx > 0);
- BLI_assert(data->b.rows() == nx);
BLI_assert(data->A.rows() == nx);
BLI_assert(data->A.cols() == nx);
+ BLI_assert(data->b.rows() == nx);
BLI_assert(data->K[0].cols() == nx);
BLI_assert(data->K[1].cols() == nx);
BLI_assert(data->K[2].cols() == nx);
@@ -240,6 +239,9 @@ void Solver::solve_conjugate_gradients(
BLI_assert(data->K[1].rows() == data->l.rows());
BLI_assert(data->K[2].rows() == data->l.rows());
+ // Compute RHS
+ data->b.noalias() = data->M_xbar + data->DtW2*(data->z-data->u);
+
// Solve Ax = b in parallel
auto solve_Ax_b = [](
SolverData *data_,