From 7958e9880911c822dcb78d3e1ac743a0ccdc1e03 Mon Sep 17 00:00:00 2001 From: Samo Penic <samo@andromeda> Date: Sat, 04 Dec 2010 20:56:15 +0000 Subject: [PATCH] The initial distribution file has been rewritten. The structure of dipyramid should be accurately recreated using new datastructure. While rewritting the new datastructure proved to be very easy to understand and no memory leaks occured. Still, some questions remains unanswered -- whether the vertex neighbours and links to bonds should be linked tightly together. --- src/vertex.c | 107 +++++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 87 insertions(+), 20 deletions(-) diff --git a/src/vertex.c b/src/vertex.c index 52a8f93..379d43e 100644 --- a/src/vertex.c +++ b/src/vertex.c @@ -39,18 +39,6 @@ return data; } -/* -ts_bool vtx_set_global_values(ts_vertex **vlist, ts_vesicle *vesicle){ - ts_double xk=vesicle->bending_rigidity; - ts_uint i; - for(i=0;i<vesicle->vlist.n;i++){ - vlist[i]->xk=xk; - } - return TS_SUCCESS; -} -*/ - - ts_bool vtx_add_neighbour(ts_vertex *vtx, ts_vertex *nvtx){ ts_uint i; @@ -78,6 +66,43 @@ return TS_SUCCESS; } +/* TODO: optimize this. test this. */ +ts_bool vtx_remove_neighbour(ts_vertex *vtx, ts_vertex *nvtx){ +/* 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]; + 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) + 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]; + 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) + fatal("Reallocation of memory failed during removal of vertex neighbour in vtx_remove_neighbour",100); + + return TS_SUCCESS; +} + + + ts_bool vtx_add_bond(ts_bond_list *blist,ts_vertex *vtx1,ts_vertex *vtx2){ ts_bond *bond; bond=bond_add(blist,vtx1,vtx2); @@ -100,6 +125,15 @@ return retval; } +/*TODO: write and optimize this urgently before use! */ +ts_bool vtx_remove_cneighbour(ts_bond_list *blist, ts_vertex *vtx1, ts_vertex +*vtx2){ +// ts_bool retval; +/* remove the bond */ +//retval=vtx_remove_bond(blist,vtx1,vtx2); +/* remove the vertices */ + return TS_SUCCESS; +} @@ -130,20 +164,53 @@ return TS_SUCCESS; } - - -/* rewrite for additional structure in chain */ -/*inline ts_double vtx_distance_sq(ts_vertex *vtx1, ts_vertex *vtx2){ +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((*vtx1)->x-(*vtx2)->x,2) + pow((*vtx1)->y-(*vtx2)->y,2) + pow((*vtx1)->z-(*vtx2)->z,2); + dist=pow(vd1->x-vd2->x,2) + pow(vd1->y-vd2->y,2) + pow(vd1->z-vd2->z,2); #endif #ifdef TS_DOUBLE_LONGDOUBLE - dist=powl((*vtx1)->x-(*vtx2)->x,2) + powl((*vtx1)->y-(*vtx2)->y,2) + powl((*vtx1)->z-(*vtx2)->z,2); + dist=powl(vd1->x-vd2->x,2) + powl(vd1->y-vd2->y,2) + powl(vd1->z-vd2->z,2); #endif #ifdef TS_DOUBLE_FLOAT - dist=powf((*vtx1)->x-(*vtx2)->x,2) + powf((*vtx1)->y-(*vtx2)->y,2) + powf((*vtx1)->z-(*vtx2)->z,2); + dist=powf(vd1->x-vd2->x,2) + powf(vd1->y-vd2->y,2) + powf(vd1->z-vd2->z,2); #endif return(dist); } -*/ + + + +ts_bool vtx_set_global_values(ts_vesicle *vesicle){ + ts_double xk=vesicle->bending_rigidity; + ts_uint i; + for(i=0;i<vesicle->vlist->n;i++){ + vesicle->vlist->vtx[i]->data->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); + 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){ + fatal("Reallocation of memory while adding tristar failed.",3); + } + vtx->data->tristar[vtx->data->tristar_no-1]=tristarmem; + return TS_SUCCESS; +} + -- Gitblit v1.9.3