utilities里面几个程序
displayObj 显示obj文件
generateInterpolant
generateInterpolationMatrix
generateSurfaceMesh veg体网格转obj面网格,内部点保留
objMergeFiles
generateMassMatrix 计算质量矩阵
largeModalDeformationFactory 可以计算模态系数
interactiveDeformableSimulator 非降维模拟
reducedDynamicSolver-rt 一个降维模拟的demo
SparseMatrix类的一些函数
有一些submatrix索引
相关成员:
numSubMatrixIDs 子矩阵个数
int*** subMatrixIndices 存放各个子矩阵每一行的非零元素列号
int** subMatrixIndexLengths 存放各个子矩阵每一行的非零元素个数
SparseMatrix::BuildSubMatrixIndices(SparseMatrix & submatrix, int subMatrixID=0)
函数的作用是,假设有一个行列数相同,但是非零元是当前矩阵子集的矩阵,现在建立一个索引,记录这个矩阵的非零元在当前矩阵的物理位置(就是在数组的第几个元素)。
可以对多个矩阵建立索引,用subMatrixID指定索引号
AddSubMatrix(double factor, SparseMatrix & submatrix, int subMatrixID=0);
submatrix已经建立好索引了,快速计算 *this += factor * submatrix
BuildSuperMatrixIndices(int numFixedRows, int * fixedRows, int numFixedColumns, int * fixedColumns, SparseMatrix * superMatrix, int oneIndexed)
假定当前矩阵是某个大矩阵通过移除某些行某些列(移除的行列号记录在 fixedRows、fixedColumns)所得到的结果。要求建立一个索引,给出当前矩阵的每个元素在大矩阵的对应物理位置。
只允许一套这样的索引
SparseMatrix::AssignSuperMatrix(SparseMatrix * superMatrix)
把当前矩阵的元素的值设置为大矩阵superMatrix的对应元素,注意是大矩阵不变,修改当前矩阵,需要预先建好索引。
相关成员
int ** superMatrixIndices; 记录矩阵每个元素在大矩阵的列号
int * superRows; 当前矩阵每行在大矩阵的行号
RemoveRowsColumns(int numRemovedRowColumns, int * removedRowColumns, int oneIndexed=0)
同时移除指定的行和列,也就是第i行和第i列同时移除
ScalarMultiply(const double alpha, SparseMatrix * dest=NULL)
*dest = *this * alpha,如果dest为NULL,默认为this
AddSubMatrix(double factor, SparseMatrix & submatrix, int subMatrixID=0)
this += submatrix * factor
RemoveRows(int mFull, double * xConstrained, double * x, int numFixedRows, int * fixedRows, int oneIndexed=0)
xConstraint = x - fixedRows指定元素
隐式欧拉法
大概的思路是把二阶的微分方程化为关于速度的一阶方程,再由vi-1 迭代求解vi
迭代的具体方法是,
-
先算出ti-1时刻的各种状态(速度 位移 内力 切向刚度矩阵等等 ),代入微分方程,解出ti时刻的速度,从而知道ti时刻的各种状态
-
利用当前得到的ti时刻各种状态,代入ti-1时刻,得到对ti时刻新的估计
-
不断重复2,直到估计出的ti时刻状态变化小于给定阈值