From 60c2b879f26c5f008af0df7d7f159d33077225ac Mon Sep 17 00:00:00 2001
From: Samo Penic <samo.penic@gmail.com>
Date: Sat, 09 Mar 2019 19:47:16 +0000
Subject: [PATCH] Cleanup of stretching energy plugin

---
 src/plugins.c |  158 ++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 138 insertions(+), 20 deletions(-)

diff --git a/src/plugins.c b/src/plugins.c
index 7681984..3146c2a 100644
--- a/src/plugins.c
+++ b/src/plugins.c
@@ -1,28 +1,91 @@
 /* This is a first attempt in implementation of plugins to Trisurf-ng. */
 
 /*
-1. Capabilities of Plugin
--------------------------
 
-Every plugin should list it's capabilities -- that is what subrutines are available in it. Capabilities list for the moment are:
+Options for tape:
 
-* PLUGIN_PROGRAM_START (requires subrutine void at_start(void)): runs at startup
-* PLUGIN_VESICLE_INITIALIZED (requires subrutine void after_vesicle_init(vesicle *vesicle):
-	runs after vesicle gets initialized.
+extra_plugin_path = "..." (OPTIONAL)
 
-* PLUGIN_VERTEX_MOVE (requires subrutines:
+vesicle bipyramid {
+	nshell=23	
+}
 
-	ts_bool vm_hard_constraint(vesicle *vesicle, vtx *vtx, vtx *old_vtx)
-	ts_double vm_energy_before(vesicle *vesicle, vtx *vtx)
-	ts_double vm_energy_after(vesicle *vesicle, vtx *vtx)
-	ts_double vm_new_state_accepted(vesicle *vesicle, vtx *vtx)
-	ts_double vm_new_state_rejected(vesicle *vesicle, vtx *vtx)
+vesicle vtufile {
+	filename="filename"
+}
 
-	)
+vesicle vtudatabase {
+	run_id=123
+	timestep=999
+}
 
-	these subrutines are added into the vertex move into right places
+vesicle properties {
+	xk0=20
+	dmax=1.7
+	dmin_interspecies=1.2
+	stepsize=0.15
+}
 
-* PLUGIN_BOND_FLIP ( N/A yet)
+space properties {
+	nxmax=60
+	nymax=60
+	nzmax=60
+}
+
+loop control {
+	inner=1000
+	outer=1000
+}
+
+plugin pressure {
+	pressure=10
+}
+
+plugin constant_volume {
+	precision=1e14
+}
+
+plugin constant_area {
+
+}
+
+plugin confinement_plate {
+	distance=5
+	force=10
+	coordinate=2 // 0=x,1=y,2=z
+}
+
+plugin spherical_harmonics {
+	lmax=21
+	filename="abc.csv"
+}
+
+plugin spontaneous_curvature {
+	c0=2
+	N=100
+	w=10
+	force=3
+}
+
+plugin filament {
+	monomers=100
+	xi=10
+}
+
+plugin polymer {
+	polymers = 100
+	monomers = 10
+	elastic_coefficient=100
+	is_internal = true
+}
+
+plugin nucleus {
+	R_nucleus=10
+	R_nucleusX=0
+	R_nucleusY=0
+	R_nucleusZ=0
+}
+
 */
 #include "plugins.h"
 #include <stdlib.h>
@@ -32,14 +95,18 @@
 
 ts_plugin *init_plugin(ts_char *filename){
 	ts_plugin *plugin = (ts_plugin *)calloc(1, sizeof(ts_plugin));
-	plugin->filename=(ts_char *)calloc(strlen(filename),sizeof(ts_char));
+	plugin->filename=(ts_char *)calloc(strlen(filename)+1,sizeof(ts_char));
 	strcpy(plugin->filename,filename);
 	plugin->libhandle = dlopen(plugin->filename, RTLD_NOW);
 	if(!plugin->libhandle){
-		ts_fprintf(stderr,"Error loading plugin: %s\n", filename);
+		ts_fprintf(stderr,"Error loading plugin: %s\n", plugin->filename);
 		fatal("Exiting",235);
 	}
 	ts_plugin_details* (*get_plugin_details)(void) = dlsym(plugin->libhandle, "init");
+	if(get_plugin_details==NULL){
+		ts_fprintf(stderr,"Plugin %s invalid. No init() function.\n", plugin->filename);
+		fatal("Exiting", 236);
+	}
 	plugin->details = get_plugin_details();
 	plugin->function = (ts_plugin_function *)calloc(1,sizeof(ts_plugin_function));
 	
@@ -47,8 +114,11 @@
 	plugin->function->at_start = dlsym(plugin->libhandle, "at_start");
 	plugin->function->after_vesicle_init = dlsym(plugin->libhandle, "after_vesicle_init");
 	plugin->function->vm_hard_constraint = dlsym(plugin->libhandle, "vm_hard_constraint");
-	plugin->function->vm_energy_before = dlsym(plugin->libhandle, "vm_energy_before");
-	plugin->function->vm_energy_after = dlsym(plugin->libhandle, "vm_energy_after");
+	plugin->function->vm_energy_before_prepare = dlsym(plugin->libhandle, "vm_energy_before_prepare");
+	plugin->function->vm_energy_before_execute = dlsym(plugin->libhandle, "vm_energy_before_execute");
+	plugin->function->vm_energy_after_prepare = dlsym(plugin->libhandle, "vm_energy_after_prepare");
+	plugin->function->vm_energy_after_execute = dlsym(plugin->libhandle, "vm_energy_after_execute");
+	plugin->function->vm_before_montecarlo_constraint = dlsym(plugin->libhandle, "vm_before_montecarlo_constraint");
 	plugin->function->vm_new_state_rejected = dlsym(plugin->libhandle, "vm_new_state_rejected");
 	plugin->function->vm_new_state_accepted = dlsym(plugin->libhandle, "vm_new_state_accepted");
 
@@ -56,12 +126,59 @@
 }
 
 
