NEURON
nvector_nrnthread_ld.cpp
Go to the documentation of this file.
1 /*
2  * -----------------------------------------------------------------
3  * $Revision: 855 $
4  * $Date: 2005-02-09 18:15:46 -0500 (Wed, 09 Feb 2005) $
5  * -----------------------------------------------------------------
6  * Programmer(s): Scott D. Cohen, Alan C. Hindmarsh, Radu Serban,
7  * and Aaron Collier @ LLNL
8  * -----------------------------------------------------------------
9  * Copyright (c) 2002, The Regents of the University of California.
10  * Produced at the Lawrence Livermore National Laboratory.
11  * All rights reserved.
12  * For details, see sundials/shared/LICENSE.
13  * -----------------------------------------------------------------
14  * This is the implementation file for a nrnthread implementation
15  * of the NVECTOR package.
16  * -----------------------------------------------------------------
17  */
18 
19 #define USELONGDOUBLE 1
20 
21 #include <stdio.h>
22 #include <stdlib.h>
23 
24 #include "shared/nvector_serial.h"
25 #include "nvector_nrnthread_ld.h"
26 #include "shared/sundialsmath.h"
27 #include "shared/sundialstypes.h"
28 #include "section.h"
29 #include "nrnmutdec.h"
30 
31 #define ZERO RCONST(0.0)
32 #define HALF RCONST(0.5)
33 #define ONE RCONST(1.0)
34 #define ONEPT5 RCONST(1.5)
35 
36 #if 0
37 #define mydebug(a) printf(a)
38 #define mydebug2(a,b) printf(a,b)
39 #else
40 #define mydebug(a) /**/
41 #define mydebug2(a,b) /**/
42 #endif
43 
44 #if USELONGDOUBLE
45 #define ldrealtype long double
46 #else
47 #define ldrealtype realtype
48 #endif
49 
50 #if USE_PTHREAD
51 static MUTDEC
52 #endif
53 /* argument passing between NrnThreadLD and Serial */
54 static N_Vector x_;
55 static N_Vector y_;
56 static N_Vector z_;
57 static N_Vector w_;
58 static N_Vector id_;
59 static realtype a_;
60 static realtype b_;
61 static realtype c_;
62 static realtype retval;
63 #if USELONGDOUBLE
64 static long double longdretval;
65 #endif
66 static booleantype bretval;
67 #define xpass x_ = x;
68 #define ypass y_ = y;
69 #define zpass z_ = z;
70 #define wpass w_ = w;
71 #define idpass id_ = id;
72 #define apass a_ = a;
73 #define bpass b_ = b;
74 #define cpass c_ = c;
75 #define xarg(i) NV_SUBVEC_NT_LD(x_, i)
76 #define yarg(i) NV_SUBVEC_NT_LD(y_, i)
77 #define zarg(i) NV_SUBVEC_NT_LD(z_, i)
78 #define warg(i) NV_SUBVEC_NT_LD(w_, i)
79 #define idarg(i) NV_SUBVEC_NT_LD(id_, i)
80 #define aarg a_
81 #define barg b_
82 #define carg c_
83 #define lock MUTLOCK
84 #define unlock MUTUNLOCK
85 #define lockadd(arg) lock; retval += arg; unlock;
86 #if USELONGDOUBLE
87 #define locklongdadd(arg) lock; longdretval += arg; unlock;
88 #else
89 #define locklongdadd(arg) lockadd(arg)
90 #endif
91 #define lockmax(arg) lock; if (retval < arg) { retval = arg; }; unlock;
92 #define lockmin(arg) lock; if (retval > arg) { retval = arg; }; unlock;
93 #define lockfalse lock; bretval = FALSE; unlock;
94 
95 /*
96  * -----------------------------------------------------------------
97  * exported functions
98  * -----------------------------------------------------------------
99  */
100 
101 /* ----------------------------------------------------------------------------
102  * Function to create a new empty nrnthread vector
103  */
104 
105 N_Vector N_VNewEmpty_NrnThreadLD(long int length, int nthread, long int* sizes)
106 {
107  int i;
108  N_Vector v;
109  N_Vector_Ops ops;
111 
112  if (!MUTCONSTRUCTED) { MUTCONSTRUCT(1) }
113 
114  /* Create vector */
115  v = (N_Vector) malloc(sizeof *v);
116  if (v == NULL) return(NULL);
117 
118  /* Create vector operation structure */
119  ops = (N_Vector_Ops) malloc(sizeof(struct _generic_N_Vector_Ops));
120  if (ops == NULL) {free(v);return(NULL);}
121 
122  ops->nvclone = N_VClone_NrnThreadLD;
123  ops->nvdestroy = N_VDestroy_NrnThreadLD;
124  ops->nvspace = N_VSpace_NrnThreadLD;
125  ops->nvgetarraypointer = N_VGetArrayPointer_NrnThreadLD;
126  ops->nvsetarraypointer = N_VSetArrayPointer_NrnThreadLD;
127  ops->nvlinearsum = N_VLinearSum_NrnThreadLD;
128  ops->nvconst = N_VConst_NrnThreadLD;
129  ops->nvprod = N_VProd_NrnThreadLD;
130  ops->nvdiv = N_VDiv_NrnThreadLD;
131  ops->nvscale = N_VScale_NrnThreadLD;
132  ops->nvabs = N_VAbs_NrnThreadLD;
133  ops->nvinv = N_VInv_NrnThreadLD;
134  ops->nvaddconst = N_VAddConst_NrnThreadLD;
135  ops->nvdotprod = N_VDotProd_NrnThreadLD;
136  ops->nvmaxnorm = N_VMaxNorm_NrnThreadLD;
137  ops->nvwrmsnormmask = N_VWrmsNormMask_NrnThreadLD;
138  ops->nvwrmsnorm = N_VWrmsNorm_NrnThreadLD;
139  ops->nvmin = N_VMin_NrnThreadLD;
140  ops->nvwl2norm = N_VWL2Norm_NrnThreadLD;
141  ops->nvl1norm = N_VL1Norm_NrnThreadLD;
142  ops->nvcompare = N_VCompare_NrnThreadLD;
143  ops->nvinvtest = N_VInvTest_NrnThreadLD;
144  ops->nvconstrmask = N_VConstrMask_NrnThreadLD;
145  ops->nvminquotient = N_VMinQuotient_NrnThreadLD;
146 
147  /* Create content */
148  content = (N_VectorContent_NrnThreadLD) malloc(sizeof(struct _N_VectorContent_NrnThreadLD));
149  if (content == NULL) {free(ops);free(v);return(NULL);}
150 
151  content->length = length;
152  content->nt = nthread;
153  content->own_data = FALSE;
154  content->data = (N_Vector*) malloc(sizeof(N_Vector)*nthread);
155  if (content->data == NULL) { free(ops); free(v); free(content); return(NULL);}
156  for (i=0; i < nthread; ++i) {
157  content->data[i] = NULL;
158  }
159  /* Attach content and ops */
160  v->content = content;
161  v->ops = ops;
162 
163  return(v);
164 }
165 
166 /* ----------------------------------------------------------------------------
167  * Function to create a new nrnthread vector
168  */
169 
170 N_Vector N_VNew_NrnThreadLD(long int length, int nthread, long int* sizes)
171 {
172  int i;
173  N_Vector v;
174  N_Vector data;
176 
177  v = N_VNewEmpty_NrnThreadLD(length, nthread, sizes);
178  if (v == NULL) return(NULL);
179 
180  /* Create data */
181  if (length > 0) {
182 
183  /* Allocate memory */
184  NV_OWN_DATA_NT_LD(v) = TRUE;
185  for (i=0; i < nthread; ++i) {
186  data = N_VNew_Serial(sizes[i]);
187  if(data == NULL) {N_VDestroy_NrnThreadLD(v);return(NULL);}
188  NV_SUBVEC_NT_LD(v, i) = data;
189  }
190  }
191 
192  return(v);
193 }
194 
195 /* ----------------------------------------------------------------------------
196  * Function to clone from a template a new vector with empty (NULL) data array
197  */
198 
199 N_Vector N_VCloneEmpty_NrnThreadLD(N_Vector w)
200 {
201  int i;
202  N_Vector v;
203  N_Vector_Ops ops;
206 
207  if (w == NULL) return(NULL);
208 
209  /* Create vector */
210  v = (N_Vector) malloc(sizeof *v);
211  if (v == NULL) return(NULL);
212 
213  /* Create vector operation structure */
214  ops = (N_Vector_Ops) malloc(sizeof(struct _generic_N_Vector_Ops));
215  if (ops == NULL) {free(v);return(NULL);}
216 
217  ops->nvclone = w->ops->nvclone;
218  ops->nvdestroy = w->ops->nvdestroy;
219  ops->nvspace = w->ops->nvspace;
220  ops->nvgetarraypointer = w->ops->nvgetarraypointer;
221  ops->nvsetarraypointer = w->ops->nvsetarraypointer;
222  ops->nvlinearsum = w->ops->nvlinearsum;
223  ops->nvconst = w->ops->nvconst;
224  ops->nvprod = w->ops->nvprod;
225  ops->nvdiv = w->ops->nvdiv;
226  ops->nvscale = w->ops->nvscale;
227  ops->nvabs = w->ops->nvabs;
228  ops->nvinv = w->ops->nvinv;
229  ops->nvaddconst = w->ops->nvaddconst;
230  ops->nvdotprod = w->ops->nvdotprod;
231  ops->nvmaxnorm = w->ops->nvmaxnorm;
232  ops->nvwrmsnormmask = w->ops->nvwrmsnormmask;
233  ops->nvwrmsnorm = w->ops->nvwrmsnorm;
234  ops->nvmin = w->ops->nvmin;
235  ops->nvwl2norm = w->ops->nvwl2norm;
236  ops->nvl1norm = w->ops->nvl1norm;
237  ops->nvcompare = w->ops->nvcompare;
238  ops->nvinvtest = w->ops->nvinvtest;
239  ops->nvconstrmask = w->ops->nvconstrmask;
240  ops->nvminquotient = w->ops->nvminquotient;
241 
242  /* Create content */
243  content = (N_VectorContent_NrnThreadLD) malloc(sizeof(struct _N_VectorContent_NrnThreadLD));
244  if (content == NULL) {free(ops);free(v);return(NULL);}
245 
246  wcontent = NV_CONTENT_NT_LD(w);
247  content->length = NV_LENGTH_NT_LD(w);
248  content->own_data = FALSE;
249  content->nt = wcontent->nt;
250  content->data = (N_Vector*) malloc(sizeof(N_Vector) * content->nt);
251  if (content->data == NULL) { free(ops); free(v); free(content); return(NULL);}
252  for (i=0; i < content->nt; ++i) {
253  content->data[i] = NULL;
254  }
255 
256  /* Attach content and ops */
257  v->content = content;
258  v->ops = ops;
259 
260  return(v);
261 }
262 
263 /* ----------------------------------------------------------------------------
264  * Function to create a nrnthread N_Vector with user data component
265  */
266 
267 N_Vector N_VMake_NrnThreadLD(long int length, realtype *v_data)
268 {
269  N_Vector v = NULL;
270 
271  assert(0);
272 #if 0
273  v = N_VNewEmpty_NrnThreadLD(length);
274  if (v == NULL) return(NULL);
275 
276  if (length > 0) {
277  /* Attach data */
279  NV_DATA_NT_LD(v) = v_data;
280  }
281 #endif
282  return(v);
283 }
284 
285 /* ----------------------------------------------------------------------------
286  * Function to create an array of new nrnthread vectors.
287  */
288 
289 N_Vector *N_VNewVectorArray_NrnThreadLD(int count, long int length, int nthread, long int* sizes)
290 {
291  N_Vector *vs;
292  int j;
293 
294  if (count <= 0) return(NULL);
295 
296  vs = (N_Vector *) malloc(count * sizeof(N_Vector));
297  if(vs == NULL) return(NULL);
298 
299  for (j=0; j<count; j++) {
300  vs[j] = N_VNew_NrnThreadLD(length, nthread, sizes);
301  if (vs[j] == NULL) {
303  return(NULL);
304  }
305  }
306 
307  return(vs);
308 }
309 
310 /* ----------------------------------------------------------------------------
311  * Function to create an array of new nrnthread vectors with NULL data array.
312  */
313 
314 N_Vector *N_VNewVectorArrayEmpty_NrnThreadLD(int count, long int length, int nthread, long int* sizes)
315 {
316  N_Vector *vs;
317  int j;
318 
319  if (count <= 0) return(NULL);
320 
321  vs = (N_Vector *) malloc(count * sizeof(N_Vector));
322  if(vs == NULL) return(NULL);
323 
324  for (j=0; j<count; j++) {
325  vs[j] = N_VNewEmpty_NrnThreadLD(length, nthread, sizes);
326  if (vs[j] == NULL) {
328  return(NULL);
329  }
330  }
331 
332  return(vs);
333 }
334 
335 /* ----------------------------------------------------------------------------
336  * Function to free an array created with N_VNewVectorArray_NrnThreadLD
337  */
338 
339 void N_VDestroyVectorArray_NrnThreadLD(N_Vector *vs, int count)
340 {
341  int j;
342 
343  for (j = 0; j < count; j++) N_VDestroy_NrnThreadLD(vs[j]);
344 
345  free(vs);
346 }
347 
348 /* ----------------------------------------------------------------------------
349  * Function to print the a nrnthread vector
350  */
351 
352 void N_VPrint_NrnThreadLD(N_Vector x)
353 {
354  int i;
355  int nt;
356 
357  nt = NV_NT_NT_LD(x);
358 
359  for (i=0; i < nt; i++) {
360  N_VPrint_Serial(NV_SUBVEC_NT_LD(x, i));
361  }
362  printf("\n");
363 }
364 
365 static void pr(N_Vector x) { N_VPrint_NrnThreadLD(x); }
366 /*
367  * -----------------------------------------------------------------
368  * implementation of vector operations
369  * -----------------------------------------------------------------
370  */
371 
372 N_Vector N_VClone_NrnThreadLD(N_Vector w)
373 {
374  N_Vector v;
375  N_Vector wdata;
376  N_Vector data;
377  long int length;
378  int i, nt;
379 
381  if (v == NULL) return(NULL);
382 
383  length = NV_LENGTH_NT_LD(w);
384  nt = NV_NT_NT_LD(w);
385 
386  /* Create data */
387  if (length > 0) {
388  NV_OWN_DATA_NT_LD(v) = TRUE;
389  for (i=0; i < nt; ++i) {
390  wdata = NV_SUBVEC_NT_LD(w, i);
391  data = N_VClone(wdata);
392  if(data == NULL) {N_VDestroy_NrnThreadLD(v);return(NULL);}
393  NV_SUBVEC_NT_LD(v, i) = data;
394  }
395  /* Attach data */
396 
397  }
398 
399  return(v);
400 }
401 
402 void N_VDestroy_NrnThreadLD(N_Vector v)
403 {
404  int i, nt;
405  N_Vector data;
406  nt = NV_NT_NT_LD(v);
407  if (NV_OWN_DATA_NT_LD(v) == TRUE) {
408  if (NV_CONTENT_NT_LD(v)->data) {
409  for (i = 0; i < nt; ++i) {
410  data = NV_SUBVEC_NT_LD(v, i);
411  if (data) { N_VDestroy(data); }
412  }
413  free(NV_CONTENT_NT_LD(v)->data);
414  }
415  }
416  free(v->content);
417  free(v->ops);
418  free(v);
419 }
420 
421 void N_VSpace_NrnThreadLD(N_Vector v, long int *lrw, long int *liw)
422 {
423  *lrw = NV_LENGTH_NT_LD(v);
424  *liw = 1;
425 }
426 
427 /* NOTICE: the pointer returned is actually the NVector* data where
428 data is nthread NVector. so when you get the realtype* cast it back to
429 (NVector*)
430 */
432 {
433  N_Vector *v_data;
434  v_data = NV_DATA_NT_LD(v);
435 
436  return((realtype*)v_data);
437 }
438 
439 void N_VSetArrayPointer_NrnThreadLD(realtype *v_data, N_Vector v)
440 {
441  assert(0);
442 #if 0
443  if (NV_LENGTH_NT_LD(v) > 0) NV_DATA_NT_LD(v) = v_data;
444 #endif
445 }
446 
447 static void* vlinearsum(NrnThread* nt) {
448  int i = nt->id;
449  N_VLinearSum_Serial(aarg, xarg(i), barg, yarg(i), zarg(i));
450  return nullptr;
451 }
452 void N_VLinearSum_NrnThreadLD(realtype a, N_Vector x, realtype b, N_Vector y, N_Vector z)
453 {
456 mydebug("vlinearsum\n");
457 /*pr(z);*/
458 }
459 
460 static void* vconst(NrnThread* nt) {
461  int i = nt->id;
462  N_VConst_Serial(carg, zarg(i));
463  return nullptr;
464 }
465 void N_VConst_NrnThreadLD(realtype c, N_Vector z)
466 {
467  cpass zpass
469 mydebug("vconst\n");
470 }
471 
472 static void* vprod(NrnThread* nt) {
473  int i = nt->id;
474  N_VProd_Serial(xarg(i), yarg(i), zarg(i));
475  return nullptr;
476 }
477 void N_VProd_NrnThreadLD(N_Vector x, N_Vector y, N_Vector z)
478 {
481 mydebug("vprod\n");
482 }
483 
484 static void* vdiv(NrnThread* nt) {
485  int i = nt->id;
486  N_VDiv_Serial(xarg(i), yarg(i), zarg(i));
487  return nullptr;
488 }
489 void N_VDiv_NrnThreadLD(N_Vector x, N_Vector y, N_Vector z)
490 {
493 mydebug("vdiv\n");
494 }
495 
496 static void* vscale(NrnThread* nt) {
497  int i = nt->id;
498  N_VScale_Serial(carg, xarg(i), zarg(i));
499  return nullptr;
500 }
501 void N_VScale_NrnThreadLD(realtype c, N_Vector x, N_Vector z)
502 {
505 mydebug("vscale\n");
506 /*pr(z);*/
507 }
508 
509 static void* vabs(NrnThread* nt) {
510  int i = nt->id;
511  N_VAbs_Serial(xarg(i), zarg(i));
512  return nullptr;
513 }
514 void N_VAbs_NrnThreadLD(N_Vector x, N_Vector z)
515 {
516  xpass zpass
518 mydebug("vabs\n");
519 }
520 
521 static void* vinv(NrnThread* nt) {
522  int i = nt->id;
523  N_VInv_Serial(xarg(i), zarg(i));
524  return nullptr;
525 }
526 void N_VInv_NrnThreadLD(N_Vector x, N_Vector z)
527 {
528  xpass zpass
530 mydebug("vinv\n");
531 }
532 
533 static void* vaddconst(NrnThread* nt) {
534  int i = nt->id;
535  N_VAddConst_Serial(xarg(i), barg, zarg(i));
536  return nullptr;
537 }
538 void N_VAddConst_NrnThreadLD(N_Vector x, realtype b, N_Vector z)
539 {
542 mydebug("vaddconst\n");
543 }
544 
545 static void* vdotprod(NrnThread* nt) {
546  realtype s;
547  int i = nt->id;
548  s = N_VDotProd_Serial(xarg(i), yarg(i));
549  lockadd(s);
550  return nullptr;
551 }
552 realtype N_VDotProd_NrnThreadLD(N_Vector x, N_Vector y)
553 {
554  retval = ZERO;
555  xpass ypass
557 mydebug2("vdotprod %.20g\n", retval);
558  return(retval);
559 }
560 
561 static void* vmaxnorm(NrnThread* nt) {
562  realtype max;
563  int i = nt->id;
564  max = N_VMaxNorm_Serial(xarg(i));
565  lockmax(max);
566  return nullptr;
567 }
568 realtype N_VMaxNorm_NrnThreadLD(N_Vector x)
569 {
570  retval = ZERO;
571  xpass
573 mydebug2("vmaxnorm %.20g\n", retval);
574  return(retval);
575 }
576 
577 
578 static ldrealtype vwrmsnorm_help(N_Vector x, N_Vector w)
579 {
580  long int i, N;
581  ldrealtype sum = ZERO;
582  realtype prodi, *xd, *wd;
583 
584  N = NV_LENGTH_S(x);
585  xd = NV_DATA_S(x);
586  wd = NV_DATA_S(w);
587 
588  for (i=0; i < N; i++) {
589  prodi = (*xd++) * (*wd++);
590  sum += prodi * prodi;
591  }
592 
593  return(sum);
594 }
595 static void* vwrmsnorm(NrnThread* nt) {
596  ldrealtype s;
597  int i = nt->id;
598  s = vwrmsnorm_help(xarg(i), warg(i));
599  locklongdadd(s);
600  return nullptr;
601 }
602 realtype N_VWrmsNorm_NrnThreadLD(N_Vector x, N_Vector w)
603 {
604  long int N;
605  N = NV_LENGTH_NT_LD(x);
606 #if USELONGDOUBLE
607  longdretval = ZERO;
608 #else
609  retval = ZERO;
610 #endif
611  xpass wpass
613 #if USELONGDOUBLE
615 #endif
616 mydebug2("vwrmsnorm %.20g\n", RSqrt(retval / N));
617  return(RSqrt(retval / N));
618 }
619 
620 static realtype vwrmsnormmask_help(N_Vector x, N_Vector w, N_Vector id)
621 {
622  long int i, N;
623  realtype sum = ZERO, prodi, *xd, *wd, *idd;
624 
625  N = NV_LENGTH_S(x);
626  xd = NV_DATA_S(x);
627  wd = NV_DATA_S(w);
628  idd = NV_DATA_S(id);
629 
630  for (i=0; i < N; i++) {
631  if (idd[i] > ZERO) {
632  prodi = xd[i] * wd[i];
633  sum += prodi * prodi;
634  }
635  }
636 
637  return(sum);
638 }
639 static void* vwrmsnormmask(NrnThread* nt) {
640  realtype s;
641  int i = nt->id;
642  s = vwrmsnormmask_help(xarg(i), warg(i), idarg(i));
643  lockadd(s);
644  return nullptr;
645 }
646 realtype N_VWrmsNormMask_NrnThreadLD(N_Vector x, N_Vector w, N_Vector id)
647 {
648  long int N;
649  N = NV_LENGTH_NT_LD(x);
650  retval = ZERO;
653 mydebug2("vwrmsnormmask %.20g\n", RSqrt(retval / N));
654  return(RSqrt(retval / N));
655 }
656 
657 static void* vmin(NrnThread* nt) {
658  realtype min;
659  int i = nt->id;
660  if (NV_LENGTH_S(xarg(i))) {
661  min = N_VMin_Serial(xarg(i));
662  lockmin(min);
663 }
664  return nullptr;
665 }
666 realtype N_VMin_NrnThreadLD(N_Vector x)
667 {
668  retval = BIG_REAL;
669  xpass
671 mydebug2("vmin %.20g\n", retval);
672  return(retval);
673 }
674 
675 static realtype N_VWL2Norm_helper(N_Vector x, N_Vector w)
676 {
677  long int i, N;
678  realtype sum = ZERO, prodi, *xd, *wd;
679 
680  N = NV_LENGTH_S(x);
681  xd = NV_DATA_S(x);
682  wd = NV_DATA_S(w);
683 
684  for (i=0; i < N; i++) {
685  prodi = (*xd++) * (*wd++);
686  sum += prodi * prodi;
687  }
688 
689  return sum;
690 }
691 static void* vwl2norm(NrnThread* nt) {
692  realtype sum;
693  int i = nt->id;
694  sum = N_VWL2Norm_helper(xarg(i), warg(i));
695  lockadd(sum);
696  return nullptr;
697 }
698 realtype N_VWL2Norm_NrnThreadLD(N_Vector x, N_Vector w)
699 {
700  long int N;
701  retval = ZERO;
702  xpass wpass
704  N = NV_LENGTH_NT_LD(x);
705 mydebug2("vwl2norm %.20g\n", RSqrt(retval));
706  return(RSqrt(retval));
707 }
708 
709 static void* vl1norm(NrnThread* nt) {
710  realtype sum;
711  int i = nt->id;
712  sum = N_VL1Norm_Serial(xarg(i));
713  lockadd(sum);
714  return nullptr;
715 }
716 realtype N_VL1Norm_NrnThreadLD(N_Vector x)
717 {
718  retval = ZERO;
719  xpass
721 mydebug2("vl1norm %.20g\n", retval);
722  return(retval);
723 }
724 
725 static void* v1mask(NrnThread* nt) {
726  int i = nt->id;
728  return nullptr;
729 }
730 void N_VOneMask_NrnThreadLD(N_Vector x)
731 {
732  xpass
734 }
735 
736 static void* vcompare(NrnThread* nt) {
737  int i = nt->id;
738  N_VCompare_Serial(carg, xarg(i), zarg(i));
739  return nullptr;
740 }
741 void N_VCompare_NrnThreadLD(realtype c, N_Vector x, N_Vector z)
742 {
745 mydebug("vcompare\n");
746 }
747 
748 static void* vinvtest(NrnThread* nt) {
749  booleantype b;
750  int i = nt->id;
751  b = N_VInvTest_Serial(xarg(i), zarg(i));
752  if (!b) { lockfalse; }
753  return nullptr;
754 }
755 booleantype N_VInvTest_NrnThreadLD(N_Vector x, N_Vector z)
756 {
757  bretval = TRUE;
758  xpass zpass
760 mydebug2("vinvtest %d\n", bretval);
761  return(bretval);
762 }
763 
764 static void* vconstrmask(NrnThread* nt) {
765  booleantype b;
766  int i = nt->id;
767  b = N_VConstrMask_Serial(yarg(i), xarg(i), zarg(i));
768  if (!b) { lockfalse; }
769  return nullptr;
770 }
771 booleantype N_VConstrMask_NrnThreadLD(N_Vector y, N_Vector x, N_Vector z)
772 {
773  bretval = TRUE;
776 mydebug2("vconstrmask %d\n", bretval);
777  return(bretval);
778 }
779 
780 static void* vminquotient(NrnThread* nt) {
781  realtype min;
782  int i = nt->id;
783  min = N_VMinQuotient_Serial(xarg(i), yarg(i));
784  lockmin(min);
785  return nullptr;
786 }
787 realtype N_VMinQuotient_NrnThreadLD(N_Vector x, N_Vector y) /* num, denom */
788 {
789  retval = BIG_REAL;
790  xpass ypass
792 mydebug2("vminquotient %.20g\n", retval);
793  return(retval);
794 }
#define data
Definition: rbtqueue.cpp:49
static N_Vector y_
#define locklongdadd(arg)
#define NV_CONTENT_NT_LD(v)
void N_VConst_NrnThreadLD(realtype c, N_Vector z)
double max(double a, double b)
Definition: geometry3d.cpp:22
#define assert(ex)
Definition: hocassrt.h:26
realtype N_VWrmsNormMask_NrnThreadLD(N_Vector x, N_Vector w, N_Vector id)
void nrn_multithread_job(void *(*job)(NrnThread *))
Definition: multicore.cpp:1081
void N_VOneMask_NrnThreadLD(N_Vector x)
realtype * N_VGetArrayPointer_NrnThreadLD(N_Vector v)
N_Vector N_VNewEmpty_NrnThreadLD(long int length, int nthread, long int *sizes)
#define xarg(i)
#define lockadd(arg)
static void * vconstrmask(NrnThread *nt)
static realtype vwrmsnormmask_help(N_Vector x, N_Vector w, N_Vector id)
#define min(a, b)
Definition: matrix.h:157
realtype N_VMin_NrnThreadLD(N_Vector x)
static void * vmin(NrnThread *nt)
N_Vector * N_VNewVectorArray_NrnThreadLD(int count, long int length, int nthread, long int *sizes)
realtype N_VWL2Norm_NrnThreadLD(N_Vector x, N_Vector w)
static void * vdotprod(NrnThread *nt)
booleantype N_VConstrMask_NrnThreadLD(N_Vector y, N_Vector x, N_Vector z)
booleantype N_VInvTest_NrnThreadLD(N_Vector x, N_Vector z)
Represent main neuron object computed by single thread.
Definition: multicore.h:58
static void * vinvtest(NrnThread *nt)
static void * vminquotient(NrnThread *nt)
#define TRUE
Definition: err.c:57
void N_VAddConst_NrnThreadLD(N_Vector x, realtype b, N_Vector z)
static realtype retval
static void * vmaxnorm(NrnThread *nt)
static void * v1mask(NrnThread *nt)
#define v
Definition: md1redef.h:4
static void * vaddconst(NrnThread *nt)
void N_VScale_NrnThreadLD(realtype c, N_Vector x, N_Vector z)
static void * vcompare(NrnThread *nt)
#define lockmin(arg)
#define NV_OWN_DATA_NT_LD(v)
void N_VSetArrayPointer_NrnThreadLD(realtype *v_data, N_Vector v)
#define bpass
static void * vwl2norm(NrnThread *nt)
int id
Definition: multicore.h:66
static realtype b_
struct _N_VectorContent_NrnThreadLD * N_VectorContent_NrnThreadLD
#define NV_NT_NT_LD(v)
#define aarg
static void pr(N_Vector x)
_CONST char * s
Definition: system.cpp:74
#define idpass
#define MUTDEC
Definition: nrnmutdec.h:28
#define printf
Definition: mwprefix.h:26
static N_Vector x_
#define lockmax(arg)
#define mydebug2(a, b)
void N_VDiv_NrnThreadLD(N_Vector x, N_Vector y, N_Vector z)
#define zarg(i)
static realtype N_VWL2Norm_helper(N_Vector x, N_Vector w)
#define ZERO
static long double longdretval
#define barg
static void * vlinearsum(NrnThread *nt)
static void * vwrmsnormmask(NrnThread *nt)
#define xpass
#define NV_LENGTH_NT_LD(v)
size_t j
N_Vector N_VMake_NrnThreadLD(long int length, realtype *v_data)
#define NV_SUBVEC_NT_LD(v, i)
void N_VAbs_NrnThreadLD(N_Vector x, N_Vector z)
void N_VDestroyVectorArray_NrnThreadLD(N_Vector *vs, int count)
void N_VDestroy_NrnThreadLD(N_Vector v)
#define idarg(i)
static void * vprod(NrnThread *nt)
#define cpass
N_Vector * N_VNewVectorArrayEmpty_NrnThreadLD(int count, long int length, int nthread, long int *sizes)
static N_Vector w_
static void * vinv(NrnThread *nt)
void N_VSpace_NrnThreadLD(N_Vector v, long int *lrw, long int *liw)
#define mydebug(a)
#define ypass
realtype N_VMaxNorm_NrnThreadLD(N_Vector x)
static void * vscale(NrnThread *nt)
static realtype a_
#define warg(i)
#define MUTCONSTRUCT(mkmut)
Definition: nrnmutdec.h:30
realtype N_VWrmsNorm_NrnThreadLD(N_Vector x, N_Vector w)
N_Vector N_VCloneEmpty_NrnThreadLD(N_Vector w)
void N_VLinearSum_NrnThreadLD(realtype a, N_Vector x, realtype b, N_Vector y, N_Vector z)
static void * vconst(NrnThread *nt)
static ldrealtype vwrmsnorm_help(N_Vector x, N_Vector w)
#define lockfalse
static void * vwrmsnorm(NrnThread *nt)
#define MUTCONSTRUCTED
Definition: nrnmutdec.h:29
realtype N_VMinQuotient_NrnThreadLD(N_Vector x, N_Vector y)
N_Vector N_VNew_NrnThreadLD(long int length, int nthread, long int *sizes)
#define yarg(i)
void N_VOneMask_Serial(N_Vector x)
#define FALSE
Definition: err.c:56
#define zpass
#define i
Definition: md1redef.h:12
#define c
#define carg
void N_VPrint_NrnThreadLD(N_Vector x)
void N_VProd_NrnThreadLD(N_Vector x, N_Vector y, N_Vector z)
void N_VCompare_NrnThreadLD(realtype c, N_Vector x, N_Vector z)
static realtype c_
#define apass
#define NV_DATA_NT_LD(v)
static void * vl1norm(NrnThread *nt)
realtype N_VDotProd_NrnThreadLD(N_Vector x, N_Vector y)
static N_Vector z_
void N_VInv_NrnThreadLD(N_Vector x, N_Vector z)
N_Vector N_VClone_NrnThreadLD(N_Vector w)
static void * vabs(NrnThread *nt)
static N_Vector id_
return NULL
Definition: cabcode.cpp:461
realtype N_VL1Norm_NrnThreadLD(N_Vector x)
static booleantype bretval
#define wpass
static void * vdiv(NrnThread *nt)
#define ldrealtype