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,89 +22,62 @@
    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;
}
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_no;i++){
        if(vtx->neigh[i]==nvtx) return TS_FAIL;
    }
    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).
 */
    /* pa se sosedu dodamo vertex */
    /*if it is already a neighbour don't add it to the list */
/*
    for(i=0; i<nvtx->data->neigh_no;i++){
        if(nvtx->data->neigh[i]==vtx) return TS_FAIL;
    }
    nn=++nvtx->data->neigh_no;
    nvtx->data->neigh=(ts_vertex **)realloc(nvtx->data->neigh, nn*sizeof(ts_vertex *));
    nvtx->data->neigh[nn-1]=vtx;
*/
    return TS_SUCCESS;
ts_bool vertex_list_add_vtx(ts_vertex_list *vlist, ts_vertex *vtx){
#ifdef DEBUG
   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*));
      if(vlist->vtx==NULL){
         fatal("Error in vertex_list_add. Could not reallocate memory space.",9999);
      }
      vlist->list_size+=TS_VLIST_CHUNK;
   }
//   printf("Test %u (max %u)!\n", vlist->n, vlist->list_size);
   vlist->vtx[vlist->n]=vtx;
   vlist->n++;
   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;
/* Idea is to delete vertex by removing it from list. The emply place is then filled in by the last
vertex in the list. List can then be resized by one -- unless resize is required when max list size -
real list size > predefined value */
ts_bool vertex_list_remove_vtx(ts_vertex_list *vlist, ts_vertex *vtx){
#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[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*));
            if(vlist->vtx==NULL){
               fatal("Error in vertex_list_add. Could not reallocate memory space.",9999);
            }
            vlist->list_size-=TS_VLIST_CHUNK;
         }
         return TS_SUCCESS;
      }
   }
   return TS_FAIL;
}
@@ -127,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;
}
@@ -148,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);
@@ -216,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
@@ -273,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;