From 719c9febac2eaff9483fda487b57684afbb59bb2 Mon Sep 17 00:00:00 2001 From: Samo Penic <samo.penic@gmail.com> Date: Wed, 05 Mar 2014 16:47:50 +0000 Subject: [PATCH] dont know --- src/bondflip.c | 147 ++++++++++++++++++++---------------------------- 1 files changed, 62 insertions(+), 85 deletions(-) diff --git a/src/bondflip.c b/src/bondflip.c index 17a1977..4ceaf2b 100644 --- a/src/bondflip.c +++ b/src/bondflip.c @@ -15,10 +15,10 @@ ts_bool single_bondflip_timestep(ts_vesicle *vesicle, ts_bond *bond, ts_double *rn){ /*c Vertex and triangle (lm and lp) indexing for bond flip: c +----- k-------+ +----- k ------+ -c |lm1 / | \ lp1 | |lm1 / \ lp1 | +c |lm1 / ^ \ lp1 | |lm1 / \ lp1 | c | / | \ | | / \ | c |/ | \ | FLIP |/ lm \ | -c km lm | lp kp ---> km ---------- kp +c km lm | lp kp ---> km ---------> kp c |\ | / | |\ lp / | c | \ | / | | \ / | c |lm2 \ | / lp2 | |lm2 \ / lp2 | @@ -27,50 +27,28 @@ */ ts_vertex *it=bond->vtx1; ts_vertex *k=bond->vtx2; - ts_uint nei,neip,neim; - ts_uint i; //j; + // ts_uint nei,neip,neim; + ts_uint i; ts_double oldenergy, delta_energy; - // ts_triangle *lm=NULL,*lp=NULL, *lp1=NULL, *lp2=NULL, *lm1=NULL, *lm2=NULL; - - ts_vertex *kp,*km; - - if(it->neigh->n< 3) return TS_FAIL; - if(k->neigh->n< 3) return TS_FAIL; - if(k==NULL || it==NULL){ - fatal("In bondflip, number of neighbours of k or it is less than 3!",999); - } - - nei=0; - for(i=0;i<it->neigh->n;i++){ // Finds the nn of it, that is k - if(it->neigh->vtx[i]==k){ - nei=i; - break; - } - } - neip=nei+1; // I don't like it.. Smells like I must have it in correct order - neim=nei-1; - if(neip>=it->neigh->n) neip=0; - if((ts_int)neim<0) neim=it->neigh->n-1; /* casting is essential... If not -there the neim is never <0 !!! */ - // fprintf(stderr,"The numbers are: %u %u\n",neip, neim); - km=it->neigh->vtx[neim]; // We located km and kp - kp=it->neigh->vtx[neip]; - - if(km==NULL || kp==NULL){ - fatal("In bondflip, cannot determine km and kp!",999); - } - - // fprintf(stderr,"I WAS HERE! after the 4 vertices are known!\n"); +#ifdef DEBUG + if(bond->adjvtx[0]==NULL || bond->adjvtx[1]==NULL) fatal ("single_bondflip_timestep: Adjvertex for called bond is null. This should not happen!",999); +#endif + ts_vertex *kp=bond->adjvtx[1],*km=bond->adjvtx[0]; +// ts_triangle *lm=NULL, *lp=NULL; /* test if the membrane is wrapped too much, so that kp is nearest neighbour of * km. If it is true, then don't flip! */ - for(i=0;i<km->neigh->n;i++){ +/*TODO: dec2013, i think this never happens! + for(i=0;i<km->neigh->n;i++){ if(km->neigh->vtx[i] == kp) return TS_FAIL; } +*/ + + // fprintf(stderr,"Membrane didn't wrap too much.. Continue.\n"); /* if bond would be too long, return... */ - if(vtx_distance_sq(km,kp) > vesicle->dmax ) return TS_FAIL; - // fprintf(stderr,"Bond will not be too long.. Continue.\n"); + if(vtx_distance_sq(bond->adjvtx[0],bond->adjvtx[1]) > 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 */ // 0. step. Get memory prior the flip @@ -101,12 +79,13 @@ */ -// fprintf(stderr,"I WAS HERE! Before bondflip!\n"); - ts_flip_bond(k,it,km,kp, bond); + // fprintf(stderr,"I WAS HERE! Before bondflip!\n"); + ts_flip_bond(bond); // fprintf(stderr,"I WAS HERE! Bondflip successful!\n"); /* Calculating the new energy */ delta_energy=0; +/* TODO: why this neighs are recalculated? Not necessary! */ for(i=0;i<k->neigh->n;i++) energy_vertex(k->neigh->vtx[i]); for(i=0;i<kp->neigh->n;i++) energy_vertex(kp->neigh->vtx[i]); for(i=0;i<km->neigh->n;i++) energy_vertex(km->neigh->vtx[i]); @@ -134,10 +113,10 @@ #endif { //not accepted, reverting changes - // fprintf(stderr,"Failed to move, due to MC\n"); + fprintf(stderr,"Failed to move, due to MC\n"); // ts_flip_bond(km,kp,it,k, bond); - ts_flip_bond(kp,km,k,it, bond); + ts_flip_bond(bond); /* @@ -163,7 +142,7 @@ return TS_FAIL; } } - // fprintf(stderr,"Success\n"); + fprintf(stderr,"Success\n"); /* IF BONDFLIP ACCEPTED, THEN RETURN SUCCESS! */ @@ -171,51 +150,17 @@ } -ts_bool ts_flip_bond(ts_vertex *k,ts_vertex *it,ts_vertex *km, ts_vertex *kp, -ts_bond *bond){ - +ts_bool ts_flip_bond(ts_bond *bond){ +fprintf(stderr,"Called!\n"); ts_triangle *lm=NULL,*lp=NULL, *lp1=NULL, *lm2=NULL; 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); -} -// 1. step. We find lm and lp from k->tristar ! - for(i=0;i<it->tristar_no;i++){ - for(j=0;j<k->tristar_no;j++){ - if((it->tristar[i] == k->tristar[j])){ //ce gre za skupen trikotnik - if((it->tristar[i]->vertex[0] == km || it->tristar[i]->vertex[1] -== km || it->tristar[i]->vertex[2]== km )){ - lm=it->tristar[i]; - // lmidx=i; - } - else - { - lp=it->tristar[i]; - // lpidx=i; - } - } - } - } -if(lm==NULL || lp==NULL) fatal("ts_flip_bond: Cannot find triangles lm and lp!",999); - -//we look for important triangles lp1 and lm2. - - for(i=0;i<k->tristar_no;i++){ - for(j=0;j<kp->tristar_no;j++){ - if((k->tristar[i] == kp->tristar[j]) && k->tristar[i]!=lp){ //ce gre za skupen trikotnik - lp1=k->tristar[i]; - } - } -} - - for(i=0;i<it->tristar_no;i++){ - for(j=0;j<km->tristar_no;j++){ - if((it->tristar[i] == km->tristar[j]) && it->tristar[i]!=lm){ //ce gre za skupen trikotnik - lm2=it->tristar[i]; - } - } - } +ts_vertex *it=bond->vtx1; +ts_vertex *k=bond->vtx2; +ts_vertex *km=bond->adjvtx[0]; +ts_vertex *kp=bond->adjvtx[1]; +lm=bond->tria[0]; +lp=bond->tria[1]; /* // DEBUG TESTING! fprintf(stderr,"*** Naslov k=%d\n",k); @@ -231,6 +176,35 @@ // END DEBUG TESTING! */ +//find bonds between k and kp (adj[1] vtx) +//find bonds between it and km (adj[0] vtx) + +for(i=0;i<3;i++){ +if(lm->neigh[i]==lp) break; + for(j=0;j<3;j++){ + if(lm->neigh[i]->vertex[j]==it) lm2=lm->neigh[i]; + } +} + +for(i=0;i<3;i++){ +if(lp->neigh[i]==lm) break; + for(j=0;j<3;j++){ + if(lp->neigh[i]->vertex[j]==k) lp1=lp->neigh[i]; + } +} + +/* +for(i=0;i<it->tristar_no;i++){ + if((it->tristar[i]->vertex[0]==km || it->tristar[i]->vertex[1]==km || it->tristar[i]->vertex[2]==km) && (it->tristar[i]->vertex[0]==it || it->tristar[i]->vertex[1]==it || it->tristar[i]->vertex[2]==it)){ + lm2=it->tristar[i]; + } + else if ((it->tristar[i]->vertex[0]==kp || it->tristar[i]->vertex[1]==kp || it->tristar[i]->vertex[2]==kp) && (it->tristar[i]->vertex[0]==k || it->tristar[i]->vertex[1]==k || it->tristar[i]->vertex[2]==k)){ + lp1=it->tristar[i]; + } +} +*/ +if(lm2==NULL ) fatal("ts_flip_bond: Cannot find triangles lm2!",999); +if(lp1==NULL ) fatal("ts_flip_bond: Cannot find triangles lp1!",999); if(lm2==NULL || lp1==NULL) fatal("ts_flip_bond: Cannot find triangles lm2 and lp1!",999); /* @@ -351,7 +325,10 @@ energy_vertex(km); energy_vertex(it); +//Extra steps for new bond data structure +bond->adjvtx[0]=k; +bond->adjvtx[1]=it; // END modifications to data structure! -- Gitblit v1.9.3