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/vertexmove.c |  112 ++++++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 88 insertions(+), 24 deletions(-)

diff --git a/src/vertexmove.c b/src/vertexmove.c
index a27a776..b065cbb 100644
--- a/src/vertexmove.c
+++ b/src/vertexmove.c
@@ -1,3 +1,4 @@
+/* vim: set ts=4 sts=4 sw=4 noet : */
 #include<stdlib.h>
 #include<math.h>
 #include "general.h"
@@ -20,7 +21,7 @@
     ts_double dist;
     ts_bool retval; 
     ts_uint cellidx; 
-    ts_double delta_energy,oenergy,dvol=0.0;
+    ts_double delta_energy, delta_energy_cv,oenergy,dvol=0.0, darea=0.0;
     ts_double costheta,sintheta,phi,r;
 	//This will hold all the information of vtx and its neighbours
 	ts_vertex backupvtx[20], *constvol_vtx_moved=NULL, *constvol_vtx_backup=NULL;
@@ -41,7 +42,7 @@
 //    	vtx->y=vtx->y+vesicle->stepsize*(2.0*rn[1]-1.0);
 //    	vtx->z=vtx->z+vesicle->stepsize*(2.0*rn[2]-1.0);
 
-	//random move in a sphere with radius stepsize:
+//random move in a sphere with radius stepsize:
 	r=vesicle->stepsize*rn[0];
 	phi=rn[1]*2*M_PI;
 	costheta=2*rn[2]-1;
@@ -51,12 +52,12 @@
 	vtx->z=vtx->z+r*costheta;
 
 
-    	//distance with neighbours check
+//distance with neighbours check
     for(i=0;i<vtx->neigh_no;i++){
         dist=vtx_distance_sq(vtx,vtx->neigh[i]);
         if(dist<1.0 || dist>vesicle->dmax) {
-		vtx=memcpy((void *)vtx,(void *)&backupvtx[0],sizeof(ts_vertex));
-		return TS_FAIL;
+		    vtx=memcpy((void *)vtx,(void *)&backupvtx[0],sizeof(ts_vertex));
+    		return TS_FAIL;
 		}
     }
 
@@ -87,27 +88,24 @@
     } 
    
  
-    //if all the tests are successful, then energy for vtx and neighbours is calculated
+//if all the tests are successful, then energy for vtx and neighbours is calculated
 	for(i=0;i<vtx->neigh_no;i++){
 	memcpy((void *)&backupvtx[i+1],(void *)vtx->neigh[i],sizeof(ts_vertex));
 	}
 
-	if(vesicle->pswitch == 1){
+	if(vesicle->pswitch == 1 || vesicle->tape->constvolswitch>0){
 		for(i=0;i<vtx->tristar_no;i++) dvol-=vtx->tristar[i]->volume;
-	};
+	}
+
+    if(vesicle->tape->constareaswitch==2){
+		for(i=0;i<vtx->tristar_no;i++) darea-=vtx->tristar[i]->area;
+    
+    }
 
     delta_energy=0;
-
-    if(vesicle->tape->constvolswitch == 1){
-        retval=constvolume(vesicle, vtx, dvol, &delta_energy, constvol_vtx_moved,constvol_vtx_backup);
-        if(retval==TS_FAIL){ // if we couldn't move the vertex to assure constant volume
-            vtx=memcpy((void *)vtx,(void *)&backupvtx[0],sizeof(ts_vertex));
-	        for(i=0;i<vtx->neigh_no;i++){
-		        vtx->neigh[i]=memcpy((void *)vtx->neigh[i],(void *)&backupvtx[i+1],sizeof(ts_vertex));
-	        }
-            return TS_FAIL;
-        }
-    }
+    
+//    vesicle_volume(vesicle);
+//    fprintf(stderr,"Volume in the beginning=%1.16e\n", vesicle->volume);
 
     //update the normals of triangles that share bead i.
     for(i=0;i<vtx->tristar_no;i++) triangle_normal_vector(vtx->tristar[i]);
@@ -121,12 +119,64 @@
         delta_energy+=vtx->neigh[i]->xk*(vtx->neigh[i]->energy-oenergy);
     }
 
