NEURON
units.cpp File Reference
#include <../../nmodlconf.h>
#include "nrnassrt.h"
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>
#include "units.h"
#include <assert.h>

Go to the source code of this file.

Classes

struct  table
 
struct  prefix
 

Macros

#define NRN_DYNAMIC_UNITS   0
 The strategy for dynamic units selection between Legacy and modern units is to maintain two complete tables respectively. More...
 
#define IFUNITS
 
#define OUTTOLERANCE(arg1, arg2)   (fabs(arg2 / arg1 - 1.) > 1.e-5)
 
#define NTAB   601
 
#define SUFFIX   ""
 
#define UNIT_STK_SIZE   20
 

Functions

double fabs (double)
 
void diag (char *, char *)
 
double getflt ()
 
void fperr (int)
 
int lookup (char *name, unit *up, int den, int c)
 
struct tablehash_table (char *)
 
void chkfperror ()
 
void units (unit *)
 
int pu (int, int, int)
 
int convr (unit *)
 
void units_cpp_init ()
 
int get ()
 
void Unit_push (char *)
 
static int Getc (FILE *inp)
 
static char * neuronhome ()
 
char * Unit_str (unit *up)
 
void unit_pop ()
 
void unit_swap ()
 
double unit_mag ()
 
void unit_mag_mul (double d)
 
void punit ()
 
void ucopypop (unit *up)
 
void ucopypush (unit *up)
 
void unit_push_num (double d)
 
void unitcheck (char *s)
 
char * unit_str ()
 
static void install_units_help (char *s1, char *s2)
 
static void switch_units (int legacy)
 
void install_units (char *s1, char *s2)
 
void check_num ()
 
void unit_mul ()
 
void unit_div ()
 
void Unit_exponent (int val)
 
int unit_cmp_exact ()
 
static void print_unit_expr (int i)
 
void Unit_cmp ()
 
int unit_diff ()
 
void dimensionless ()
 
void unit_less ()
 
void unit_stk_clean ()
 
static void units_alloc ()
 
void unit_init ()
 
static int equal (char *s1, char *s2)
 
static double dynam_unit_mag (int legacy, char *u1, char *u2)
 
void nrnunit_dynamic_str (char *buf, const char *name, char *u1, char *u2)
 

Variables

int unitonflag = 1
 
static int UnitsOn = 0
 
static char * dfile = "/usr/lib/units"
 
static char * dfilealt = "../../share/lib/nrnunits.lib" SUFFIX
 
static char * unames [NDIM]
 
static struct tabletable
 
static char * names
 
static struct prefix prefix []
 
static FILE * inpfile
 
static int fperrc
 
static int peekc
 
static int dumpflg
 
static char * pc
 
static struct unit unit_stack [UNIT_STK_SIZE]
 
static struct unitusp {nullptr}
 
static char * ucp
 

Macro Definition Documentation

◆ IFUNITS

#define IFUNITS
Value:
{ \
if (!UnitsOn) \
return; \
}
static int UnitsOn
Definition: units.cpp:46

Definition at line 51 of file units.cpp.

◆ NRN_DYNAMIC_UNITS

#define NRN_DYNAMIC_UNITS   0

The strategy for dynamic units selection between Legacy and modern units is to maintain two complete tables respectively.

Legacy and modern in the nrnunits.lib.in file are distinquished by, e.g., @LegacyY@faraday 9.6485309+4 coul @LegacyN@faraday 96485.3321233100184 coul The reason for two complete tables, as opposed to a main table and several short legacy and modern tables, is that units are often defined in terms of modified units. eg, "R = (k-mole) (joule/degC)"

Nmodl, via the parser, uses only unit_pop, unit_mag, Unit_push, install_units, unit_div, and modl_units.

The issue of unit magnitude arises only when declaring a unit factor as in the gasconstant (R) above or with the equivalent "name = (unit) -> (unit)" syntax. If the magnitude difers between legacy and modern, then instead of emitting code like "static double FARADAY = 96485.3;\n" we can emit #define FARADAY nrnunit_FARADAY[nrnunit_use_legacy] static double nrnunit_FARADAY[2] = {96485.3321233100184, 96485.3};

Definition at line 35 of file units.cpp.

◆ NTAB

#define NTAB   601

Definition at line 58 of file units.cpp.

◆ OUTTOLERANCE

#define OUTTOLERANCE (   arg1,
  arg2 
)    (fabs(arg2 / arg1 - 1.) > 1.e-5)

Definition at line 56 of file units.cpp.

◆ SUFFIX

#define SUFFIX   ""

Definition at line 63 of file units.cpp.

◆ UNIT_STK_SIZE

#define UNIT_STK_SIZE   20

Definition at line 151 of file units.cpp.

Function Documentation

◆ check_num()

void check_num ( )

Definition at line 358 of file units.cpp.

◆ chkfperror()

void chkfperror ( )

Definition at line 533 of file units.cpp.

◆ convr()

int convr ( unit up)

Definition at line 757 of file units.cpp.

◆ diag()

void diag ( char *  s1,
char *  s2 
)

Definition at line 114 of file io.cpp.

◆ dimensionless()

void dimensionless ( )

Definition at line 539 of file units.cpp.

◆ dynam_unit_mag()

static double dynam_unit_mag ( int  legacy,
char *  u1,
char *  u2 
)
static

Definition at line 1161 of file units.cpp.

◆ equal()

static int equal ( char *  s1,
char *  s2 
)
static

Definition at line 863 of file units.cpp.

◆ fabs()

double fabs ( double  )

◆ fperr()

void fperr ( int  sig)

Definition at line 1156 of file units.cpp.

◆ get()

