From bba37cf9e0441224abc24f67d468a5bafbe8ab3c Mon Sep 17 00:00:00 2001
From: Samo Penic <samo.penic@gmail.com>
Date: Sat, 30 Nov 2013 10:25:41 +0000
Subject: [PATCH] step in rewritting

---
 src/vertex.c  |  124 ++++------------------------------------
 src/general.h |    6 ++
 src/vertex.h  |    8 +-
 3 files changed, 24 insertions(+), 114 deletions(-)

diff --git a/src/general.h b/src/general.h
index cc051f5..b1a7474 100644
--- a/src/general.h
+++ b/src/general.h
@@ -61,6 +61,11 @@
 */
 #define TS_DOUBLE_DOUBLE
 
+/** @brief Constant defines the size by which vertex_list expands at once, so expansion is not needed each time new data arrives. Also
+ * vlist will be decreased by same steps.
+ */
+#define TS_VLIST_CHUNK 6
+
 /** For the purpose of greater flexibility all data types used in the program
  *  shouldn't use standard C types, but should use types defined here.
  *	ts_int (uses int)
@@ -127,6 +132,7 @@
 
 
 
+
 /** @brief Data structure of all data connected to a vertex
  *
  *  ts_vertex holds the data for one single point (bead, vertex). To understand how to use it
diff --git a/src/vertex.c b/src/vertex.c
index f1ae60b..efe3cae 100644
--- a/src/vertex.c
+++ b/src/vertex.c
@@ -8,12 +8,11 @@
 
 ts_vertex_list *init_vertex_list(ts_uint N){	
 	ts_int i;
-    ts_vertex_list *vlist=(ts_vertex_list *)malloc(sizeof(ts_vertex_list));
-    
+    ts_vertex_list *vlist=(ts_vertex_list *)calloc(1,sizeof(ts_vertex_list));
+ 
 	if(N==0){
-		err("Initialized vertex list with zero elements. Pointer set to NULL");
-        vlist->n=0;
-		vlist->vtx=NULL;
+        	vlist->n=0;
+		vlist->vtx=(ts_vertex **)calloc(1,sizeof(ts_vertex *)); /*Allocate one memory space for vlist anyway */
 		return vlist;
 	}
 	
@@ -23,18 +22,8 @@
     for(i=0;i<N;i++) {
         vlist->vtx[i]=(ts_vertex *)calloc(1,sizeof(ts_vertex));
         vlist->vtx[i]->idx=i;
-
-    /* initialize Ylm for spherical hamonics DONE in sh.c */
-/*    for(i=0;i<l;i++){
-        vlist->vtx[i]->Ylm[i]=(ts_double **)calloc(2*i+1,sizeof(ts_double *));
-        for(j=0;j<(2*i+1);j++){
-            clist->vtx[i]->Ylm[i][j]=(ts_double *)calloc(sizeof(ts_double));
-        }
-    }
-*/
-
-
-    }
+    	/* initialize Ylm for spherical hamonics DONE in sh.c */
+    	}
     vlist->n=N;
 	return vlist;
 }
@@ -52,7 +41,7 @@
 		}
 		vlist->list_size+=TS_VLIST_CHUNK;
 	}
-	vlist->vtx[n]=vtx;
+	vlist->vtx[vlist->n]=vtx;
 	vlist->n++;
 	return TS_SUCCESS;
 }
@@ -65,9 +54,10 @@
 #ifdef DEBUG
 	if(vtx==NULL || vlist==NULL) return TS_FAIL;
 #endif
+	ts_uint i;
 	for(i=0; i<vlist->n;i++){
 		if(vlist->vtx[i]==vtx){
-			vlist->vtx[i]=vlist->vtx[n-1];
+			vlist->vtx[i]=vlist->vtx[vlist->n-1];
 			vlist->n--;
 			if(vlist->list_size-vlist->n > TS_VLIST_CHUNK){
 				vlist->vtx=(ts_vertex **)realloc(vlist->vtx, (vlist->list_size-TS_VLIST_CHUNK)*sizeof(ts_vertex*));
@@ -80,63 +70,6 @@
 		}
 	}
 	return TS_FAIL;
-}
-
-
-ts_bool vtx_add_neighbour(ts_vertex *vtx, ts_vertex *nvtx){
-    ts_uint i;
-    /* no neighbour can be null! */
-    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->neigh->n;i++){
-        if(vtx->neigh->vtx[i]==nvtx) return TS_FAIL;
-    }
-    ts_uint nn=++vtx->neigh->n;
-    vtx->neigh=(ts_vertex **)realloc(vtx->neigh, nn*sizeof(ts_vertex *));
-    vtx->neigh[nn-1]=nvtx;
-
-    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->neigh_no;i++){
-//		fprintf(stderr,"neigh_addr=%ld\n", (long)vtx->neigh[i]);
-        if(vtx->neigh[i]!=nvtx){
-            vtx->neigh[j]=vtx->neigh[i];
-            j++;
-        }
-    }
-//	fprintf(stderr,"remove_neighbour: vtx1_addr=%ld, vtx2_addr=%ld\n",(long)vtx,(long)nvtx);
-/* resize memory. potentionally time consuming */
-    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("(1) Reallocation of memory failed during removal of vertex neighbour in vtx_remove_neighbour",100);
-//fprintf(stderr,"first alloc");
-/* repeat for the neighbour */
-/* find a neighbour */
-/* remove it from the list while shifting remaining neighbours up */
-	j=0;
-    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. */
-//	fprintf(stderr,"Neigbours=%d\n",nvtx->neigh_no);
-    nvtx->neigh_no--;
-    		nvtx->neigh=(ts_vertex **)realloc(nvtx->neigh,nvtx->neigh_no*sizeof(ts_vertex *));
-//	fprintf(stderr,"Neigbours=%d\n",nvtx->neigh_no);
-    if(nvtx->neigh == NULL && nvtx->neigh_no!=0)
-        fatal("(2) Reallocation of memory failed during removal of vertex neighbour in vtx_remove_neighbour",100);
-
-    return TS_SUCCESS;
 }
 
 
