: $Id: ppsav.inc,v 1.19 2002/12/18 03:41:48 billl Exp $

COMMENT
USAGE: saving 'state variables' from artificial cells

  MOD file:
      add call to 'recval()' at end of INIT and BREAKPOINT sections

      INCLUDE "ppsav.inc"

  HOC files:
    initialize with : 
      PP.record(&PP.var,vec,tvec)
    turn off with :
      PP.record()
ENDCOMMENT

NEURON { 
  RANGE savnum
}

PARAMETER {
  savnum = 0 : values to save in vector
}

ASSIGNED {
  index
  space0
  space1
  space2
  space3
}

VERBATIM
#ifndef NRN_VERSION_GTEQ_8_2_0
extern double* vector_vec();
extern int vector_capacity();
extern void* vector_arg();
extern double* hoc_pgetarg();
extern Object** hoc_objgetarg(int);
extern char* hoc_object_name(Object*);
#endif
double *a1, *a2, *a3;
Object *tvec, *tmpvec;
char str[100];
ENDVERBATIM

PROCEDURE recval () {
VERBATIM	
  { void* vv; int i, size; double* px;
    if (savnum==0) { return 0; }
    vv = *((void**)(&space0));
    if (! vv) { hoc_execerror("ERR: no time vector defined for PP::recval.\n",0); }

    i = (int)index;
    vector_resize(vv, i+1);
    px = vector_vec(vv);
    px[i] = t;

    vv = *((void**)(&space1));
    vector_resize(vv, i+1);
    px = vector_vec(vv);
    px[i] = *a1;

    if (savnum>1) { 
      vv = *((void**)(&space2));
      vector_resize(vv, i+1);
      px = vector_vec(vv);
      px[i] = *a2;
    }

    if (savnum>2) { 
      vv = *((void**)(&space3));
      vector_resize(vv, i+1);
      px = vector_vec(vv);
      px[i] = *a3;
    }

    index += 1.;
  }
ENDVERBATIM
}

: record(&val1,vec1,&val2,vec2)
PROCEDURE record() {
VERBATIM
{
  void** vv;

  if (! ifarg(1)) { savnum=0; return 0;
  } 

  if (ifarg(3)) { /* nice place to save time */
    if (savnum==0) {
      vv = (void**)(&space0);
      *vv = vector_arg(3);
      tvec = *hoc_objgetarg(3);
      sprintf(str,"%s",hoc_object_name(tvec));
    } else {
      hoc_assign_str(hoc_pgargstr(3), str);
    }
  }
  if (savnum==0) {
    a1 = hoc_pgetarg(1);
    vv = (void**)(&space1);
    *vv = vector_arg(2);
    savnum=1;
  } else if (savnum==1) {
    a2 = hoc_pgetarg(1);
    vv = (void**)(&space2);
    *vv = vector_arg(2);
    savnum=2;
  } else if (savnum==2) {
    a3 = hoc_pgetarg(1);
    vv = (void**)(&space3);
    *vv = vector_arg(2);
    savnum=3;
  } else {
    printf("ERR -- no more space; PP.savnum=%g\n", savnum);
  }
}
ENDVERBATIM
}