network/varmap.c

00001 /* varmap.c
00002  *
00003  */
00004 
00005 #include <stdlib.h>
00006 #include <stdio.h>
00007 #include <errno.h>
00008 #include <math.h>
00009 #include "network.h"
00010 
00011 // Variable export table
00012 typedef struct {
00013     char *name;
00014     double *addr;
00015     double min, max;
00016 } VARMAP;
00017 VARMAP varmap[] = {
00018 #define MAP(X,LO,HI) {#X,&X,LO,HI}
00019     /* add global variables you want to be available to core */
00020     MAP(convergence_limit,1e-8,1e-0),
00021     MAP(acceleration_factor,0.5,2.0),
00022     MAP(mvabase,0.0,0.0),
00023 };
00024 
00025 EXPORT int setvar(char *varname, char *value)
00026 {
00027     VARMAP *p;
00028     for (p=varmap; p<varmap+sizeof(varmap)/sizeof(varmap[0]); p++)
00029     {
00030         if (strcmp(p->name,varname)==0)
00031         {
00032             double v = atof(value);
00033             if (p->min<p->max && v>=p->min && v<=p->max)
00034             {   *(p->addr) = v; return 1;}
00035             else
00036                 return 0;
00037         }
00038     }
00039     return 0;
00040 }
00041 
00042 EXPORT void* getvar(char *varname, char *value, unsigned int size)
00043 {
00044     VARMAP *p;
00045     if (value==NULL && varname[0]=='\0') // first iterator
00046     {
00047         strcpy(varname,varmap[0].name);
00048         return (void*)1;
00049     }
00050     for (p=varmap; p<varmap+sizeof(varmap)/sizeof(varmap[0]); p++)
00051     {
00052         if (strcmp(p->name,varname)==0)
00053         {
00054             if (size==-1) // indicates the addr is desired
00055             {
00056                 return (void*)p->addr;
00057             }
00058             else if (value==NULL) // next iterator
00059             {
00060                 if (p+1<varmap+sizeof(varmap)/sizeof(varmap[0])) 
00061                 {
00062                     strcpy(varname,(p+1)->name);
00063                     return (void*)1;
00064                 }
00065                 else
00066                 {
00067                     return (void*)0; // done iterating
00068                 }
00069             }
00070             else {
00071                 double *v = p->addr;
00072                 sprintf(value,"%lg",*v);
00073                 return (void*)1;
00074             }
00075         }
00076     }
00077     return (void*)0;
00078 }

GridLAB-DTM Version 1.0
An open-source project initiated by the US Department of Energy