+ts_plugin_chain *plugin_to_chain(ts_plugin_chain *chain, ts_plugin *plugin){
+	ts_plugin_chain *retchain;
+	if(chain!=NULL){
+		retchain=chain;
+		while(chain->next!=NULL){
+			chain=chain->next;
+		}
+		chain->next=(ts_plugin_chain *)calloc(1,sizeof(ts_plugin_chain));
+		chain->next->plugin=plugin;
+		return retchain;
+	} else {
+		chain=(ts_plugin_chain *)calloc(1,sizeof(ts_plugin_chain));
+		chain->plugin=plugin;
+		return chain;
+	}
+}
+
+
 ts_plugin_list *init_plugin_list(ts_char **plugin_filenames, ts_uint number_of_plugins){
 	ts_plugin_list *plist=(ts_plugin_list *)calloc(1, sizeof(ts_plugin_list));
 	plist->plugin=(ts_plugin **)calloc(number_of_plugins, sizeof(ts_plugin *));
+	plist->chain=(ts_plugin_chains *)calloc(1, sizeof(ts_plugin_chains));
 	for(int i=0;i<number_of_plugins;i++){
 		plist->plugin[i]=init_plugin(plugin_filenames[i]);
+		if(plist->plugin[i]->function->cleanup!=NULL){
+			plist->chain->cleanup=plugin_to_chain(plist->chain->cleanup, plist->plugin[i]);
+		}
+		if(plist->plugin[i]->function->at_start!=NULL){
+			plist->chain->at_start=plugin_to_chain(plist->chain->at_start, plist->plugin[i]);
+		}
+		if(plist->plugin[i]->function->after_vesicle_init!=NULL){
+			plist->chain->after_vesicle_init=plugin_to_chain(plist->chain->after_vesicle_init, plist->plugin[i]);
+		}
+		if(plist->plugin[i]->function->vm_hard_constraint!=NULL){
+			plist->chain->vm_hard_constraint=plugin_to_chain(plist->chain->vm_hard_constraint, plist->plugin[i]);
+		}
+		if(plist->plugin[i]->function->vm_energy_before_prepare!=NULL){
+			plist->chain->vm_energy_before_prepare=plugin_to_chain(plist->chain->vm_energy_before_prepare, plist->plugin[i]);
+		}
+		if(plist->plugin[i]->function->vm_energy_after_execute!=NULL){
+			plist->chain->vm_energy_after_execute=plugin_to_chain(plist->chain->vm_energy_after_execute, plist->plugin[i]);
+		}
+		if(plist->plugin[i]->function->vm_before_montecarlo_constraint!=NULL){
+			plist->chain->vm_before_montecarlo_constraint=plugin_to_chain(plist->chain->vm_before_montecarlo_constraint, plist->plugin[i]);
+		}
+		if(plist->plugin[i]->function->vm_new_state_accepted!=NULL){
+			plist->chain->vm_new_state_accepted=plugin_to_chain(plist->chain->vm_new_state_accepted, plist->plugin[i]);
+		}
+		if(plist->plugin[i]->function->vm_new_state_rejected!=NULL){
+			plist->chain->vm_new_state_rejected=plugin_to_chain(plist->chain->vm_new_state_rejected, plist->plugin[i]);
+		}
 	}
+	plist->n=number_of_plugins;
 	return plist;
 }	
 
@@ -74,9 +191,10 @@
 	free(plugin);
 }
 
-void free_plugin_list(ts_plugin_list *plist){
+void plugin_list_free(ts_plugin_list *plist){
 	for(int i=0;i<plist->n;i++){
 		free_plugin(plist->plugin[i]);
 	}
+	free(plist->chain);
 	free(plist);
 }

--
Gitblit v1.9.3