Trisurf Monte Carlo simulator
Samo Penic
2013-11-30 8ed8fdb663089e2bc53fd537611a6b45a09cc502
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,19 +22,11 @@
    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));
        }
    }
*/
    }
   vlist->vtx[i]->neigh=init_vertex_list(0);
       /* initialize Ylm for spherical hamonics DONE in sh.c */
       }
    vlist->n=N;
   vlist->list_size=TS_VLIST_CHUNK; //TODO: can be buggy in some cases, when N>0 and we want to delete some vertices.
   return vlist;
}
@@ -43,7 +34,12 @@
ts_bool vertex_list_add_vtx(ts_vertex_list *vlist, ts_vertex *vtx){
#ifdef DEBUG
   if(vtx==NULL || vlist==NULL) return TS_FAIL;
   if(vtx==NULL)
   err("VTX is null");
   if(vlist==NULL) err("VLIST is null");
   if(vtx==NULL || vlist==NULL)
      return TS_FAIL;
#endif
   if(vlist->list_size < vlist->n+1){
      vlist->vtx=(ts_vertex **)realloc(vlist->vtx, (vlist->list_size+TS_VLIST_CHUNK)*sizeof(ts_vertex*));
@@ -52,7 +48,8 @@
      }
      vlist->list_size+=TS_VLIST_CHUNK;
   }
   vlist->vtx[n]=vtx;
//   printf("Test %u (max %u)!\n", vlist->n, vlist->list_size);
   vlist->vtx[vlist->n]=vtx;
   vlist->n++;
   return TS_SUCCESS;
}
@@ -65,9 +62,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 +78,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 +99,28 @@
    return TS_SUCCESS;
}
ts_bool vtx_add_neighbour(ts_vertex *vtx1, ts_vertex *vtx2){
   ts_uint i;
   if(vtx1==NULL || vtx2==NULL) return TS_FAIL;
   for(i=0;i<vtx1->neigh->n;i++){
      if (vtx1->neigh->vtx[i]==vtx2){
         return TS_FAIL;
      }
   }
      vertex_list_add_vtx(vtx1->neigh, vtx2);
   return TS_SUCCESS;
}
ts_bool vtx_add_cneighbour(ts_bond_list *blist, ts_vertex *vtx1, ts_vertex *vtx2){
    ts_bool retval;
    retval=vtx_add_neighbour(vtx1,vtx2);
  //  retval=vtx_add_neighbour(vtx2,vtx1);
    if(retval==TS_SUCCESS)
    retval=vtx_add_bond(blist,vtx1,vtx2);
   retval=vtx_add_neighbour(vtx1, vtx2);
//    retval=vertex_list_add_vtx(vtx1->neigh, vtx2);
//    retval=vertex_list_add_vtx(vtx2->neigh, vtx1);
    if(retval==TS_SUCCESS){
   //   fprintf(stderr,"Bond added\n");
      retval=vtx_add_bond(blist,vtx1,vtx2);
      }
    return retval;
}
@@ -179,7 +136,10 @@
ts_bool vtx_free(ts_vertex  *vtx){
    if(vtx->neigh!=NULL)   free(vtx->neigh);
    if(vtx->neigh!=NULL)  {
      if (vtx->neigh->vtx!=NULL) free(vtx->neigh->vtx);
      free(vtx->neigh);
    }
    if(vtx->tristar!=NULL) free(vtx->tristar);
    if(vtx->bond!=NULL)    free(vtx->bond);
    free(vtx);
@@ -247,35 +207,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
@@ -304,8 +235,7 @@
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->neigh=init_vertex_list(0);
    cvtx->tristar_no=0;
    cvtx->bond_no=0;
    cvtx->tristar=NULL;