From bd826de2f539f2e48c8c01d2d7f9f34c7e97104a Mon Sep 17 00:00:00 2001
From: Samo Penic <samo.penic@gmail.com>
Date: Fri, 13 May 2016 07:43:27 +0000
Subject: [PATCH] Fix in trisurf output, inhibiting print of successful reconstruction. Multiple fixes and improvements in python module. Added symlinking of tapes into the running directories and dumping tapes from snapshots into tape files.

---
 src/bondflip.c |  130 ++++++++++++++++++++++++++++++++++---------
 1 files changed, 103 insertions(+), 27 deletions(-)

diff --git a/src/bondflip.c b/src/bondflip.c
index 1a21d92..858dc74 100644
--- a/src/bondflip.c
+++ b/src/bondflip.c
@@ -1,3 +1,4 @@
+/* vim: set ts=4 sts=4 sw=4 noet : */
 #include<stdlib.h>
 #include<math.h>
 #include "general.h"
@@ -31,7 +32,7 @@
     ts_vertex *k=bond->vtx2;
     ts_uint nei,neip,neim;
     ts_uint i,j;
-    ts_double oldenergy, delta_energy, dvol=0.0;
+    ts_double oldenergy, delta_energy, dvol=0.0, darea=0.0;
     ts_triangle *lm=NULL,*lp=NULL, *lp1=NULL, *lm2=NULL;
 
     ts_vertex *kp,*km;
@@ -169,7 +170,11 @@
   oldenergy+=it->xk* it->energy;
   //Neigbours of k, it, km, kp don't change its energy.
 
-	if(vesicle->pswitch == 1 || vesicle->tape->constvolswitch==1){dvol = -lm->volume - lp->volume;}
+	if(vesicle->pswitch == 1 || vesicle->tape->constvolswitch>0){dvol = -lm->volume - lp->volume;}
+    if(vesicle->tape->constareaswitch==2){darea=-lm->area-lp->area;} 
+/*    vesicle_volume(vesicle);
+    fprintf(stderr,"Volume in the beginning=%1.16e\n", vesicle->volume);
+*/
 
 /* fix data structure for flipped bond */
     ts_flip_bond(k,it,km,kp, bond,lm, lp, lm2, lp1);
@@ -184,38 +189,100 @@
   //Neigbours of k, it, km, kp don't change its energy.
 
     delta_energy-=oldenergy;