int get ( )

Definition at line 1110 of file units.cpp.

◆ Getc()

static int Getc ( FILE *  inp)
static

Definition at line 133 of file units.cpp.

◆ getflt()

double getflt ( )

Definition at line 1049 of file units.cpp.

◆ hash_table()

struct table * hash_table ( char *  name)

Definition at line 1132 of file units.cpp.

◆ install_units()

void install_units ( char *  s1,
char *  s2 
)

Definition at line 346 of file units.cpp.

◆ install_units_help()

static void install_units_help ( char *  s1,
char *  s2 
)
static

Definition at line 315 of file units.cpp.

◆ lookup()

int lookup ( char *  name,
unit up,
int  den,
int  c 
)

Definition at line 806 of file units.cpp.

◆ neuronhome()

static char* neuronhome ( )
static

Definition at line 154 of file units.cpp.

◆ nrnunit_dynamic_str()

void nrnunit_dynamic_str ( char *  buf,
const char *  name,
char *  u1,
char *  u2 
)

Definition at line 1172 of file units.cpp.

◆ print_unit_expr()

static void print_unit_expr ( int  i)
static

Definition at line 444 of file units.cpp.

◆ pu()

int pu ( int  u,
int  i,
int  f 
)

Definition at line 737 of file units.cpp.

◆ punit()

void punit ( )

Definition at line 250 of file units.cpp.

◆ switch_units()

static void switch_units ( int  legacy)
static

Definition at line 339 of file units.cpp.

◆ ucopypop()

void ucopypop ( unit up)

Definition at line 257 of file units.cpp.

◆ ucopypush()

void ucopypush ( unit up)

Definition at line 267 of file units.cpp.

◆ Unit_cmp()

void Unit_cmp ( )

Definition at line 446 of file units.cpp.

◆ unit_cmp_exact()

int unit_cmp_exact ( )

Definition at line 416 of file units.cpp.

◆ unit_diff()

int unit_diff ( )

Definition at line 495 of file units.cpp.

◆ unit_div()

void unit_div ( )

Definition at line 384 of file units.cpp.

◆ Unit_exponent()

void Unit_exponent ( int  val)

Definition at line 400 of file units.cpp.

◆ unit_init()

void unit_init ( )

Definition at line 622 of file units.cpp.

◆ unit_less()

void unit_less ( )

Definition at line 556 of file units.cpp.

◆ unit_mag()

double unit_mag ( )

Definition at line 242 of file units.cpp.

◆ unit_mag_mul()

void unit_mag_mul ( double  d)

Definition at line 246 of file units.cpp.

◆ unit_mul()

void unit_mul ( )

Definition at line 368 of file units.cpp.

◆ unit_pop()

void unit_pop ( )

Definition at line 212 of file units.cpp.

◆ Unit_push()

void Unit_push ( char *  str)

Definition at line 277 of file units.cpp.

◆ unit_push_num()

void unit_push_num ( double  d)

Definition at line 296 of file units.cpp.

◆ unit_stk_clean()

void unit_stk_clean ( )

Definition at line 571 of file units.cpp.

◆ unit_str()

char* unit_str ( )

Definition at line 306 of file units.cpp.

◆ Unit_str()

char* Unit_str ( unit up)

Definition at line 181 of file units.cpp.

◆ unit_swap()

void unit_swap ( )

Definition at line 222 of file units.cpp.

◆ unitcheck()

void unitcheck ( char *  s)

Definition at line 301 of file units.cpp.

◆ units()

void units ( unit up)

Definition at line 733 of file units.cpp.

◆ units_alloc()

static void units_alloc ( )
static

Definition at line 577 of file units.cpp.

◆ units_cpp_init()

void units_cpp_init ( )

Definition at line 874 of file units.cpp.

Variable Documentation

◆ dfile

char* dfile = "/usr/lib/units"
static

Definition at line 73 of file units.cpp.

◆ dfilealt

char* dfilealt = "../../share/lib/nrnunits.lib" SUFFIX
static

Definition at line 82 of file units.cpp.

◆ dumpflg

int dumpflg
static

Definition at line 129 of file units.cpp.

◆ fperrc

int fperrc
static

Definition at line 127 of file units.cpp.

◆ inpfile

FILE* inpfile
static

Definition at line 126 of file units.cpp.

◆ names

char* names
static

Definition at line 110 of file units.cpp.

◆ pc

char* pc
static

Definition at line 131 of file units.cpp.

◆ peekc

int peekc
static

Definition at line 128 of file units.cpp.

◆ prefix

struct prefix prefix[]
static
Initial value:
= {1e-18, "atto", 1e-15, "femto", 1e-12, "pico", 1e-9, "nano", 1e-6,
"micro", 1e-3, "milli", 1e-2, "centi", 1e-1, "deci", 1e1, "deka",
1e2, "hecta", 1e2, "hecto", 1e3, "kilo", 1e6, "mega", 1e6,
"meg", 1e9, "giga", 1e12, "tera", 0.0, 0}
#define e
Definition: passive0.cpp:22

◆ table

struct table * table
static

◆ ucp

char* ucp
static

Definition at line 180 of file units.cpp.

◆ unames

char* unames[NDIM]
static

Definition at line 85 of file units.cpp.

◆ unit_stack

struct unit unit_stack[UNIT_STK_SIZE]
static

Definition at line 133 of file units.cpp.

◆ unitonflag

int unitonflag = 1

Definition at line 45 of file units.cpp.

◆ UnitsOn

int UnitsOn = 0
static

Definition at line 46 of file units.cpp.

◆ usp

struct unit * usp {nullptr}
static

Definition at line 152 of file units.cpp.