Trisurf Monte Carlo simulator
Samo Penic
2013-11-30 64c113ed06cb749fdc513162a1cddf4ec024fd72
Changes in data structure, added vertex_list_remove_vtx and vertex_list_add_vtx. Trying to fix the rest
2 files modified
74 ■■■■ changed files
src/general.h 11 ●●●●● patch | view | raw | blame | history
src/vertex.c 63 ●●●● patch | view | raw | blame | history
src/general.h
@@ -136,8 +136,9 @@
        ts_double x; /**< The x coordinate of vertex. */
        ts_double y; /**< The y coordinate of vertex. */
        ts_double z; /**< The z coordinate of vertex. */
        ts_uint neigh_no; /**< The number of neighbours. */
        struct ts_vertex **neigh; /**< The pointer that holds neigh_no pointers to this structure. */
//        ts_uint neigh_no; /**< The number of neighbours. */
//        struct ts_vertex **neigh; /**< The pointer that holds neigh_no pointers to this structure. */
    struct ts_vertex_list *neigh;
        ts_double *bond_length; /**< Obsolete! The bond lenght is moved to ts_bond */
        ts_double *bond_length_dual; /**< Obsolete! Bond length in dual lattice is moved to ts_bond! */
        ts_double curvature;
@@ -157,11 +158,13 @@
};
typedef struct ts_vertex ts_vertex;
typedef struct {
struct ts_vertex_list{
    ts_uint n;
    ts_uint list_size;
    ts_vertex **vtx;
} ts_vertex_list;
};
typedef struct ts_vertex_list ts_vertex_list;
struct ts_bond {
    ts_uint idx;
src/vertex.c
@@ -39,31 +39,62 @@
    return vlist;
}
ts_bool vertex_list_add_vtx(ts_vertex_list *vlist, ts_vertex *vtx){
#ifdef DEBUG
    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;
    }
    vlist->vtx[n]=vtx;
    vlist->n++;
    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
    for(i=0; i<vlist->n;i++){
        if(vlist->vtx[i]==vtx){
            vlist->vtx[i]=vlist->vtx[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;
}
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;
    for(i=0; i<vtx->neigh->n;i++){
        if(vtx->neigh->vtx[i]==nvtx) return TS_FAIL;
    }
    ts_uint nn=++vtx->neigh_no;
    ts_uint nn=++vtx->neigh->n;
    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;
}