-	if(vesicle->pswitch == 1 || vesicle->tape->constvolswitch==1){
+	if(vesicle->pswitch == 1 || vesicle->tape->constvolswitch>0){
 		dvol = dvol + lm->volume + lp->volume;
 		if(vesicle->pswitch==1) delta_energy-= vesicle->pressure*dvol;
 	}
+    if(vesicle->tape->constareaswitch==2){
+        darea=darea+lm->area+lp->area; 
+/*check whether the dvol is gt than epsvol */
+		if(fabs(vesicle->area+darea-A0)>epsarea){
+			//restore old state.
+			/* restoration procedure copied from few lines below */
+			    for(i=0;i<4;i++){
+			//			fprintf(stderr,"Restoring vtx neigh[%d] with neighbours %d\n",i, orig_vtx[i]->neigh_no );
+				free(orig_vtx[i]->neigh);
+				free(orig_vtx[i]->tristar);
+				free(orig_vtx[i]->bond);
+				free(orig_tria[i]->neigh);
+				memcpy((void *)orig_vtx[i],(void *)bck_vtx[i],sizeof(ts_vertex));
+				memcpy((void *)orig_tria[i],(void *)bck_tria[i],sizeof(ts_triangle));
+			//			fprintf(stderr,"Restored vtx neigh[%d] with neighbours %d\n",i, orig_vtx[i]->neigh_no );
+				/* level 2 pointers are redirected*/
+			    }
+			    memcpy(bond,bck_bond,sizeof(ts_bond));
+			    for(i=0;i<4;i++){
+				free(bck_vtx[i]);
+				free(bck_tria[i]);
+			/*			fprintf(stderr,"Restoring vtx neigh[%d] with neighbours %d =",i, orig_vtx[i]->neigh_no );
+				for(j=0;j<orig_vtx[i]->neigh_no;j++) fprintf(stderr," %d", orig_vtx[i]->neigh[j]->idx);
+				fprintf(stderr,"\n"); */
+			    }
+			    free(bck_bond);
+			    return TS_FAIL;
 
+		}
+    }
+
+
+
+
+	if(vesicle->tape->constvolswitch == 2){
+		/*check whether the dvol is gt than epsvol */
+		if(fabs(vesicle->volume+dvol-V0)>epsvol){
+			//restore old state.
+			/* restoration procedure copied from few lines below */
+			    for(i=0;i<4;i++){
+			//			fprintf(stderr,"Restoring vtx neigh[%d] with neighbours %d\n",i, orig_vtx[i]->neigh_no );
+				free(orig_vtx[i]->neigh);
+				free(orig_vtx[i]->tristar);
+				free(orig_vtx[i]->bond);
+				free(orig_tria[i]->neigh);
+				memcpy((void *)orig_vtx[i],(void *)bck_vtx[i],sizeof(ts_vertex));
+				memcpy((void *)orig_tria[i],(void *)bck_tria[i],sizeof(ts_triangle));
+			//			fprintf(stderr,"Restored vtx neigh[%d] with neighbours %d\n",i, orig_vtx[i]->neigh_no );
+				/* level 2 pointers are redirected*/
+			    }
+			    memcpy(bond,bck_bond,sizeof(ts_bond));
+			    for(i=0;i<4;i++){
+				free(bck_vtx[i]);
+				free(bck_tria[i]);
+			/*			fprintf(stderr,"Restoring vtx neigh[%d] with neighbours %d =",i, orig_vtx[i]->neigh_no );
+				for(j=0;j<orig_vtx[i]->neigh_no;j++) fprintf(stderr," %d", orig_vtx[i]->neigh[j]->idx);
+				fprintf(stderr,"\n"); */
+			    }
+			    free(bck_bond);
+			    return TS_FAIL;
+
+		}
+
+	} else
     if(vesicle->tape->constvolswitch == 1){
-        retval=constvolume(vesicle, it, dvol, &delta_energy_cv, &constvol_vtx_moved,&constvol_vtx_backup);
+        retval=constvolume(vesicle, it, -dvol, &delta_energy_cv, &constvol_vtx_moved,&constvol_vtx_backup);
         if(retval==TS_FAIL){
 /* restoration procedure copied from few lines below */
-		for(i=0;i<4;i++){
-//			fprintf(stderr,"Restoring vtx neigh[%d] with neighbours %d\n",i, orig_vtx[i]->neigh_no );
-			free(orig_vtx[i]->neigh);
-			free(orig_vtx[i]->tristar);
-			free(orig_vtx[i]->bond);
-			free(orig_tria[i]->neigh);
-			memcpy((void *)orig_vtx[i],(void *)bck_vtx[i],sizeof(ts_vertex));
-			memcpy((void *)orig_tria[i],(void *)bck_tria[i],sizeof(ts_triangle));
-//			fprintf(stderr,"Restored vtx neigh[%d] with neighbours %d\n",i, orig_vtx[i]->neigh_no );
-			/* level 2 pointers are redirected*/
-		}
-		memcpy(bond,bck_bond,sizeof(ts_bond));
-		for(i=0;i<4;i++){
-			free(bck_vtx[i]);
-			free(bck_tria[i]);
-/*			fprintf(stderr,"Restoring vtx neigh[%d] with neighbours %d =",i, orig_vtx[i]->neigh_no );
-			for(j=0;j<orig_vtx[i]->neigh_no;j++) fprintf(stderr," %d", orig_vtx[i]->neigh[j]->idx);
-			fprintf(stderr,"\n"); */
-		}
-		free(bck_bond);
-        return TS_FAIL;
+            for(i=0;i<4;i++){
+    //			fprintf(stderr,"Restoring vtx neigh[%d] with neighbours %d\n",i, orig_vtx[i]->neigh_no );
+                free(orig_vtx[i]->neigh);
+                free(orig_vtx[i]->tristar);
+                free(orig_vtx[i]->bond);
+                free(orig_tria[i]->neigh);
+                memcpy((void *)orig_vtx[i],(void *)bck_vtx[i],sizeof(ts_vertex));
+                memcpy((void *)orig_tria[i],(void *)bck_tria[i],sizeof(ts_triangle));
+    //			fprintf(stderr,"Restored vtx neigh[%d] with neighbours %d\n",i, orig_vtx[i]->neigh_no );
+                /* level 2 pointers are redirected*/
+            }
+            memcpy(bond,bck_bond,sizeof(ts_bond));
+            for(i=0;i<4;i++){
+                free(bck_vtx[i]);
+                free(bck_tria[i]);
+    /*			fprintf(stderr,"Restoring vtx neigh[%d] with neighbours %d =",i, orig_vtx[i]->neigh_no );
+                for(j=0;j<orig_vtx[i]->neigh_no;j++) fprintf(stderr," %d", orig_vtx[i]->neigh[j]->idx);
+                fprintf(stderr,"\n"); */
+            }
+            free(bck_bond);
+            return TS_FAIL;
         }
-
         delta_energy+=delta_energy_cv;
     }
 
@@ -263,6 +330,8 @@
 		free(bck_bond);
 
 //		fprintf(stderr,"Restoration complete!!!\n");
+//    vesicle_volume(vesicle);
+//    fprintf(stderr,"Volume after fail=%1.16e\n", vesicle->volume);
 
 		return TS_FAIL;
         }
@@ -270,8 +339,13 @@
      /* IF BONDFLIP ACCEPTED, THEN RETURN SUCCESS! */
 //            fprintf(stderr,"SUCCESS!!!\n");
 
-    if(vesicle->tape->constvolswitch == 1){
+    if(vesicle->tape->constvolswitch == 2){
+	    vesicle->volume+=dvol;
+    } else if(vesicle->tape->constvolswitch == 1){
         constvolumeaccept(vesicle,constvol_vtx_moved,constvol_vtx_backup);
+    }
+    if(vesicle->tape->constareaswitch==2){
+        vesicle->area+=darea;
     }
 	// delete all backups
 	for(i=0;i<4;i++){
@@ -288,6 +362,8 @@
 	}
 	free(bck_bond);
 
+//    vesicle_volume(vesicle);
+//    fprintf(stderr,"Volume after success=%1.16e\n", vesicle->volume);
     return TS_SUCCESS;
 }
 

--
Gitblit v1.9.3