void move(particle_t* Particles){ double Fold[N_SIMULATION][DIM_SIMULATION]; for(int i=0;i<N_SIMULATION;i++){ updateX(Particles+i); } glutPostRedisplay(); for(int i=0;i<N_SIMULATION;i++){ for(int d=0;d<DIM_SIMULATION;d++) Fold[i][d]=Particles[i].force[d]; } computeForces(Particles); for(int i=0;i<N_SIMULATION;i++){ updateV(Particles+i,Fold[i]); // check if we are at the walls and redirect the speed! } }
/* * meaningful stats: * size * time * singluarity * deltav length * updateV info */ static int newton2(Double *fS,Double *v1,const Double *v2,const Data data,const Int *i1,const Int *i2){ static int __tmp=-1; __tmp++; Double dv[DIM]; Double deltav[DIM]; Double tmpv[DIM]; Double ddv[DIM*DIM]; Double ddv2[DIM*DIM]; memset(dv,0,sizeof(Double)*data.ndim); memset(ddv,0,sizeof(Double)*data.ndim*data.ndim); Double S0=0; Double fscore=0; const Int *i; //printf("size: %d\n",i1.p[t1+1]-i1.p[t1]); for(i=i1;i!=i2;i++){ const Double *v2_=v2+(*i)/5*data.ndim; int rankid=(*i)%5; Double xy=dot(v1,v2_,data.ndim); //update score Double score=exp(func_g_0(xy)); score=4*score-rankid; fscore+=score*score; //update S0 S0-=rankid*func_g_0(xy)+(4-rankid)*func_g_0(-xy); Double c=-rankid*func_g_1(xy)+(4-rankid)*func_g_1(-xy); //update S1 add(dv,dv,v2_,c,data.ndim); //update S2 c=-rankid*func_g_2(xy)-(4-rankid)*func_g_2(-xy); int tt; for(tt=0;tt<data.ndim*data.ndim;tt++){ ddv[tt]+=c*v2_[tt%data.ndim]*v2_[tt/data.ndim]; } //update LAMDA add(dv,dv,v1,LAMDA,data.ndim); for(tt=0;tt<data.ndim;tt++){ ddv[tt*data.ndim+tt]+=LAMDA; } } //solve equation //A*A int t2,t3; for(t2=0;t2<data.ndim*data.ndim;t2++){ ddv2[t2]=0; for(t3=0;t3<data.ndim;t3++){ ddv2[t2]+=ddv[t3*data.ndim+t2%data.ndim]*ddv[t2/data.ndim*data.ndim+t3]; } } //backup dv memcpy(tmpv,dv,sizeof(Double)*data.ndim); //A*A*tmpv=dv solve(ddv2,tmpv,data.ndim); //deltav=-A*tmpv for(t2=0;t2<data.ndim;t2++){ Double tmp=0; for(t3=0;t3<data.ndim;t3++){ tmp-=ddv[t2*data.ndim+t3]*tmpv[t3]; } deltav[t2]=tmp; } //dots<0 Double dots=dot(deltav,dv,data.ndim); if(dots>0){ fprintf(stderr,"error: %f %d %d %d\n",dots,(int)(i2-i1),__tmp,0); return 0; } *fS+=S0; return updateV(S0,dots,tmpv,deltav,v1,v2,i1,i2,data.ndim)-1; }