@@ -158,12 +91,13 @@
     return TS_SUCCESS;
 }
 
-ts_bool vtx_add_cneighbour(ts_bond_list *blist, ts_vertex *vtx1, ts_vertex *vtx2){
+ts_bool vtx_add_cneighbour(ts_bond_list *blist, ts_vertex_list *vlist, ts_vertex *vtx1, ts_vertex *vtx2){
     ts_bool retval;
-    retval=vtx_add_neighbour(vtx1,vtx2);
-  //  retval=vtx_add_neighbour(vtx2,vtx1);
+    retval=vertex_list_add_vtx(vtx1->neigh, vtx2);
+    retval=vertex_list_add_vtx(vtx2->neigh, vtx1);
     if(retval==TS_SUCCESS)
-    retval=vtx_add_bond(blist,vtx1,vtx2); 
+	    retval=vtx_add_bond(blist,vtx1,vtx2); 
+
     return retval;
 }
 
@@ -247,35 +181,6 @@
 }
 
 
-/* Insert neighbour is a function that is required in bondflip. It inserts a
- * neighbour exactly in the right place. */
-inline ts_bool vtx_insert_neighbour(ts_vertex *vtx, ts_vertex *nvtx, ts_vertex *vtxm){
-//nvtx is a vertex that is to be inserted after vtxm!
-        ts_uint i,j,midx;
-        vtx->neigh_no++;
-        if(vtxm==NULL ||  nvtx==NULL || vtx==NULL)
-                fatal("vertex_insert_neighbour: one of pointers has been zero.. Cannot proceed.",3);
-        //We need to reallocate space! The pointer *neight must be zero if not having neighbours jey (if neigh_no was 0 at thime of calling
-        vtx->neigh=realloc(vtx->neigh,vtx->neigh_no*sizeof(ts_vertex *));
-        if(vtx->neigh == NULL){
-            fatal("Reallocation of memory failed during insertion of vertex neighbour in vertex_insert_neighbour",3);
-        }
-        midx=0;
-        for(i=0;i<vtx->neigh_no-1;i++) if(vtx->neigh[i]==vtxm) {midx=i; break;}
-     //   fprintf(stderr,"midx=%d, vseh=%d\n",midx,vtx->neigh_no-2);
-        if(midx==vtx->neigh_no-2) {
-            vtx->neigh[vtx->neigh_no-1]=nvtx;
-        } else {
-            for(j=vtx->neigh_no-2;j>midx;j--) {
-                vtx->neigh[j+1]=vtx->neigh[j];
-//                vtx->bond_length[j+1]=vtx->bond_length[j];
-//                vtx->bond_length_dual[j+1]=vtx->bond_length_dual[j];
-            }
-            vtx->neigh[midx+1]=nvtx;
-        }
-    return TS_SUCCESS;
-}
-
 
 /* vtx remove tristar is required in  bondflip. */
 /* TODO: Check whether it is important to keep the numbering of tristar
@@ -305,7 +210,6 @@
 ts_bool vtx_copy(ts_vertex *cvtx, ts_vertex *ovtx){
     memcpy((void *)cvtx,(void *)ovtx,sizeof(ts_vertex));
     cvtx->neigh=NULL;
-    cvtx->neigh_no=0;
     cvtx->tristar_no=0;
     cvtx->bond_no=0;
     cvtx->tristar=NULL;
diff --git a/src/vertex.h b/src/vertex.h
index 97775d2..2badec4 100644
--- a/src/vertex.h
+++ b/src/vertex.h
@@ -14,17 +14,17 @@
  *	@returns ts_bool value 1 on success, 0 otherwise
 */
 ts_vertex_list *init_vertex_list(ts_uint N);
-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 vertex_list_add_vtx(ts_vertex_list *vlist, ts_vertex *vtx);
+ts_bool vertex_list_remove_vtx(ts_vertex_list *vlist, ts_vertex *vtx);
+ts_bool vtx_add_cneighbour(ts_bond_list *blist,ts_vertex_list *vlist, 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_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);
 ts_bool vtx_set_global_values(ts_vesicle *vesicle);
 inline ts_double vtx_direct(ts_vertex *vtx1, ts_vertex *vtx2, ts_vertex *vtx3);
 inline ts_bool vertex_add_tristar(ts_vertex *vtx, ts_triangle *tristarmem);
-inline ts_bool vtx_insert_neighbour(ts_vertex *vtx, ts_vertex *nvtx, ts_vertex *vtxm);
 inline ts_bool vtx_remove_tristar(ts_vertex *vtx, ts_triangle *tristar);
 ts_bool vtx_copy(ts_vertex *cvtx,ts_vertex *ovtx);
 ts_bool vtx_duplicate(ts_vertex *cvtx, ts_vertex *ovtx);

--
Gitblit v1.9.3