From 8f6a69d8fddcae6b54d25cf02dd56f0afce6a075 Mon Sep 17 00:00:00 2001 From: Samo Penic <samo.penic@gmail.com> Date: Thu, 23 Feb 2012 16:35:11 +0000 Subject: [PATCH] vertex data removed and memory leaks fixed --- src/cell.c | 6 src/main.c | 6 src/io.c | 58 +++--- src/vesicle.c | 6 src/initial_distribution.c | 90 +++++---- src/general.h | 12 - src/vertexmove.c | 68 ++++--- src/shdiscover.c | 16 src/vertex.c | 139 ++++++--------- src/energy.c | 60 +++--- src/frame.c | 8 src/triangle.c | 12 src/vertex.h | 2 13 files changed, 228 insertions(+), 255 deletions(-) diff --git a/src/cell.c b/src/cell.c index 18586ee..47d7fab 100644 --- a/src/cell.c +++ b/src/cell.c @@ -49,9 +49,9 @@ ts_uint cellidx; ts_uint ncx, ncy,ncz; ts_cell_list *clist=vesicle->clist; - ncx=(ts_uint)((vtx->data->x-vesicle->cm[0])*clist->dcell+clist->shift); - ncy=(ts_uint)((vtx->data->y-vesicle->cm[1])*clist->dcell+clist->shift); - ncz=(ts_uint)((vtx->data->z-vesicle->cm[2])*clist->dcell+clist->shift); + ncx=(ts_uint)((vtx->x-vesicle->cm[0])*clist->dcell+clist->shift); + ncy=(ts_uint)((vtx->y-vesicle->cm[1])*clist->dcell+clist->shift); + ncz=(ts_uint)((vtx->z-vesicle->cm[2])*clist->dcell+clist->shift); if(ncx == clist->ncmax[0]-1 || ncx == 2){ fatal("Vesicle is positioned outside the cell covered area. Coordinate x is the problem.",1500); diff --git a/src/energy.c b/src/energy.c index 7cd96f5..4d93753 100644 --- a/src/energy.c +++ b/src/energy.c @@ -23,7 +23,7 @@ inline ts_bool energy_vertex(ts_vertex *vtx){ // ts_vertex *vtx=&vlist->vertex[n]-1; // Caution! 0 Indexed value! // ts_triangle *tristar=vtx->tristar-1; - ts_vertex_data *data=vtx->data; + //ts_vertex_data *data=vtx->data; ts_uint jj; ts_uint jjp,jjm; ts_vertex *j,*jp, *jm; @@ -31,21 +31,21 @@ ts_double s=0,xh=0,yh=0,zh=0,txn=0,tyn=0,tzn=0; ts_double x1,x2,x3,ctp,ctm,tot,xlen; ts_double h,ht; - for(jj=1; jj<=data->neigh_no;jj++){ + for(jj=1; jj<=vtx->neigh_no;jj++){ jjp=jj+1; - if(jjp>data->neigh_no) jjp=1; + if(jjp>vtx->neigh_no) jjp=1; jjm=jj-1; - if(jjm<1) jjm=data->neigh_no; - j=data->neigh[jj-1]; - jp=data->neigh[jjp-1]; - jm=data->neigh[jjm-1]; + if(jjm<1) jjm=vtx->neigh_no; + j=vtx->neigh[jj-1]; + jp=vtx->neigh[jjp-1]; + jm=vtx->neigh[jjm-1]; // printf("tristar_no=%u, neigh_no=%u, jj=%u\n",data->tristar_no,data->neigh_no,jj); - jt=data->tristar[jj-1]; + jt=vtx->tristar[jj-1]; x1=vtx_distance_sq(vtx,jp); //shouldn't be zero! x2=vtx_distance_sq(j,jp); // shouldn't be zero! - x3=(j->data->x-jp->data->x)*(data->x-jp->data->x)+ - (j->data->y-jp->data->y)*(data->y-jp->data->y)+ - (j->data->z-jp->data->z)*(data->z-jp->data->z); + x3=(j->x-jp->x)*(vtx->x-jp->x)+ + (j->y-jp->y)*(vtx->y-jp->y)+ + (j->z-jp->z)*(vtx->z-jp->z); #ifdef TS_DOUBLE_DOUBLE ctp=x3/sqrt(x1*x2-x3*x3); @@ -58,9 +58,9 @@ #endif x1=vtx_distance_sq(vtx,jm); x2=vtx_distance_sq(j,jm); - x3=(j->data->x-jm->data->x)*(data->x-jm->data->x)+ - (j->data->y-jm->data->y)*(data->y-jm->data->y)+ - (j->data->z-jm->data->z)*(data->z-jm->data->z); + x3=(j->x-jm->x)*(vtx->x-jm->x)+ + (j->y-jm->y)*(vtx->y-jm->y)+ + (j->z-jm->z)*(vtx->z-jm->z); #ifdef TS_DOUBLE_DOUBLE ctm=x3/sqrt(x1*x2-x3*x3); #endif @@ -74,21 +74,21 @@ tot=0.5*tot; xlen=vtx_distance_sq(j,vtx); #ifdef TS_DOUBLE_DOUBLE - data->bond[jj-1]->bond_length=sqrt(xlen); + vtx->bond[jj-1]->bond_length=sqrt(xlen); #endif #ifdef TS_DOUBLE_FLOAT - data->bond[jj-1]->bond_length=sqrtf(xlen); + vtx->bond[jj-1]->bond_length=sqrtf(xlen); #endif #ifdef TS_DOUBLE_LONGDOUBLE - data->bond[jj-1]->bond_length=sqrtl(xlen); + vtx->bond[jj-1]->bond_length=sqrtl(xlen); #endif - data->bond[jj-1]->bond_length_dual=tot*data->bond[jj-1]->bond_length; + vtx->bond[jj-1]->bond_length_dual=tot*vtx->bond[jj-1]->bond_length; s+=tot*xlen; - xh+=tot*(j->data->x - data->x); - yh+=tot*(j->data->y - data->y); - zh+=tot*(j->data->z - data->z); + xh+=tot*(j->x - vtx->x); + yh+=tot*(j->y - vtx->y); + zh+=tot*(j->z - vtx->z); txn+=jt->xnorm; tyn+=jt->ynorm; tzn+=jt->znorm; @@ -99,29 +99,29 @@ s=s/4.0; #ifdef TS_DOUBLE_DOUBLE if(ht>=0.0) { - data->curvature=sqrt(h); + vtx->curvature=sqrt(h); } else { - data->curvature=-sqrt(h); + vtx->curvature=-sqrt(h); } #endif #ifdef TS_DOUBLE_FLOAT if(ht>=0.0) { - data->curvature=sqrtf(h); + vtx->curvature=sqrtf(h); } else { - data->curvature=-sqrtf(h); + vtx->curvature=-sqrtf(h); } #endif #ifdef TS_DOUBLE_LONGDOUBLE if(ht>=0.0) { - data->curvature=sqrtl(h); + vtx->curvature=sqrtl(h); } else { - data->curvature=-sqrtl(h); + vtx->curvature=-sqrtl(h); } #endif -// What is vtx->data->c?????????????? Here it is 0! +// What is vtx->c?????????????? Here it is 0! // c is forced curvature energy for each vertex. Should be set to zero for -// norman circumstances. - data->energy=0.5*s*(data->curvature/s-data->c)*(data->curvature/s-data->c); +// normal circumstances. + vtx->energy=0.5*s*(vtx->curvature/s-vtx->c)*(vtx->curvature/s-vtx->c); return TS_SUCCESS; } diff --git a/src/frame.c b/src/frame.c index a4a9d32..63a4f7b 100644 --- a/src/frame.c +++ b/src/frame.c @@ -9,9 +9,9 @@ vesicle->cm[1]=0; vesicle->cm[2]=0; for(i=0;i<n;i++){ - vesicle->cm[0]+=vtx[i]->data->x; - vesicle->cm[1]+=vtx[i]->data->y; - vesicle->cm[2]+=vtx[i]->data->z; + vesicle->cm[0]+=vtx[i]->x; + vesicle->cm[1]+=vtx[i]->y; + vesicle->cm[2]+=vtx[i]->z; } vesicle->cm[0]/=(ts_float)n; vesicle->cm[1]/=(ts_float)n; @@ -30,7 +30,7 @@ cell_list_cell_occupation_clear(vesicle->clist); for(i=0;i<n;i++){ cellidx=vertex_self_avoidance(vesicle, vesicle->vlist->vtx[i]); - vesicle->vlist->vtx[i]->data->cell=vesicle->clist->cell[cellidx]; + vesicle->vlist->vtx[i]->cell=vesicle->clist->cell[cellidx]; cell_add_vertex(vesicle->clist->cell[cellidx],vesicle->vlist->vtx[i]); diff --git a/src/general.h b/src/general.h index 6d2ab06..aff7680 100644 --- a/src/general.h +++ b/src/general.h @@ -112,10 +112,10 @@ /** @brief Data structure of all data connected to a vertex * - * ts_vertex_data holds the data for one single point (bead, vertex). To understand how to use it + * ts_vertex holds the data for one single point (bead, vertex). To understand how to use it * here is a detailed description of the fields in the data structure. */ -struct ts_vertex_data { - ts_uint idx; /**< Represents index of the vertex point. Should become obsolete, since it is also present in ts_vertex structure. */ +struct ts_vertex { + ts_uint idx; ts_double x; /**< The x coordinate of vertex. */ ts_double y; /**< The y coordinate of vertex. */ ts_double z; /**< The z coordinate of vertex. */ @@ -134,12 +134,6 @@ ts_double xk; ts_double c; ts_uint id; -}; -typedef struct ts_vertex_data ts_vertex_data; - -struct ts_vertex { - ts_uint idx; - ts_vertex_data *data; }; typedef struct ts_vertex ts_vertex; diff --git a/src/initial_distribution.c b/src/initial_distribution.c index 0f59aec..a7a8202 100644 --- a/src/initial_distribution.c +++ b/src/initial_distribution.c @@ -64,40 +64,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; } } } @@ -105,15 +105,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++){ @@ -166,15 +166,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; @@ -206,8 +207,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; } @@ -232,14 +233,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]); } } } @@ -254,7 +256,7 @@ 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)){ @@ -334,11 +336,11 @@ 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]->vertex[0]; k4=tria[k]->vertex[1]; diff --git a/src/io.c b/src/io.c index 8688067..7421f0d 100644 --- a/src/io.c +++ b/src/io.c @@ -15,7 +15,7 @@ printf("Number of vertices: %u\n",vlist->n); for(i=0;i<vlist->n;i++){ printf("%u: %f %f %f\n", -vlist->vtx[i]->idx,vlist->vtx[i]->data->x, vlist->vtx[i]->data->y, vlist->vtx[i]->data->z); +vlist->vtx[i]->idx,vlist->vtx[i]->x, vlist->vtx[i]->y, vlist->vtx[i]->z); } return TS_SUCCESS; } @@ -25,10 +25,10 @@ ts_vertex **vtx=vlist->vtx; printf("Vertex id(neigh no): (neighvertex coord) (neighvertex coord) ...\n"); for(i=0;i<vlist->n;i++){ - printf("%u(%u): ",vtx[i]->idx,vtx[i]->data->neigh_no); - for(j=0;j<vtx[i]->data->neigh_no;j++){ - printf("(%f,%f,%f)",vtx[i]->data->neigh[j]->data->x, -vtx[i]->data->neigh[j]->data->y,vtx[i]->data->neigh[j]->data->z); + printf("%u(%u): ",vtx[i]->idx,vtx[i]->neigh_no); + for(j=0;j<vtx[i]->neigh_no;j++){ + printf("(%f,%f,%f)",vtx[i]->neigh[j]->x, +vtx[i]->neigh[j]->y,vtx[i]->neigh[j]->z); } printf("\n"); } @@ -47,7 +47,7 @@ return TS_FAIL; } for(i=0;i<vlist->n;i++) - fprintf(fh," %E\t%E\t%E\n",vtx[i]->data->x,vtx[i]->data->y, vtx[i]->data->z); + fprintf(fh," %E\t%E\t%E\n",vtx[i]->x,vtx[i]->y, vtx[i]->z); fclose(fh); return TS_SUCCESS; @@ -57,11 +57,11 @@ ts_bool fprint_vertex_list(FILE *fh,ts_vertex_list *vlist){ ts_uint i,j; for(i=0;i<vlist->n;i++){ - fprintf(fh," %.17E\t%.17E\t%.17E\t%u\n",vlist->vtx[i]->data->x, - vlist->vtx[i]->data->y, vlist->vtx[i]->data->z, - vlist->vtx[i]->data->neigh_no); - for(j=0;j<vlist->vtx[i]->data->neigh_no;j++){ - fprintf(fh,"\t%u",(ts_uint)(vlist->vtx[i]->data->neigh[j]->idx)); + fprintf(fh," %.17E\t%.17E\t%.17E\t%u\n",vlist->vtx[i]->x, + vlist->vtx[i]->y, vlist->vtx[i]->z, + vlist->vtx[i]->neigh_no); + for(j=0;j<vlist->vtx[i]->neigh_no;j++){ + fprintf(fh,"\t%u",(ts_uint)(vlist->vtx[i]->neigh[j]->idx)); //-vlist->vtx+1)); } fprintf(fh,"\n"); @@ -72,9 +72,9 @@ ts_bool fprint_tristar(FILE *fh, ts_vesicle *vesicle){ ts_uint i,j; for(i=0;i<vesicle->vlist->n;i++){ - fprintf(fh,"\t%u",vesicle->vlist->vtx[i]->data->tristar_no); - for(j=0;j<vesicle->vlist->vtx[i]->data->tristar_no;j++){ - fprintf(fh,"\t%u",(ts_uint)(vesicle->vlist->vtx[i]->data->tristar[j]->idx));//-vesicle->tlist->tria+1)); + fprintf(fh,"\t%u",vesicle->vlist->vtx[i]->tristar_no); + for(j=0;j<vesicle->vlist->vtx[i]->tristar_no;j++){ + fprintf(fh,"\t%u",(ts_uint)(vesicle->vlist->vtx[i]->tristar[j]->idx));//-vesicle->tlist->tria+1)); } fprintf(fh,"\n"); } @@ -105,14 +105,14 @@ ts_uint i,j; for(i=0;i<vlist->n;i++){ fprintf(fh," %.17E\t%.17E\t%.17E\t%.17E\t%.17E\t%u\n", - vlist->vtx[i]->data->xk,vlist->vtx[i]->data->c,vlist->vtx[i]->data->energy, - vlist->vtx[i]->data->energy_h, vlist->vtx[i]->data->curvature, 0); - for(j=0;j<vlist->vtx[i]->data->neigh_no;j++){ - fprintf(fh," %.17E", vlist->vtx[i]->data->bond[j]->bond_length_dual); + vlist->vtx[i]->xk,vlist->vtx[i]->c,vlist->vtx[i]->energy, + vlist->vtx[i]->energy_h, vlist->vtx[i]->curvature, 0); + for(j=0;j<vlist->vtx[i]->neigh_no;j++){ + fprintf(fh," %.17E", vlist->vtx[i]->bond[j]->bond_length_dual); } fprintf(fh,"\n"); - for(j=0;j<vlist->vtx[i]->data->neigh_no;j++){ - fprintf(fh," %.17E", vlist->vtx[i]->data->bond[j]->bond_length); + for(j=0;j<vlist->vtx[i]->neigh_no;j++){ + fprintf(fh," %.17E", vlist->vtx[i]->bond[j]->bond_length); } fprintf(fh,"\n"); } @@ -226,7 +226,7 @@ fprintf(fh,"</DataArray>\n</PointData>\n<CellData>\n</CellData>\n<Points>\n<DataArray type=\"Float64\" Name=\"Koordinate tock\" NumberOfComponents=\"3\" format=\"ascii\">\n"); for(i=0;i<vlist->n;i++){ - fprintf(fh,"%e %e %e\n",vtx[i]->data->x,vtx[i]->data->y, vtx[i]->data->z); + fprintf(fh,"%e %e %e\n",vtx[i]->x,vtx[i]->y, vtx[i]->z); } fprintf(fh,"</DataArray>\n</Points>\n<Cells>\n<DataArray type=\"Int64\" Name=\"connectivity\" format=\"ascii\">"); @@ -270,7 +270,7 @@ fprintf(fh,"DATASET UNSTRUCTURED_GRID\n"); fprintf(fh,"POINTS %u double\n", vlist->n); for(i=0;i<vlist->n;i++){ - fprintf(fh,"%e %e %e\n",vtx[i]->data->x,vtx[i]->data->y, vtx[i]->data->z); + fprintf(fh,"%e %e %e\n",vtx[i]->x,vtx[i]->y, vtx[i]->z); } fprintf(fh,"CELLS %u %u\n",blist->n,3*blist->n); @@ -286,7 +286,7 @@ fprintf(fh,"LOOKUP_TABLE default\n"); for(i=0;i<vlist->n;i++) - fprintf(fh,"%u\n",vtx[i]->data->idx); + fprintf(fh,"%u\n",vtx[i]->idx); fclose(fh); return TS_SUCCESS; @@ -351,11 +351,11 @@ vesicle->vlist=init_vertex_list(nvtx); vlist=vesicle->vlist; for(i=0;i<nvtx;i++){ - // fscanf(fh,"%F %F %F",&vlist->vtx[i]->data->x,&vlist->vtx[i]->data->y,&vlist->vtx[i]->data->z); + // fscanf(fh,"%F %F %F",&vlist->vtx[i]->x,&vlist->vtx[i]->y,&vlist->vtx[i]->z); retval=fscanf(fh,"%F %F %F",&x,&y,&z); - vlist->vtx[i]->data->x=x; - vlist->vtx[i]->data->y=y; - vlist->vtx[i]->data->z=z; + vlist->vtx[i]->x=x; + vlist->vtx[i]->y=y; + vlist->vtx[i]->z=z; } for(i=0;i<nedges;i++){ retval=fscanf(fh,"%u %u",&vtxi1,&vtxi2); @@ -368,8 +368,8 @@ /* for(i=0;i<ntria;i++){ retval=fscanf(fh,"%u %u %u", &bi1, &bi2, &bi3); - vtxi1=vesicle->blist->data->vertex1->idx; - vtxi2=vesicle->blist->data->vertex1->idx; + vtxi1=vesicle->blist->vertex1->idx; + vtxi2=vesicle->blist->vertex1->idx; } */ diff --git a/src/main.c b/src/main.c index 94e64ec..b846658 100644 --- a/src/main.c +++ b/src/main.c @@ -36,8 +36,8 @@ retval=vtx_remove_neighbour(vlist->vtx[0],vlist->vtx[1]); vtx_add_neighbour(vlist->vtx[0],vlist->vtx[1]); -vlist->vtx[0]->data->x=1.0; -vlist->vtx[0]->data->x=1.1; +vlist->vtx[0]->x=1.0; +vlist->vtx[0]->x=1.1; vlist1=vertex_list_copy(vlist); bond_add(blist, vlist->vtx[1],vlist->vtx[0]); triangle_add(tlist,vlist->vtx[1],vlist->vtx[2],vlist->vtx[3]); @@ -47,7 +47,7 @@ printf("Cell idx=1 has vertices=%u\n",clist->cell[0]->nvertex); cell_add_vertex(clist->cell[0], vlist->vtx[0]); printf("Cell idx=1 has vertices=%u\n",clist->cell[0]->nvertex); -printf("Cell idx=1 has vertex[0] has x coordinate=%e\n",clist->cell[0]->vertex[0]->data->x); +printf("Cell idx=1 has vertex[0] has x coordinate=%e\n",clist->cell[0]->vertex[0]->x); cell_list_cell_occupation_clear(clist); printf("Cell idx=1 has vertices=%u\n",clist->cell[0]->nvertex); cell_add_vertex(clist->cell[0], vlist->vtx[0]); diff --git a/src/shdiscover.c b/src/shdiscover.c index f16239f..008d522 100644 --- a/src/shdiscover.c +++ b/src/shdiscover.c @@ -42,17 +42,17 @@ /*we calculate new position of each vertex of vesicle */ for(i=0;i<n;i++){ - fi=atan2(vlist->vtx[i]->data->y, vlist->vtx[i]->data->x); + fi=atan2(vlist->vtx[i]->y, vlist->vtx[i]->x); /* theta=atan2( sqrt(vlist->vtx[i]->data->x*vlist->vtx[i]->data->x + vlist->vtx[i]->data->y*vlist->vtx[i]->data->y), vlist->vtx[i]->data->z ); */ theta=acos( - vlist->vtx[i]->data->z / - sqrt(vlist->vtx[i]->data->x*vlist->vtx[i]->data->x + - vlist->vtx[i]->data->y*vlist->vtx[i]->data->y+ - vlist->vtx[i]->data->z*vlist->vtx[i]->data->z) + vlist->vtx[i]->z / + sqrt(vlist->vtx[i]->x*vlist->vtx[i]->x + + vlist->vtx[i]->y*vlist->vtx[i]->y+ + vlist->vtx[i]->z*vlist->vtx[i]->z) ); @@ -67,9 +67,9 @@ /*ts_fprintf(stdout,"l=%d, m=%d, u=%s\n",l,m,argv[j]);*/ } - vlist->vtx[i]->data->z=fabs(r)*cos(theta); - vlist->vtx[i]->data->x=fabs(r)*sin(theta)*cos(fi); - vlist->vtx[i]->data->y=fabs(r)*sin(theta)*sin(fi); + vlist->vtx[i]->z=fabs(r)*cos(theta); + vlist->vtx[i]->x=fabs(r)*sin(theta)*cos(fi); + vlist->vtx[i]->y=fabs(r)*sin(theta)*sin(fi); } write_vertex_xml_file(vesicle,0); diff --git a/src/triangle.c b/src/triangle.c index f842130..bcd074b 100644 --- a/src/triangle.c +++ b/src/triangle.c @@ -194,12 +194,12 @@ */ ts_bool triangle_normal_vector(ts_triangle *tria){ ts_double x21,x31,y21,y31,z21,z31,xden; - x21=tria->vertex[1]->data->x - tria->vertex[0]->data->x; - x31=tria->vertex[2]->data->x - tria->vertex[0]->data->x; - y21=tria->vertex[1]->data->y - tria->vertex[0]->data->y; - y31=tria->vertex[2]->data->y - tria->vertex[0]->data->y; - z21=tria->vertex[1]->data->z - tria->vertex[0]->data->z; - z31=tria->vertex[2]->data->z - tria->vertex[0]->data->z; + x21=tria->vertex[1]->x - tria->vertex[0]->x; + x31=tria->vertex[2]->x - tria->vertex[0]->x; + y21=tria->vertex[1]->y - tria->vertex[0]->y; + y31=tria->vertex[2]->y - tria->vertex[0]->y; + z21=tria->vertex[1]->z - tria->vertex[0]->z; + z31=tria->vertex[2]->z - tria->vertex[0]->z; tria->xnorm=y21*z31 - z21*y31; tria->ynorm=z21*x31 - x21*z31; diff --git a/src/vertex.c b/src/vertex.c index b5f8519..4a6aeb9 100644 --- a/src/vertex.c +++ b/src/vertex.c @@ -8,7 +8,6 @@ ts_vertex_list *init_vertex_list(ts_uint N){ ts_int i; - ts_vertex *tlist; ts_vertex_list *vlist=(ts_vertex_list *)malloc(sizeof(ts_vertex_list)); if(N==0){ @@ -18,27 +17,16 @@ return vlist; } - vlist->vtx=(ts_vertex **)malloc(N*sizeof(ts_vertex *)); - tlist=(ts_vertex *)malloc(N*sizeof(ts_vertex)); - if(vlist->vtx==NULL || tlist==NULL) + vlist->vtx=(ts_vertex **)calloc(N,sizeof(ts_vertex *)); + if(vlist->vtx==NULL) fatal("Fatal error reserving memory space for vertex list! Could number of requsted vertices be too large?", 100); for(i=0;i<N;i++) { - vlist->vtx[i]=&tlist[i]; - vlist->vtx[i]->data=init_vertex_data(); + vlist->vtx[i]=(ts_vertex *)calloc(1,sizeof(ts_vertex)); vlist->vtx[i]->idx=i; } vlist->n=N; return vlist; } - -ts_vertex_data *init_vertex_data(){ - ts_vertex_data *data; - data=(ts_vertex_data *)calloc(1,sizeof(ts_vertex_data)); - if(data==NULL) - fatal("Fatal error reserving memory space for ts_vertex! Memory full?", 100); - return data; -} - ts_bool vtx_add_neighbour(ts_vertex *vtx, ts_vertex *nvtx){ ts_uint i; @@ -46,12 +34,12 @@ if(vtx==NULL || nvtx==NULL) return TS_FAIL; /*if it is already a neighbour don't add it to the list */ - for(i=0; i<vtx->data->neigh_no;i++){ - if(vtx->data->neigh[i]==nvtx) return TS_FAIL; + for(i=0; i<vtx->neigh_no;i++){ + if(vtx->neigh[i]==nvtx) return TS_FAIL; } - ts_uint nn=++vtx->data->neigh_no; - vtx->data->neigh=(ts_vertex **)realloc(vtx->data->neigh, nn*sizeof(ts_vertex *)); - vtx->data->neigh[nn-1]=nvtx; + ts_uint nn=++vtx->neigh_no; + vtx->neigh=(ts_vertex **)realloc(vtx->neigh, nn*sizeof(ts_vertex *)); + vtx->neigh[nn-1]=nvtx; /* This was a bug in creating DIPYRAMID (the neighbours were not in right * order). */ @@ -74,31 +62,31 @@ /* find a neighbour */ /* remove it from the list while shifting remaining neighbours up */ ts_uint i,j=0; - for(i=0;i<vtx->data->neigh_no;i++){ - if(vtx->data->neigh[i]!=nvtx){ - vtx->data->neigh[j]=vtx->data->neigh[i]; + for(i=0;i<vtx->neigh_no;i++){ + if(vtx->neigh[i]!=nvtx){ + vtx->neigh[j]=vtx->neigh[i]; j++; } } /* resize memory. potentionally time consuming */ - vtx->data->neigh_no--; - vtx->data->neigh=(ts_vertex **)realloc(vtx->data->neigh,vtx->data->neigh_no*sizeof(ts_vertex *)); - if(vtx->data->neigh == NULL && vtx->data->neigh_no!=0) + vtx->neigh_no--; + vtx->neigh=(ts_vertex **)realloc(vtx->neigh,vtx->neigh_no*sizeof(ts_vertex *)); + if(vtx->neigh == NULL && vtx->neigh_no!=0) fatal("Reallocation of memory failed during removal of vertex neighbour in vtx_remove_neighbour",100); /* repeat for the neighbour */ /* find a neighbour */ /* remove it from the list while shifting remaining neighbours up */ - for(i=0;i<nvtx->data->neigh_no;i++){ - if(nvtx->data->neigh[i]!=vtx){ - nvtx->data->neigh[j]=nvtx->data->neigh[i]; + for(i=0;i<nvtx->neigh_no;i++){ + if(nvtx->neigh[i]!=vtx){ + nvtx->neigh[j]=nvtx->neigh[i]; j++; } } /* resize memory. potentionally time consuming. */ - nvtx->data->neigh_no--; - nvtx->data->neigh=(ts_vertex **)realloc(nvtx->data->neigh,nvtx->data->neigh_no*sizeof(ts_vertex *)); - if(nvtx->data->neigh == NULL && nvtx->data->neigh_no!=0) + nvtx->neigh_no--; + nvtx->neigh=(ts_vertex **)realloc(nvtx->neigh,nvtx->neigh_no*sizeof(ts_vertex *)); + if(nvtx->neigh == NULL && nvtx->neigh_no!=0) fatal("Reallocation of memory failed during removal of vertex neighbour in vtx_remove_neighbour",100); return TS_SUCCESS; @@ -110,13 +98,13 @@ ts_bond *bond; bond=bond_add(blist,vtx1,vtx2); if(bond==NULL) return TS_FAIL; - vtx1->data->bond_no++; + vtx1->bond_no++; // vtx2->data->bond_no++; - vtx1->data->bond=(ts_bond **)realloc(vtx1->data->bond, vtx1->data->bond_no*sizeof(ts_bond *)); + vtx1->bond=(ts_bond **)realloc(vtx1->bond, vtx1->bond_no*sizeof(ts_bond *)); // vtx2->data->bond=(ts_bond **)realloc(vtx2->data->bond, vtx2->data->bond_no*sizeof(ts_bond *)); - vtx1->data->bond[vtx1->data->bond_no-1]=bond; - // vtx2->data->bond[vtx2->data->bond_no-1]=bond; + vtx1->bond[vtx1->bond_no-1]=bond; + // vtx2->ata->bond[vtx2->data->bond_no-1]=bond; return TS_SUCCESS; } @@ -139,20 +127,11 @@ } - -ts_bool vtx_data_free(ts_vertex_data *data){ - if(data->neigh!=NULL) free(data->neigh); - if(data->tristar!=NULL) free(data->tristar); - if(data->bond!=NULL) free(data->bond); -//Cells are freed separately. - // if(data->cell!=NULL) free(data->cell); - free(data); - return TS_SUCCESS; -} - -/*not usable. can be deleted */ ts_bool vtx_free(ts_vertex *vtx){ - vtx_data_free(vtx->data); + if(vtx->neigh!=NULL) free(vtx->neigh); + if(vtx->tristar!=NULL) free(vtx->tristar); + if(vtx->bond!=NULL) free(vtx->bond); + free(vtx); return TS_SUCCESS; } @@ -160,9 +139,9 @@ ts_bool vtx_list_free(ts_vertex_list *vlist){ int i; for(i=0;i<vlist->n;i++){ - if(vlist->vtx[i]->data!=NULL) vtx_data_free(vlist->vtx[i]->data); + if(vlist->vtx[i]!=NULL) vtx_free(vlist->vtx[i]); } - free(*(vlist->vtx)); + //free(*(vlist->vtx)); free(vlist->vtx); free(vlist); return TS_SUCCESS; @@ -170,15 +149,14 @@ inline ts_double vtx_distance_sq(ts_vertex *vtx1, ts_vertex *vtx2){ ts_double dist; - ts_vertex_data *vd1=vtx1->data, *vd2=vtx2->data; #ifdef TS_DOUBLE_DOUBLE - dist=pow(vd1->x-vd2->x,2) + pow(vd1->y-vd2->y,2) + pow(vd1->z-vd2->z,2); + dist=pow(vtx1->x-vtx2->x,2) + pow(vtx1->y-vtx2->y,2) + pow(vtx1->z-vtx2->z,2); #endif #ifdef TS_DOUBLE_LONGDOUBLE - dist=powl(vd1->x-vd2->x,2) + powl(vd1->y-vd2->y,2) + powl(vd1->z-vd2->z,2); + dist=powl(vtx1->x-vtx2->x,2) + powl(vtx1->y-vtx2->y,2) + powl(vtx1->z-vtx2->z,2); #endif #ifdef TS_DOUBLE_FLOAT - dist=powf(vd1->x-vd2->x,2) + powf(vd1->y-vd2->y,2) + powf(vd1->z-vd2->z,2); + dist=powf(vtx1->x-vtx2->x,2) + powf(vtx1->y-vtx2->y,2) + powf(vtx1->z-vtx2->z,2); #endif return(dist); } @@ -189,32 +167,32 @@ ts_double xk=vesicle->bending_rigidity; ts_uint i; for(i=0;i<vesicle->vlist->n;i++){ - vesicle->vlist->vtx[i]->data->xk=xk; + vesicle->vlist->vtx[i]->xk=xk; } return TS_SUCCESS; } inline ts_double vtx_direct(ts_vertex *vtx1, ts_vertex *vtx2, ts_vertex *vtx3){ - ts_double dX2=vtx2->data->x-vtx1->data->x; - ts_double dY2=vtx2->data->y-vtx1->data->y; - ts_double dZ2=vtx2->data->z-vtx1->data->z; - ts_double dX3=vtx3->data->x-vtx1->data->x; - ts_double dY3=vtx3->data->y-vtx1->data->y; - ts_double dZ3=vtx3->data->z-vtx1->data->z; - ts_double direct=vtx1->data->x*(dY2*dZ3 -dZ2*dY3)+ - vtx1->data->y*(dZ2*dX3-dX2*dZ3)+ - vtx1->data->z*(dX2*dY3-dY2*dX3); + ts_double dX2=vtx2->x-vtx1->x; + ts_double dY2=vtx2->y-vtx1->y; + ts_double dZ2=vtx2->z-vtx1->z; + ts_double dX3=vtx3->x-vtx1->x; + ts_double dY3=vtx3->y-vtx1->y; + ts_double dZ3=vtx3->z-vtx1->z; + ts_double direct=vtx1->x*(dY2*dZ3 -dZ2*dY3)+ + vtx1->y*(dZ2*dX3-dX2*dZ3)+ + vtx1->z*(dX2*dY3-dY2*dX3); return(direct); } inline ts_bool vertex_add_tristar(ts_vertex *vtx, ts_triangle *tristarmem){ - vtx->data->tristar_no++; - vtx->data->tristar=(ts_triangle **)realloc(vtx->data->tristar,vtx->data->tristar_no*sizeof(ts_triangle *)); - if(vtx->data->tristar==NULL){ + vtx->tristar_no++; + vtx->tristar=(ts_triangle **)realloc(vtx->tristar,vtx->tristar_no*sizeof(ts_triangle *)); + if(vtx->tristar==NULL){ fatal("Reallocation of memory while adding tristar failed.",3); } - vtx->data->tristar[vtx->data->tristar_no-1]=tristarmem; + vtx->tristar[vtx->tristar_no-1]=tristarmem; return TS_SUCCESS; } @@ -225,22 +203,18 @@ ts_bool vtx_copy(ts_vertex *cvtx, ts_vertex *ovtx){ memcpy((void *)cvtx,(void *)ovtx,sizeof(ts_vertex)); - cvtx->data=(ts_vertex_data *)malloc(sizeof(ts_vertex_data)); - memcpy((void *)cvtx->data,(void *)ovtx->data,sizeof(ts_vertex_data)); - cvtx->data->neigh=NULL; - cvtx->data->neigh_no=0; - cvtx->data->tristar_no=0; - cvtx->data->bond_no=0; - cvtx->data->tristar=NULL; - cvtx->data->bond=NULL; - cvtx->data->cell=NULL; + cvtx->neigh=NULL; + cvtx->neigh_no=0; + cvtx->tristar_no=0; + cvtx->bond_no=0; + cvtx->tristar=NULL; + cvtx->bond=NULL; + cvtx->cell=NULL; return TS_SUCCESS; } ts_bool vtx_duplicate(ts_vertex *cvtx, ts_vertex *ovtx){ memcpy((void *)cvtx,(void *)ovtx,sizeof(ts_vertex)); - cvtx->data=(ts_vertex_data *)malloc(sizeof(ts_vertex_data)); - memcpy((void *)cvtx->data,(void *)ovtx->data,sizeof(ts_vertex_data)); return TS_SUCCESS; } @@ -256,12 +230,11 @@ ts_vertex_list *vlist=(ts_vertex_list *)malloc(sizeof(ts_vertex_list)); vlist=memcpy((void *)vlist, (void *)ovlist, sizeof(ts_vertex_list)); ts_vertex **vtx=(ts_vertex **)malloc(vlist->n*sizeof(ts_vertex *)); - ts_vertex *tlist=(ts_vertex *)calloc(vlist->n,sizeof(ts_vertex)); vlist->vtx=vtx; - if(vlist->vtx==NULL || tlist==NULL) + if(vlist->vtx==NULL) fatal("Fatal error reserving memory space for vertex list! Could number of requsted vertices be too large?", 100); for(i=0;i<vlist->n;i++) { - vlist->vtx[i]=&tlist[i]; + vlist->vtx[i]=(ts_vertex *)calloc(1,sizeof(ts_vertex)); vlist->vtx[i]->idx=i; vtx_copy(vlist->vtx[i],ovlist->vtx[i]); } diff --git a/src/vertex.h b/src/vertex.h index 0d0c27c..98efff5 100644 --- a/src/vertex.h +++ b/src/vertex.h @@ -14,12 +14,10 @@ * @returns ts_bool value 1 on success, 0 otherwise */ ts_vertex_list *init_vertex_list(ts_uint N); -ts_vertex_data *init_vertex_data(void); ts_bool vtx_add_neighbour(ts_vertex *vtx, ts_vertex *nvtx); ts_bool vtx_add_cneighbour(ts_bond_list *blist,ts_vertex *vtx1,ts_vertex *vtx2); ts_bool vtx_add_bond(ts_bond_list *blist,ts_vertex *vtx1,ts_vertex *vtx2); ts_bool vtx_remove_neighbour(ts_vertex *vtx, ts_vertex *nvtx); -ts_bool vtx_data_free(ts_vertex_data *data); ts_bool vtx_free(ts_vertex *vtx); ts_bool vtx_list_free(ts_vertex_list *vlist); inline ts_double vtx_distance_sq(ts_vertex *vtx1, ts_vertex *vtx2); diff --git a/src/vertexmove.c b/src/vertexmove.c index 243463f..c8ce697 100644 --- a/src/vertexmove.c +++ b/src/vertexmove.c @@ -16,8 +16,8 @@ *rn){ ts_uint i; ts_double dist; - ts_vertex *tvtx=(ts_vertex *)malloc(sizeof(ts_vertex)); - tvtx->data=init_vertex_data(); + ts_vertex *tvtx=(ts_vertex *)calloc(1,sizeof(ts_vertex)); +// tvtx->data=init_vertex_data(); ts_bool retval; ts_uint cellidx; ts_double xold,yold,zold; @@ -25,46 +25,50 @@ ts_vertex *ovtx; //randomly we move the temporary vertex - tvtx->data->x=vtx->data->x+vesicle->stepsize*(2.0*rn[0]-1.0); - tvtx->data->y=vtx->data->y+vesicle->stepsize*(2.0*rn[1]-1.0); - tvtx->data->z=vtx->data->z+vesicle->stepsize*(2.0*rn[2]-1.0); + tvtx->x=vtx->x+vesicle->stepsize*(2.0*rn[0]-1.0); + tvtx->y=vtx->y+vesicle->stepsize*(2.0*rn[1]-1.0); + tvtx->z=vtx->z+vesicle->stepsize*(2.0*rn[2]-1.0); //check we if some length to neighbours are too much - for(i=0;i<vtx->data->neigh_no;i++){ - dist=vtx_distance_sq(tvtx,vtx->data->neigh[i]); - if(dist<1.0 || dist>vesicle->dmax) return TS_FAIL; + for(i=0;i<vtx->neigh_no;i++){ + dist=vtx_distance_sq(tvtx,vtx->neigh[i]); + if(dist<1.0 || dist>vesicle->dmax) { + vtx_free(tvtx); + return TS_FAIL; + } } -fprintf(stderr,"Was here!\n"); +//fprintf(stderr,"Was here!\n"); //self avoidance check with distant vertices cellidx=vertex_self_avoidance(vesicle, tvtx); //check occupation number retval=cell_occupation_number_and_internal_proximity(vesicle->clist,cellidx,vtx,tvtx); if(retval==TS_FAIL){ + vtx_free(tvtx); return TS_FAIL; } //if all the tests are successful, then we update the vertex position - xold=vtx->data->x; - yold=vtx->data->y; - zold=vtx->data->z; + xold=vtx->x; + yold=vtx->y; + zold=vtx->z; ovtx=malloc(sizeof(ts_vertex)); vtx_copy(ovtx,vtx); - vtx->data->x=tvtx->data->x; - vtx->data->y=tvtx->data->y; - vtx->data->z=tvtx->data->z; + vtx->x=tvtx->x; + vtx->y=tvtx->y; + vtx->z=tvtx->z; delta_energy=0; //update the normals of triangles that share bead i. - for(i=0;i<vtx->data->tristar_no;i++) triangle_normal_vector(vtx->data->tristar[i]); + for(i=0;i<vtx->tristar_no;i++) triangle_normal_vector(vtx->tristar[i]); //energy and curvature energy_vertex(vtx); - delta_energy=vtx->data->xk*(vtx->data->energy - ovtx->data->energy); + delta_energy=vtx->xk*(vtx->energy - ovtx->energy); //the same is done for neighbouring vertices - for(i=0;i<vtx->data->neigh_no;i++){ - oenergy=vtx->data->neigh[i]->data->energy; - energy_vertex(vtx->data->neigh[i]); - delta_energy+=vtx->data->neigh[i]->data->xk*(vtx->data->neigh[i]->data->energy-oenergy); + for(i=0;i<vtx->neigh_no;i++){ + oenergy=vtx->neigh[i]->energy; + energy_vertex(vtx->neigh[i]); + delta_energy+=vtx->neigh[i]->xk*(vtx->neigh[i]->energy-oenergy); } - fprintf(stderr, "DE=%f\n",delta_energy); +// fprintf(stderr, "DE=%f\n",delta_energy); //MONTE CARLOOOOOOOO if(delta_energy>=0){ #ifdef TS_DOUBLE_DOUBLE @@ -78,18 +82,19 @@ #endif { //not accepted, reverting changes - vtx->data->x=xold; - vtx->data->y=yold; - vtx->data->z=zold; + vtx->x=xold; + vtx->y=yold; + vtx->z=zold; //update the normals of triangles that share bead i. - for(i=0;i<vtx->data->tristar_no;i++) triangle_normal_vector(vtx->data->tristar[i]); + for(i=0;i<vtx->tristar_no;i++) triangle_normal_vector(vtx->tristar[i]); //energy and curvature energy_vertex(vtx); //the same is done for neighbouring vertices - for(i=0;i<vtx->data->neigh_no;i++) energy_vertex(vtx->data->neigh[i]); - free(ovtx->data->bond_length); - free(ovtx->data->bond_length_dual); + for(i=0;i<vtx->neigh_no;i++) energy_vertex(vtx->neigh[i]); + free(ovtx->bond_length); + free(ovtx->bond_length_dual); free(ovtx); + vtx_free(tvtx); return TS_FAIL; } } @@ -97,9 +102,10 @@ //TODO: change cell occupation if necessary! - free(ovtx->data->bond_length); - free(ovtx->data->bond_length_dual); + free(ovtx->bond_length); + free(ovtx->bond_length_dual); free(ovtx); + vtx_free(tvtx); return TS_SUCCESS; } diff --git a/src/vesicle.c b/src/vesicle.c index de7f9a1..d6c29e1 100644 --- a/src/vesicle.c +++ b/src/vesicle.c @@ -21,9 +21,9 @@ ts_vertex **vtx=vesicle->vlist->vtx; ts_uint nn=vesicle->vlist->n; for(i=0;i<nn;i++){ - vtx[i]->data->x+=x; - vtx[i]->data->y+=y; - vtx[i]->data->z+=z; + vtx[i]->x+=x; + vtx[i]->y+=y; + vtx[i]->z+=z; } return TS_SUCCESS; } -- Gitblit v1.9.3