| | |
| | | /* 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> |
| | |
| | | |
| | | 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)); |
| | | |
| | |
| | | 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"); |
| | | |
| | |
| | | } |
| | | |
| | | |
| | | 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; |
| | | } |
| | | |
| | |
| | | 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); |
| | | } |