From 142a67fe82b830e5c7816914afa62445959c87ca Mon Sep 17 00:00:00 2001 From: Samo Penic <samo.penic@fe.uni-lj.si> Date: Tue, 05 Nov 2013 14:04:21 +0000 Subject: [PATCH] changes in bondflip call. No need to bondflip all the bonds, but only as many bonds as there are vertices. Also, rnvec seems to be not needed for bondflip, so it is commented out --- src/initial_distribution.c | 144 +++++++++++++++++++++++++---------------------- 1 files changed, 77 insertions(+), 67 deletions(-) diff --git a/src/initial_distribution.c b/src/initial_distribution.c index 6a13a23..382750b 100644 --- a/src/initial_distribution.c +++ b/src/initial_distribution.c @@ -14,8 +14,14 @@ ts_fprintf(stderr,"Starting initial_distribution on vesicle with %u shells!...\n",nshell); ts_bool retval; ts_uint no_vertices=5*nshell*nshell+2; + + ts_vesicle *vesicle=init_vesicle(no_vertices,ncmax1,ncmax2,ncmax3,stepsize); + +//TODO: debugging only. Please remove ASAP! + vesicle->bending_rigidity=25.0; + vesicle->nshell=nshell; retval = vtx_set_global_values(vesicle); retval = pentagonal_dipyramid_vertex_distribution(vesicle->vlist); @@ -25,8 +31,10 @@ retval = init_triangles(vesicle); retval = init_triangle_neighbours(vesicle); retval = init_common_vertex_triangle_neighbours(vesicle); + retval = init_normal_vectors(vesicle->tlist); retval = mean_curvature_and_energy(vesicle); ts_fprintf(stderr,"initial_distribution finished!\n"); + if(retval); return vesicle; } @@ -62,40 +70,40 @@ ts_double dx,dy; // end loop prereq /* topmost vertex */ - vtx[1]->data->x=0.0; - vtx[1]->data->y=0.0; - vtx[1]->data->z=z0*(ts_double)nshell; + vtx[1]->x=0.0; + vtx[1]->y=0.0; + vtx[1]->z=z0*(ts_double)nshell; /* starting from to in circular order on pentagrams */ for(i=1;i<=nshell;i++){ n0=2+5*i*(i-1)/2; //-1 would be for the reason that C index starts from 0 - vtx[n0]->data->x=0.0; - vtx[n0]->data->y=(ts_double)i*xl0; - vtx[n0+i]->data->x=vtx[n0]->data->y*s1; - vtx[n0+i]->data->y=vtx[n0]->data->y*c1; - vtx[n0+2*i]->data->x=vtx[n0]->data->y*s2; - vtx[n0+2*i]->data->y=vtx[n0]->data->y*c2; - vtx[n0+3*i]->data->x=-vtx[n0+2*i]->data->x; - vtx[n0+3*i]->data->y=vtx[n0+2*i]->data->y; - vtx[n0+4*i]->data->x=-vtx[n0+i]->data->x; - vtx[n0+4*i]->data->y=vtx[n0+i]->data->y; + vtx[n0]->x=0.0; + vtx[n0]->y=(ts_double)i*xl0; + vtx[n0+i]->x=vtx[n0]->y*s1; + vtx[n0+i]->y=vtx[n0]->y*c1; + vtx[n0+2*i]->x=vtx[n0]->y*s2; + vtx[n0+2*i]->y=vtx[n0]->y*c2; + vtx[n0+3*i]->x=-vtx[n0+2*i]->x; + vtx[n0+3*i]->y=vtx[n0+2*i]->y; + vtx[n0+4*i]->x=-vtx[n0+i]->x; + vtx[n0+4*i]->y=vtx[n0+i]->y; } /* vertexes on the faces of the dipyramid */ for(i=1;i<=nshell;i++){ n0=2+5*i*(i-1)/2; // -1 would be because of C! for(j=1;j<=i-1;j++){ - dx=(vtx[n0]->data->x-vtx[n0+4*i]->data->x)/(ts_double)i; - dy=(vtx[n0]->data->y-vtx[n0+4*i]->data->y)/(ts_double)i; - vtx[n0+4*i+j]->data->x=(ts_double)j*dx+vtx[n0+4*i]->data->x; - vtx[n0+4*i+j]->data->y=(ts_double)j*dy+vtx[n0+4*i]->data->y; + dx=(vtx[n0]->x-vtx[n0+4*i]->x)/(ts_double)i; + dy=(vtx[n0]->y-vtx[n0+4*i]->y)/(ts_double)i; + vtx[n0+4*i+j]->x=(ts_double)j*dx+vtx[n0+4*i]->x; + vtx[n0+4*i+j]->y=(ts_double)j*dy+vtx[n0+4*i]->y; } for(k=0;k<=3;k++){ // I would be worried about zero starting of for - dx=(vtx[n0+(k+1)*i]->data->x - vtx[n0+k*i]->data->x)/(ts_double) i; - dy=(vtx[n0+(k+1)*i]->data->y - vtx[n0+k*i]->data->y)/(ts_double) i; + dx=(vtx[n0+(k+1)*i]->x - vtx[n0+k*i]->x)/(ts_double) i; + dy=(vtx[n0+(k+1)*i]->y - vtx[n0+k*i]->y)/(ts_double) i; for(j=1; j<=i-1;j++){ - vtx[n0+k*i+j]->data->x= (ts_double)j*dx+vtx[n0+k*i]->data->x; - vtx[n0+k*i+j]->data->y= (ts_double)j*dy+vtx[n0+k*i]->data->y; + vtx[n0+k*i+j]->x= (ts_double)j*dx+vtx[n0+k*i]->x; + vtx[n0+k*i+j]->y= (ts_double)j*dy+vtx[n0+k*i]->y; } } } @@ -103,15 +111,15 @@ for(i=1;i<=nshell;i++){ n0= 2+ 5*i*(i-1)/2; for(j=0;j<=5*i-1;j++){ - vtx[n0+j]->data->z= z0*(ts_double)(nshell-i); // I would be worried about zero starting of for + vtx[n0+j]->z= z0*(ts_double)(nshell-i); // I would be worried about zero starting of for } } /* for botom part of dipyramide we calculate the positions of vertices */ for(i=2+5*nshell*(nshell+1)/2;i<=vlist->n;i++){ - vtx[i]->data->x=vtx[vlist->n - i +1]->data->x; - vtx[i]->data->y=vtx[vlist->n - i +1]->data->y; - vtx[i]->data->z=-vtx[vlist->n - i +1]->data->z; + vtx[i]->x=vtx[vlist->n - i +1]->x; + vtx[i]->y=vtx[vlist->n - i +1]->y; + vtx[i]->z=-vtx[vlist->n - i +1]->z; } for(i=1;i<=vlist->n;i++){ @@ -164,15 +172,16 @@ ts_double direct; // Something, dont know what, but could be normal of some kind for(i=1;i<=vlist->n;i++){ k++; // WHY i IS NOT GOOD?? - vtx_add_cneighbour(blist,tvtx[k], tvtx[vtx[i]->data->neigh[0]->idx+1]); //always add 1st + vtx_add_cneighbour(blist,tvtx[k], tvtx[vtx[i]->neigh[0]->idx+1]); //always add 1st jjj=1; jj=1; - for(l=2;l<=vtx[i]->data->neigh_no;l++){ - for(j=2;j<=vtx[i]->data->neigh_no;j++){ - dist2=vtx_distance_sq(vtx[i]->data->neigh[j-1],vtx[i]->data->neigh[jj-1]); - direct=vtx_direct(vtx[i],vtx[i]->data->neigh[j-1],vtx[i]->data->neigh[jj-1]); + for(l=2;l<=vtx[i]->neigh_no;l++){ + for(j=2;j<=vtx[i]->neigh_no;j++){ + dist2=vtx_distance_sq(vtx[i]->neigh[j-1],vtx[i]->neigh[jj-1]); + direct=vtx_direct(vtx[i],vtx[i]->neigh[j-1],vtx[i]->neigh[jj-1]); +// TODO: check if fabs can be used with all floating point types!! if( (fabs(dist2-A0*A0)<=eps) && (direct>0.0) && (j!=jjj) ){ - vtx_add_cneighbour(blist,tvtx[k],tvtx[vtx[i]->data->neigh[j-1]->idx+1]); + vtx_add_cneighbour(blist,tvtx[k],tvtx[vtx[i]->neigh[j-1]->idx+1]); jjj=jj; jj=j; break; @@ -204,8 +213,8 @@ ts_uint i,j,k; for(i=1;i<=vlist->n;i++){ for(j=i+1;j<=vlist->n;j++){ - for(k=0;k<vtx[i]->data->neigh_no;k++){ // has changed 0 to < instead of 1 and <= - if(vtx[i]->data->neigh[k]==vtx[j]){ //if addresses matches it is the same + for(k=0;k<vtx[i]->neigh_no;k++){ // has changed 0 to < instead of 1 and <= + if(vtx[i]->neigh[k]==vtx[j]){ //if addresses matches it is the same bond_add(blist,vtx[i],vtx[j]); break; } @@ -230,14 +239,15 @@ ts_double eps=0.001; // can we use EPS from math.h? k=0; for(i=1;i<=vesicle->vlist->n;i++){ - for(j=1;j<=vtx[i]->data->neigh_no;j++){ - for(jj=1;jj<=vtx[i]->data->neigh_no;jj++){ + for(j=1;j<=vtx[i]->neigh_no;j++){ + for(jj=1;jj<=vtx[i]->neigh_no;jj++){ // ts_fprintf(stderr,"%u: (%u,%u) neigh_no=%u ",i,j,jj,vtx[i].neigh_no); // ts_fprintf(stderr,"%e, %e",vtx[i].neigh[j-1]->x,vtx[i].neigh[jj-1]->x); - dist=vtx_distance_sq(vtx[i]->data->neigh[j-1],vtx[i]->data->neigh[jj-1]); - direct=vtx_direct(vtx[i],vtx[i]->data->neigh[j-1],vtx[i]->data->neigh[jj-1]); - if(fabs(dist-A0*A0)<=eps && direct < 0.0 && vtx[i]->data->neigh[j-1]->idx+1 > i && vtx[i]->data->neigh[jj-1]->idx+1 >i){ - triangle_add(tlist,vtx[i],vtx[i]->data->neigh[j-1],vtx[i]->data->neigh[jj-1]); + dist=vtx_distance_sq(vtx[i]->neigh[j-1],vtx[i]->neigh[jj-1]); + direct=vtx_direct(vtx[i],vtx[i]->neigh[j-1],vtx[i]->neigh[jj-1]); +// TODO: same as above + if(fabs(dist-A0*A0)<=eps && direct < 0.0 && vtx[i]->neigh[j-1]->idx+1 > i && vtx[i]->neigh[jj-1]->idx+1 >i){ + triangle_add(tlist,vtx[i],vtx[i]->neigh[j-1],vtx[i]->neigh[jj-1]); } } } @@ -248,11 +258,11 @@ for(i=0;i<tlist->n;i++){ k=0; for(j=0;j<3;j++){ - if(tlist->tria[i]->data->vertex[j]!=NULL) + if(tlist->tria[i]->vertex[j]!=NULL) k++; } if(k!=3){ - fatal("Some triangles has less than 3 vertices..",4); + fatal("Some triangles have less than 3 vertices..",4); } } if(tlist->n!=2*(vesicle->vlist->n -2)){ @@ -272,14 +282,14 @@ ts_triangle **tria=tlist->tria -1; nobo=0; for(i=1;i<=tlist->n;i++){ - i1=tria[i]->data->vertex[0]; - i2=tria[i]->data->vertex[1]; - i3=tria[i]->data->vertex[2]; + i1=tria[i]->vertex[0]; + i2=tria[i]->vertex[1]; + i3=tria[i]->vertex[2]; for(j=1;j<=tlist->n;j++){ if(j==i) continue; - j1=tria[j]->data->vertex[0]; - j2=tria[j]->data->vertex[1]; - j3=tria[j]->data->vertex[2]; + j1=tria[j]->vertex[0]; + j2=tria[j]->vertex[1]; + j3=tria[j]->vertex[2]; if((i1==j1 && i3==j2) || (i1==j2 && i3==j3) || (i1==j3 && i3==j1)){ triangle_add_neighbour(tria[i],tria[j]); nobo++; @@ -287,14 +297,14 @@ } } for(i=1;i<=tlist->n;i++){ - i1=tria[i]->data->vertex[0]; - i2=tria[i]->data->vertex[1]; - i3=tria[i]->data->vertex[2]; + i1=tria[i]->vertex[0]; + i2=tria[i]->vertex[1]; + i3=tria[i]->vertex[2]; for(j=1;j<=tlist->n;j++){ if(j==i) continue; - j1=tria[j]->data->vertex[0]; - j2=tria[j]->data->vertex[1]; - j3=tria[j]->data->vertex[2]; + j1=tria[j]->vertex[0]; + j2=tria[j]->vertex[1]; + j3=tria[j]->vertex[2]; if((i1==j1 && i2==j3) || (i1==j3 && i2==j2) || (i1==j2 && i2==j1)){ triangle_add_neighbour(tria[i],tria[j]); nobo++; @@ -302,14 +312,14 @@ } } for(i=1;i<=tlist->n;i++){ - i1=tria[i]->data->vertex[0]; - i2=tria[i]->data->vertex[1]; - i3=tria[i]->data->vertex[2]; + i1=tria[i]->vertex[0]; + i2=tria[i]->vertex[1]; + i3=tria[i]->vertex[2]; for(j=1;j<=tlist->n;j++){ if(j==i) continue; - j1=tria[j]->data->vertex[0]; - j2=tria[j]->data->vertex[1]; - j3=tria[j]->data->vertex[2]; + j1=tria[j]->vertex[0]; + j2=tria[j]->vertex[1]; + j3=tria[j]->vertex[2]; if((i2==j1 && i3==j3) || (i2==j3 && i3==j2) || (i2==j2 && i3==j1)){ triangle_add_neighbour(tria[i],tria[j]); nobo++; @@ -332,15 +342,15 @@ ts_triangle **tria=tlist->tria -1; for(i=1;i<=vesicle->vlist->n;i++){ - for(j=1;j<=vtx[i]->data->neigh_no;j++){ - k1=vtx[i]->data->neigh[j-1]; + for(j=1;j<=vtx[i]->neigh_no;j++){ + k1=vtx[i]->neigh[j-1]; jp=j+1; - if(j == vtx[i]->data->neigh_no) jp=1; - k2=vtx[i]->data->neigh[jp-1]; + if(j == vtx[i]->neigh_no) jp=1; + k2=vtx[i]->neigh[jp-1]; for(k=1;k<=tlist->n;k++){ // VERY NON-OPTIMAL!!! too many loops (vlist.n * vtx.neigh * tlist.n )! - k3=tria[k]->data->vertex[0]; - k4=tria[k]->data->vertex[1]; - k5=tria[k]->data->vertex[2]; + k3=tria[k]->vertex[0]; + k4=tria[k]->vertex[1]; + k5=tria[k]->vertex[2]; // ts_fprintf(stderr,"%u %u: k=(%u %u %u)\n",k1,k2,k3,k4,k5); if((vtx[i]==k3 && k1==k4 && k2==k5) || (vtx[i]==k4 && k1==k5 && k2==k3) || @@ -348,7 +358,7 @@ //TODO: probably something wrong with neighbour distribution. // if(vtx[i]==k3 || vtx[i]==k4 || vtx[i]==k5){ - if(i==6) ts_fprintf(stdout, "Vtx[%u] > Added to tristar!\n",i); + // if(i==6) ts_fprintf(stdout, "Vtx[%u] > Added to tristar!\n",i); vertex_add_tristar(vtx[i],tria[k]); } } -- Gitblit v1.9.3