[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12520] branches/cloth/blender/source/ blender: Introduced a selfmade AIMEX ( adaptive implicit-explicit condition into force calculation for jacobi matrices -- >results in ca.
Daniel Genrich
daniel.genrich at gmx.net
Thu Nov 8 04:31:53 CET 2007
Revision: 12520
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12520
Author: genscher
Date: 2007-11-08 04:31:52 +0100 (Thu, 08 Nov 2007)
Log Message:
-----------
Introduced a selfmade AIMEX (adaptive implicit-explicit condition into force calculation for jacobi matrices -->results in ca. 15% speedup
Modified Paths:
--------------
branches/cloth/blender/source/blender/blenkernel/intern/implicit.c
branches/cloth/blender/source/blender/blenkernel/intern/kdop.c
branches/cloth/blender/source/blender/blenkernel/intern/pointcache.c
branches/cloth/blender/source/blender/src/buttons_object.c
Modified: branches/cloth/blender/source/blender/blenkernel/intern/implicit.c
===================================================================
--- branches/cloth/blender/source/blender/blenkernel/intern/implicit.c 2007-11-08 00:06:48 UTC (rev 12519)
+++ branches/cloth/blender/source/blender/blenkernel/intern/implicit.c 2007-11-08 03:31:52 UTC (rev 12520)
@@ -691,7 +691,7 @@
static float ZERO[3][3] = {{0,0,0}, {0,0,0}, {0,0,0}};
typedef struct Implicit_Data
{
- lfVector *X, *V, *Xnew, *Vnew, *olddV, *F, *B, *dV, *z;
+ lfVector *X, *V, *Xnew, *Vnew, *F, *B, *dV, *z;
fmatrix3x3 *A, *dFdV, *dFdX, *S, *P, *Pinv, *bigI;
} Implicit_Data;
@@ -727,11 +727,10 @@
id->Xnew = create_lfvector(cloth->numverts);
id->V = create_lfvector(cloth->numverts);
id->Vnew = create_lfvector(cloth->numverts);
- id->olddV = create_lfvector(cloth->numverts);
- zero_lfvector(id->olddV, cloth->numverts);
id->F = create_lfvector(cloth->numverts);
id->B = create_lfvector(cloth->numverts);
id->dV = create_lfvector(cloth->numverts);
+ zero_lfvector(id->dV, cloth->numverts);
id->z = create_lfvector(cloth->numverts);
for(i=0;i<cloth->numverts;i++)
@@ -799,7 +798,6 @@
del_lfvector(id->Xnew);
del_lfvector(id->V);
del_lfvector(id->Vnew);
- del_lfvector(id->olddV);
del_lfvector(id->F);
del_lfvector(id->B);
del_lfvector(id->dV);
@@ -924,8 +922,6 @@
d = create_lfvector(numverts);
tmp = create_lfvector(numverts);
r = create_lfvector(numverts);
-
- // zero_lfvector(ldV, CLOTHPARTICLES);
filter(ldV, S);
add_lfvector_lfvector(ldV, ldV, z, numverts);
@@ -1174,7 +1170,7 @@
}
-DO_INLINE void cloth_calc_spring_force(ClothModifierData *clmd, ClothSpring *s, lfVector *lF, lfVector *X, lfVector *V, fmatrix3x3 *dFdV, fmatrix3x3 *dFdX)
+DO_INLINE void cloth_calc_spring_force(ClothModifierData *clmd, ClothSpring *s, lfVector *lF, lfVector *X, lfVector *V, fmatrix3x3 *dFdV, fmatrix3x3 *dFdX, float dt)
{
float extent[3];
float length = 0;
@@ -1229,19 +1225,23 @@
{
s->flags |= CLOTH_SPRING_FLAG_NEEDED;
- k = clmd->sim_parms.structural;
+ k = (clmd->sim_parms.structural*(length-L));
- mul_fvector_S(stretch_force, dir, (k*(length-L)));
+ mul_fvector_S(stretch_force, dir, k);
VECADD(s->f, s->f, stretch_force);
// Ascher & Boxman, p.21: Damping only during elonglation
- mul_fvector_S(damping_force, extent, clmd->sim_parms.Cdis * ((INPR(vel,extent)/length)));
+ mul_fvector_S(damping_force, extent, clmd->sim_parms.Cdis * 0.01 * ((INPR(vel,extent)/length)));
VECADD(s->f, s->f, damping_force);
-
- dfdx_spring_type1(s->dfdx, dir,length,L,k);
-
- dfdv_damp(s->dfdv, dir,clmd->sim_parms.Cdis);
+
+ // Formula from Ascher / Boxman, Speeding up cloth simulation
+ if((dt * (k*dt + 2 * clmd->sim_parms.Cdis * 0.01)) > 0.01 )
+ {
+ dfdx_spring_type1(s->dfdx, dir,length,L,clmd->sim_parms.structural);
+ dfdv_damp(s->dfdv, dir,clmd->sim_parms.Cdis * 0.01);
+ }
+ // printf("(dt*k*dt) ): %f, k: %f\n", (dt * (k*dt + 2 * clmd->sim_parms.Cdis * 0.01) ), k);
}
}
else // calculate force of bending springs
@@ -1252,17 +1252,19 @@
s->flags |= CLOTH_SPRING_FLAG_NEEDED;
- k = clmd->sim_parms.bending;
+ k = fbstar(length, L, clmd->sim_parms.bending, cb);
- mul_fvector_S(bending_force, dir, fbstar(length, L, k, cb));
+ mul_fvector_S(bending_force, dir, k);
VECADD(s->f, s->f, bending_force);
- if(INPR(bending_force,bending_force) > 0.13*0.13)
+ // DG: My formula to handle bending for the AIMEX scheme
+ // multiply with 1000 because of numerical problems
+ if( ((k*1000)*dt*dt) < -0.18 )
{
+ dfdx_spring_type2(s->dfdx, dir,length,L,clmd->sim_parms.bending, cb);
clmd->sim_parms.flags |= CLOTH_SIMSETTINGS_FLAG_BIG_FORCE;
}
-
- dfdx_spring_type2(s->dfdx, dir,length,L,k, cb);
+ // printf("(dt*k*dt) ): %f, k: %f\n", (dt*dt*k*-1.0), k);
}
}
}
@@ -1333,7 +1335,7 @@
}
-void cloth_calc_force(ClothModifierData *clmd, lfVector *lF, lfVector *lX, lfVector *lV, fmatrix3x3 *dFdV, fmatrix3x3 *dFdX, ListBase *effectors, float time)
+void cloth_calc_force(ClothModifierData *clmd, lfVector *lF, lfVector *lX, lfVector *lV, fmatrix3x3 *dFdV, fmatrix3x3 *dFdX, ListBase *effectors, float time, float dt)
{
/* Collect forces and derivatives: F,dFdX,dFdV */
Cloth *cloth = clmd->clothObject;
@@ -1417,7 +1419,7 @@
{
// only handle active springs
// if(((clmd->sim_parms.flags & CSIMSETT_FLAG_TEARING_ENABLED) && !(springs[i].flags & CSPRING_FLAG_DEACTIVATE))|| !(clmd->sim_parms.flags & CSIMSETT_FLAG_TEARING_ENABLED)){}
- cloth_calc_spring_force(clmd, search->link, lF, lX, lV, dFdV, dFdX);
+ cloth_calc_spring_force(clmd, search->link, lF, lX, lV, dFdV, dFdX, dt);
search = search->next;
}
@@ -1452,13 +1454,13 @@
}
-void simulate_implicit_euler(lfVector *Vnew, lfVector *lX, lfVector *lV, lfVector *lF, fmatrix3x3 *dFdV, fmatrix3x3 *dFdX, float dt, fmatrix3x3 *A, lfVector *B, lfVector *dV, fmatrix3x3 *S, lfVector *z, lfVector *olddV, fmatrix3x3 *P, fmatrix3x3 *Pinv)
+void simulate_implicit_euler(lfVector *Vnew, lfVector *lX, lfVector *lV, lfVector *lF, fmatrix3x3 *dFdV, fmatrix3x3 *dFdX, float dt, fmatrix3x3 *A, lfVector *B, lfVector *dV, fmatrix3x3 *S, lfVector *z, fmatrix3x3 *P, fmatrix3x3 *Pinv)
{
unsigned int numverts = dFdV[0].vcount;
lfVector *dFdXmV = create_lfvector(numverts);
initdiag_bfmatrix(A, I);
- zero_lfvector(dV, numverts);
+ // zero_lfvector(dV, numverts);
subadd_bfmatrixS_bfmatrixS(A, dFdV, dt, dFdX, (dt*dt));
@@ -1469,17 +1471,16 @@
itstart();
cg_filtered(dV, A, B, z, S); /* conjugate gradient algorithm to solve Ax=b */
- // cg_filtered_pre(dV, A, B, z, olddV, P, Pinv, dt);
+ // cg_filtered_pre(dV, A, B, z, dV, P, Pinv, dt);
itend();
// printf("cg_filtered calc time: %f\n", (float)itval());
- cp_lfvector(olddV, dV, numverts);
+
// advance velocities
add_lfvector_lfvector(Vnew, lV, dV, numverts);
-
del_lfvector(dFdXmV);
}
@@ -1514,12 +1515,12 @@
effectors= pdInitEffectors(ob,NULL);
// calculate
- cloth_calc_force(clmd, id->F, id->X, id->V, id->dFdV, id->dFdX, effectors, step );
+ cloth_calc_force(clmd, id->F, id->X, id->V, id->dFdV, id->dFdX, effectors, step, dt );
// check for sleeping
if(!(clmd->coll_parms.flags & CLOTH_SIMSETTINGS_FLAG_SLEEP))
{
- simulate_implicit_euler(id->Vnew, id->X, id->V, id->F, id->dFdV, id->dFdX, dt, id->A, id->B, id->dV, id->S, id->z, id->olddV, id->P, id->Pinv);
+ simulate_implicit_euler(id->Vnew, id->X, id->V, id->F, id->dFdV, id->dFdX, dt, id->A, id->B, id->dV, id->S, id->z, id->P, id->Pinv);
add_lfvector_lfvectorS(id->Xnew, id->X, id->Vnew, dt, numverts);
}
@@ -1592,8 +1593,8 @@
cp_lfvector(id->V, id->Vnew, numverts);
// calculate
- cloth_calc_force(clmd, id->F, id->X, id->V, id->dFdV, id->dFdX, effectors, step);
- simulate_implicit_euler(id->Vnew, id->X, id->V, id->F, id->dFdV, id->dFdX, dt / 2.0f, id->A, id->B, id->dV, id->S, id->z, id->olddV, id->P, id->Pinv);
+ cloth_calc_force(clmd, id->F, id->X, id->V, id->dFdV, id->dFdX, effectors, step, dt);
+ simulate_implicit_euler(id->Vnew, id->X, id->V, id->F, id->dFdV, id->dFdX, dt / 2.0f, id->A, id->B, id->dV, id->S, id->z, id->P, id->Pinv);
}
}
@@ -1781,7 +1782,7 @@
return 0;
}
-void cloth_collision_static(ClothModifierData *clmd, ClothModifierData *coll_clmd, CollisionTree *tree1, CollisionTree *tree2)
+void cloth_collision_static(ClothModifierData *clmd, LinkNode *collision_list)
{
/*
CollPair *collpair = NULL;
@@ -1794,7 +1795,7 @@
for(i = 0; i < 4; i++)
{
- collpair = (CollPair *)MEM_callocN(sizeof(CollPair), "cloth coll pair");
+ collpair = (CollPair *)MEM_callocN(sizeof(CollPair), "cloth coll pair");
cloth1 = clmd->clothObject;
cloth2 = coll_clmd->clothObject;
@@ -1865,9 +1866,8 @@
else
i++;
}
+
- // calc SIPcode (?)
-
if(i < 4)
{
// calc distance + normal
@@ -2320,6 +2320,11 @@
}
}
}
+ /*
+ // does not compile with OpenMP
+ if(!collisions)
+ break;
+ */
}
//////////////////////////////////////////////
Modified: branches/cloth/blender/source/blender/blenkernel/intern/kdop.c
===================================================================
--- branches/cloth/blender/source/blender/blenkernel/intern/kdop.c 2007-11-08 00:06:48 UTC (rev 12519)
+++ branches/cloth/blender/source/blender/blenkernel/intern/kdop.c 2007-11-08 03:31:52 UTC (rev 12520)
@@ -802,7 +802,9 @@
VECCOPY(collpair->point_indexB, tree2->point_index);
collpair->point_indexB[3] = tree2->point_index[3];
- BLI_linklist_append(&collision_list[0], collpair);
+ // we use prepend because lots of insertions at end
+ // of list are horrible slow!
+ BLI_linklist_prepend(&collision_list[0], collpair);
return 1;
}
Modified: branches/cloth/blender/source/blender/blenkernel/intern/pointcache.c
===================================================================
--- branches/cloth/blender/source/blender/blenkernel/intern/pointcache.c 2007-11-08 00:06:48 UTC (rev 12519)
+++ branches/cloth/blender/source/blender/blenkernel/intern/pointcache.c 2007-11-08 03:31:52 UTC (rev 12520)
@@ -104,7 +104,7 @@
if (mode=='r') {
if (!BLI_exists(filename)) {
- printf("Error, file does not exist '%s'\n", filename);
+ // printf("Error, file does not exist '%s'\n", filename);
return NULL;
}
fp = fopen(filename, "rb");
Modified: branches/cloth/blender/source/blender/src/buttons_object.c
===================================================================
--- branches/cloth/blender/source/blender/src/buttons_object.c 2007-11-08 00:06:48 UTC (rev 12519)
+++ branches/cloth/blender/source/blender/src/buttons_object.c 2007-11-08 03:31:52 UTC (rev 12520)
@@ -3176,7 +3176,7 @@
uiBlockBeginAlign(block);
uiDefButF(block, NUM, B_CLOTH_RENEW, "StructStiff:", 10,170,150,20, &clmd->sim_parms.structural, 1.0, 10000.0, 100, 0, "Overall stiffness of structure");
uiDefButF(block, NUM, B_CLOTH_RENEW, "BendStiff:", 160,170,150,20, &clmd->sim_parms.bending, 0.0, 10000.0, 1000, 0, "Wrinkle possibility");
- uiDefButI(block, NUM, B_CLOTH_RENEW, "Quality:", 10,150,150,20, &clmd->sim_parms.stepsPerFrame, 1.0, 100.0, 5, 0, "Quality of the simulation (higher=>better=>slower)");
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list