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