From 30ee9c409ed7c743c693f1e068c1d7393949207a Mon Sep 17 00:00:00 2001 From: Samo Penic <samo.penic@fe.uni-lj.si> Date: Thu, 14 Jun 2012 09:24:31 +0000 Subject: [PATCH] Started with bondflip. There is still an error in calling vtx_remove_neighbour with vertices that are actually not neighbours. --- src/Makefile.am | 2 src/bondflip.h | 2 src/timestep.c | 3 + src/vertex.c | 57 ++++++++++++++++++++++++++++ src/bondflip.c | 21 +++++----- src/triangle.h | 2 src/vertex.h | 3 + 7 files changed, 75 insertions(+), 15 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index f9bc3e2..a6e0171 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,6 +1,6 @@ trisurfdir=../ trisurf_PROGRAMS = trisurf -trisurf_SOURCES = general.c vertex.c bond.c triangle.c cell.c vesicle.c initial_distribution.c io.c frame.c energy.c timestep.c vertexmove.c main.c +trisurf_SOURCES = general.c vertex.c bond.c triangle.c cell.c vesicle.c initial_distribution.c io.c frame.c energy.c timestep.c vertexmove.c bondflip.c main.c #trisurf_LDFLAGS = -lm -lconfuse shdiscoverdir=../ shdiscover_PROGRAMS= shdiscover diff --git a/src/bondflip.c b/src/bondflip.c index e56cc4e..b444975 100644 --- a/src/bondflip.c +++ b/src/bondflip.c @@ -8,6 +8,7 @@ #include "energy.h" #include "timestep.h" #include "cell.h" +#include "bondflip.h" //#include "io.h" #include<stdio.h> @@ -27,7 +28,7 @@ ts_vertex *it=bond->vtx1; ts_vertex *k=bond->vtx2; ts_uint nei,neip,neim; - ts_uint i,j; + ts_uint i; //j; ts_double oldenergy, delta_energy; // ts_triangle *lm=NULL,*lp=NULL, *lp1=NULL, *lp2=NULL, *lm1=NULL, *lm2=NULL; @@ -39,7 +40,7 @@ fatal("In bondflip, number of neighbours of k or it is less than 3!",999); } - + nei=0; for(i=0;i<it->neigh_no;i++){ // Finds the nn of it, that is k if(it->neigh[i]==k){ nei=i; @@ -68,7 +69,7 @@ } // fprintf(stderr,"Membrane didn't wrap too much.. Continue.\n"); /* if bond would be too long, return... */ - if(vertex_distance_sq(km,kp) > vesicle->dmax ) return TS_FAIL; + if(vtx_distance_sq(km,kp) > vesicle->dmax ) return TS_FAIL; // fprintf(stderr,"Bond will not be too long.. Continue.\n"); /* we make a bond flip. this is different than in original fortran */ @@ -174,7 +175,7 @@ ts_bond *bond){ ts_triangle *lm=NULL,*lp=NULL, *lp1=NULL, *lm2=NULL; - ts_uint i,j, lmidx, lpidx; + ts_uint i,j; //lmidx, lpidx; if(k==NULL || it==NULL || km==NULL || kp==NULL){ fatal("ts_flip_bond: You called me with invalid pointers to vertices",999); } @@ -279,11 +280,11 @@ // 3. step. Correct neighbours in vertex_list - vertex_remove_neighbour(k,it); - vertex_remove_neighbour(it,k); + vtx_remove_neighbour(k,it); + vtx_remove_neighbour(it,k); //Tukaj pa nastopi tezava... Kam dodati soseda? - vertex_insert_neighbour(km,kp,k); - vertex_insert_neighbour(kp,km,it); + vtx_insert_neighbour(km,kp,k); + vtx_insert_neighbour(kp,km,it); // vertex_add_neighbour(km,kp); //pazi na vrstni red. // vertex_add_neighbour(kp,km); //fprintf(stderr,"3. step: vertex neighbours corrected\n"); @@ -318,8 +319,8 @@ // 6. step. Correct tristar for vertices km, kp, k and it vertex_add_tristar(km,lp); // Preveri vrstni red! vertex_add_tristar(kp,lm); - vertex_remove_tristar(it,lm); - vertex_remove_tristar(k,lp); + vtx_remove_tristar(it,lm); + vtx_remove_tristar(k,lp); //fprintf(stderr,"6. step: tristar corrected\n"); /* diff --git a/src/bondflip.h b/src/bondflip.h index 6713c31..8d7ee37 100644 --- a/src/bondflip.h +++ b/src/bondflip.h @@ -1,4 +1,4 @@ -#ifdef _H_BONDFLIP +#ifndef _H_BONDFLIP #define _H_BONDFLIP ts_bool single_bondflip_timestep(ts_vesicle *vesicle, ts_bond *bond, ts_double *rn); diff --git a/src/timestep.c b/src/timestep.c index 1e1ffff..83e6f9b 100644 --- a/src/timestep.c +++ b/src/timestep.c @@ -5,6 +5,7 @@ #include "general.h" #include "timestep.h" #include "vertexmove.h" +#include "bondflip.h" ts_bool single_timestep(ts_vesicle *vesicle){ ts_bool retval; @@ -23,7 +24,7 @@ rnvec[2]=drand48(); //find a bond and return a pointer to a bond... //call single_bondflip_timestep... -// retval=single_bondflip_timestep(vesicle,&vesicle->blist.bond[i],rnvec); + retval=single_bondflip_timestep(vesicle,vesicle->blist->bond[i],rnvec); } if(retval); diff --git a/src/triangle.h b/src/triangle.h index a3d8184..a1a0fd0 100644 --- a/src/triangle.h +++ b/src/triangle.h @@ -6,5 +6,5 @@ ts_bool triangle_add_neighbour(ts_triangle *tria, ts_triangle *ntria); ts_bool triangle_normal_vector(ts_triangle *tria); ts_bool triangle_list_free(ts_triangle_list *tlist); - +ts_bool triangle_remove_neighbour(ts_triangle *tria, ts_triangle *ntria); #endif diff --git a/src/vertex.c b/src/vertex.c index 21ad48e..466c064 100644 --- a/src/vertex.c +++ b/src/vertex.c @@ -79,6 +79,9 @@ j++; } } + if(j==0) { + fatal("vtx_remove_neighbour: Error, vertices are not neighbours", 100); + } /* resize memory. potentionally time consuming */ vtx->neigh_no--; vtx->neigh=(ts_vertex **)realloc(vtx->neigh,vtx->neigh_no*sizeof(ts_vertex *)); @@ -110,11 +113,14 @@ bond=bond_add(blist,vtx1,vtx2); if(bond==NULL) return TS_FAIL; vtx1->bond_no++; + vtx2->bond_no++; // vtx2->data->bond_no++; vtx1->bond=(ts_bond **)realloc(vtx1->bond, vtx1->bond_no*sizeof(ts_bond *)); + vtx2->bond=(ts_bond **)realloc(vtx2->bond, vtx2->bond_no*sizeof(ts_bond *)); // vtx2->data->bond=(ts_bond **)realloc(vtx2->data->bond, vtx2->data->bond_no*sizeof(ts_bond *)); vtx1->bond[vtx1->bond_no-1]=bond; + vtx2->bond[vtx2->bond_no-1]=bond; // vtx2->ata->bond[vtx2->data->bond_no-1]=bond; return TS_SUCCESS; } @@ -207,6 +213,57 @@ } +/* 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 + * elements in some order or not! */ +inline ts_bool vtx_remove_tristar(ts_vertex *vtx, ts_triangle *tristar){ + ts_uint i,j=0; + for(i=0;i<vtx->tristar_no;i++){ + if(vtx->tristar[i]!=tristar){ + vtx->tristar[j]=vtx->tristar[i]; + j++; + } + } + vtx->tristar_no--; + vtx->tristar=realloc(vtx->tristar,vtx->tristar_no*sizeof(ts_triangle *)); + if(vtx->neigh == NULL){ + fatal("Reallocation of memory failed during insertion of vertex neighbour in vertex_add_neighbour",3); + } + return TS_SUCCESS; +} + + + /* ****************************************************************** */ /* ***** New vertex copy operations. Inherently they are slow. ***** */ /* ****************************************************************** */ diff --git a/src/vertex.h b/src/vertex.h index 98efff5..97775d2 100644 --- a/src/vertex.h +++ b/src/vertex.h @@ -24,7 +24,8 @@ 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); ts_vertex **vtx_neigh_copy(ts_vertex_list *vlist,ts_vertex *ovtx); -- Gitblit v1.9.3