Trisurf Monte Carlo simulator
Samo Penic
2019-03-09 60c2b879f26c5f008af0df7d7f159d33077225ac
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);
}