-	if(vesicle->pswitch == 1){
+	if(vesicle->pswitch == 1 || vesicle->tape->constvolswitch >0){
 		for(i=0;i<vtx->tristar_no;i++) dvol+=vtx->tristar[i]->volume;
-        delta_energy-=vesicle->pressure*dvol;
+        if(vesicle->pswitch==1) delta_energy-=vesicle->pressure*dvol;
 	};
 
+    if(vesicle->tape->constareaswitch==2){
+        /* check whether the darea is gt epsarea */
+		for(i=0;i<vtx->tristar_no;i++) darea+=vtx->tristar[i]->area;
+        if(fabs(vesicle->area+darea-A0)>epsarea){
+	        //restore old state.
+ 			vtx=memcpy((void *)vtx,(void *)&backupvtx[0],sizeof(ts_vertex));
+	        	for(i=0;i<vtx->neigh_no;i++){
+		        	vtx->neigh[i]=memcpy((void *)vtx->neigh[i],(void *)&backupvtx[i+1],sizeof(ts_vertex));
+	        	}
+            		for(i=0;i<vtx->tristar_no;i++) triangle_normal_vector(vtx->tristar[i]); 
+            		//fprintf(stderr,"fajlam!\n");
+            		return TS_FAIL;
+		}
 
+
+    }
+
+	if(vesicle->tape->constvolswitch==2){
+		/*check whether the dvol is gt than epsvol */
+			//fprintf(stderr,"DVOL=%1.16e\n",dvol);
+		if(fabs(vesicle->volume+dvol-V0)>epsvol){
+			//restore old state.
+ 			vtx=memcpy((void *)vtx,(void *)&backupvtx[0],sizeof(ts_vertex));
+	        	for(i=0;i<vtx->neigh_no;i++){
+		        	vtx->neigh[i]=memcpy((void *)vtx->neigh[i],(void *)&backupvtx[i+1],sizeof(ts_vertex));
+	        	}
+            		for(i=0;i<vtx->tristar_no;i++) triangle_normal_vector(vtx->tristar[i]); 
+            		//fprintf(stderr,"fajlam!\n");
+            		return TS_FAIL;
+		}
+
+	} else
+//    vesicle_volume(vesicle);
+//    fprintf(stderr,"Volume before=%1.16e\n", vesicle->volume);
+   if(vesicle->tape->constvolswitch == 1){
+        retval=constvolume(vesicle, vtx, -dvol, &delta_energy_cv, &constvol_vtx_moved,&constvol_vtx_backup);
+        if(retval==TS_FAIL){ // if we couldn't move the vertex to assure constant volume
+            vtx=memcpy((void *)vtx,(void *)&backupvtx[0],sizeof(ts_vertex));
+	        for(i=0;i<vtx->neigh_no;i++){
+		        vtx->neigh[i]=memcpy((void *)vtx->neigh[i],(void *)&backupvtx[i+1],sizeof(ts_vertex));
+	        }
+            for(i=0;i<vtx->tristar_no;i++) triangle_normal_vector(vtx->tristar[i]); 
+ //           fprintf(stderr,"fajlam!\n");
+            return TS_FAIL;
+        }
+//    vesicle_volume(vesicle);
+//    fprintf(stderr,"Volume after=%1.16e\n", vesicle->volume);
+//    fprintf(stderr,"Volume after-dvol=%1.16e\n", vesicle->volume-dvol);
+//    fprintf(stderr,"Denergy before=%e\n",delta_energy);
+    
+    delta_energy+=delta_energy_cv;
+//    fprintf(stderr,"Denergy after=%e\n",delta_energy);
+    }
 /* No poly-bond energy for now!
 	if(vtx->grafted_poly!=NULL){
 		delta_energy+=
@@ -138,7 +188,7 @@
     //MONTE CARLOOOOOOOO
     if(delta_energy>=0){
 #ifdef TS_DOUBLE_DOUBLE
-        if(exp(-delta_energy)< drand48() )
+        if(exp(-delta_energy)< drand48())
 #endif
 #ifdef TS_DOUBLE_FLOAT
         if(expf(-delta_energy)< (ts_float)drand48())
@@ -148,6 +198,7 @@
 #endif
     {
     //not accepted, reverting changes
+  //  fprintf(stderr,"MC failed\n");
 	vtx=memcpy((void *)vtx,(void *)&backupvtx[0],sizeof(ts_vertex));
 	for(i=0;i<vtx->neigh_no;i++){
 		vtx->neigh[i]=memcpy((void *)vtx->neigh[i],(void *)&backupvtx[i+1],sizeof(ts_vertex));
@@ -156,14 +207,18 @@
     //update the normals of triangles that share bead i.
    for(i=0;i<vtx->tristar_no;i++) triangle_normal_vector(vtx->tristar[i]);
 
+//    fprintf(stderr, "before vtx(x,y,z)=%e,%e,%e\n",constvol_vtx_moved->x, constvol_vtx_moved->y, constvol_vtx_moved->z);
     if(vesicle->tape->constvolswitch == 1){
         constvolumerestore(constvol_vtx_moved,constvol_vtx_backup);
     }
-
+//    fprintf(stderr, "after vtx(x,y,z)=%e,%e,%e\n",constvol_vtx_moved->x, constvol_vtx_moved->y, constvol_vtx_moved->z);
+//    vesicle_volume(vesicle);
+//    fprintf(stderr,"Volume after fail=%1.16e\n", vesicle->volume);
     return TS_FAIL; 
     }
 }
 	//accepted	
+ //   fprintf(stderr,"MC accepted\n");
 //	oldcellidx=vertex_self_avoidance(vesicle, &backupvtx[0]);
 	if(vtx->cell!=vesicle->clist->cell[cellidx]){
 		retval=cell_add_vertex(vesicle->clist->cell[cellidx],vtx);
@@ -172,11 +227,20 @@
 		
 	}
 
+    if(vesicle->tape->constvolswitch == 2){
+	vesicle->volume+=dvol;
+    } else
     if(vesicle->tape->constvolswitch == 1){
-        constvolumeaccept(constvol_vtx_moved,constvol_vtx_backup);
+        constvolumeaccept(vesicle,constvol_vtx_moved,constvol_vtx_backup);
+    }
+
+    if(vesicle->tape->constareaswitch==2){
+        vesicle->area+=darea;
     }
 //	if(oldcellidx);
     //END MONTE CARLOOOOOOO
+//    vesicle_volume(vesicle);
+//    fprintf(stderr,"Volume after success=%1.16e\n", vesicle->volume);
     return TS_SUCCESS;
 }
 

--
Gitblit v1.9.3