Decomposed Optimization Time Integration (DOT) is a domain-decomposed optimization method for fast, reliable simulation of deformation dynamics. DOT efficiently converges with frame-rate time-steps across a wide range of extreme conditions.
Decomposed Optimization Time Integration (DOT) is a domain-decomposed optimization method for fast, reliable simulation of deformation dynamics. DOT efficiently converges with frame-rate time-steps across a wide range of extreme conditions.
http://dannykaufman.io/projects/DOT/DOT.html
git clone https://github.com/liminchen/DOT
Then in DOT folder there will be
On Ubuntu:
cd DOT
python install_Ubuntu.py
On Mac:
cd DOT
python install_Mac.py
This will rebuild SuiteSparse (with MKL on Ubuntu or default on Mac) and then build DOT.
Tips on linear solver: By default DOT uses CHOLMOD (involved in SuiteSparse) to solve the linear systems. On Mac, default compilation is great, but on Ubuntu, we found that CHOLMOD compiled with MKL LAPACK and BLAS is much more performant than compiled with libopenblas and liblapack from apt-get.
Note: Prompts and sudo password might be needed to install certain packages.
Tips for Windows users: Running DOT on Windows is possible to encounter severe speed issues, which can be related to the memory management of Eigen backend. A useful suggestion is to swap out Eigen's malloc with dlmalloc.
python build.py
We provide a convenient way to run a batch of examples with a specific number of threads per linear solver using the batch.py under repo directory.
To use batch.py, first create 4 folders named 1, 8, 12, and 32 under input/, which means use these numbers to set MKL_NUM_THREADS, OMP_NUM_THREADS, VECLIB_MAXIMUM_THREADS respectively for the linear solvers when running examples under them. (This will not affect the parallelization of other parts of DOT as we are using TBB there). Then you can put the script files to be run under folder 1, 8, 12, or 32 and go to DOT/ to run
python batch.py
The python code will automatically take the name of the folder to set number of threads per linear solver to run the examples. In our experiments we ran PN, LBFGS-H(I), and GSDD with 12 threads per linear solver and all others with single thread per linear solver since for the latter ones we solve multiple linear systems simultaneously with TBB and we were on a 6-core 12-thread machine.
The output of each script will be saved into a separate folder in output/ with time tag, so no overwrites when reruning.
Note that by default we only compile 3D version of DOT, to compile and run the 2D version, please modify the DIM macro defined in src/Utils/Types.hpp and rebuild, and then you can run scripts from input/2D/.
Format: progName mode inputScriptPath [anyStringYouLike]
Example: ./build/DOT_bin 10 input/bunny5K_LTSS_DOT.txt firstTrial
energy {FCR | SNH}
FCR
: Fixed Co-rotational elasticity energySNH
: Stable Neo-Hookean elasticity energytimeIntegration {BE}
BE
: Backward Euler (default)timeStepper { Newton | LBFGSH | LBFGSHI | LBFGS | ADMM <number-of-iterations> | DOT {<number-of-subdomains> | -1 <nodes-per-block>} | ADMMDD {<number-of-subdomains> | -1 <nodes-per-block>} | LBFGSJH {<number-of-subdomains> | -1 <nodes-per-block>} | GSDD {<number-of-subdomains> | -1 <nodes-per-block>}}
Newton
: projected NewtonLBFGSH
: LBFGS-HLBFGSHI
: LBFGS with incomplete Cholesky decomposition of the beginning of time step Hessian as initializerLBFGS
: LBFGS-PDADMM
: ADMM-PDDOT
: our methodADMMDD
: [must be used without SIMD] a constrained formulation of domain decomposed elastodynamic simulation realized by ADMM. This is our initial trial. It is robust but slow to converge.LBFGSJH
: LBFGS initialized with Jacobi domain decomposition (nonoverlapped block diagonal preconditioning)GSDD
: Gauss-Seidel domain decomposition (sequential overlapped block diagonal preconditioned gradient descent)warmStart {0-5}
0
: initial position (no warm start) (xⁿ)1
: initial position + integrated velocity (xⁿ + Δt vⁿ), the one we found provides the fastest convergence but with a little bit damping if not solving to enough accuracy (1e-5 CN that we used in all of our experiments is accurate enough)2
: initial position + integrated velocity + doubly integrated gravity (xⁿ + Δt vⁿ + Δt² g), the one used in all of our experiments3
: uniformly accelerated warm start4
: symplectic Euler warm start5
: Jacobi warm startresolution <num-elements>
size <size>
time <num-seconds> <time-step>
density <density>
stiffness <young-modulus> <poisson-ratio>
turnOffGravity
script {null | scaleF | hang | stretch | squash | stretchnsquash | bend | twist | twistnstretch | twistnsns | twistnsns_old | rubberBandPull | onepoint | random | fall}
src/AnimScripter.cpp
for details)handleRatio <ratio>
ratio
must be greater than zero and less than oneshape input <mesh-file-path>
rotateModel <rot-axis-x> <rot-axis-y> <rot-axis-z> <rot-deg>
[rot-axis-x rot-axis-y rot-axis-z]
tol positiveInteger
restart <status-file-path-str>
view {orthographic | perspective}
zoom <positive-real-number>
appendStr <str>
disableCout