19 #define USELONGDOUBLE 1 24 #include "shared/nvector_serial.h" 26 #include "shared/sundialsmath.h" 27 #include "shared/sundialstypes.h" 31 #define ZERO RCONST(0.0) 32 #define HALF RCONST(0.5) 33 #define ONE RCONST(1.0) 34 #define ONEPT5 RCONST(1.5) 37 #define mydebug(a) printf(a) 38 #define mydebug2(a,b) printf(a,b) 45 #define ldrealtype long double 47 #define ldrealtype realtype 71 #define idpass id_ = id; 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) 84 #define unlock MUTUNLOCK 85 #define lockadd(arg) lock; retval += arg; unlock; 87 #define locklongdadd(arg) lock; longdretval += arg; unlock; 89 #define locklongdadd(arg) lockadd(arg) 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; 115 v = (N_Vector) malloc(
sizeof *v);
119 ops = (N_Vector_Ops) malloc(
sizeof(
struct _generic_N_Vector_Ops));
120 if (ops ==
NULL) {free(v);
return(
NULL);}
149 if (content ==
NULL) {free(ops);free(v);
return(
NULL);}
152 content->
nt = nthread;
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) {
160 v->content = content;
185 for (i=0; i < nthread; ++
i) {
186 data = N_VNew_Serial(sizes[i]);
210 v = (N_Vector) malloc(
sizeof *v);
214 ops = (N_Vector_Ops) malloc(
sizeof(
struct _generic_N_Vector_Ops));
215 if (ops ==
NULL) {free(v);
return(
NULL);}
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;
244 if (content ==
NULL) {free(ops);free(v);
return(
NULL);}
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) {
257 v->content = content;
294 if (count <= 0)
return(
NULL);
296 vs = (N_Vector *) malloc(count *
sizeof(N_Vector));
299 for (j=0; j<count; j++) {
319 if (count <= 0)
return(
NULL);
321 vs = (N_Vector *) malloc(count *
sizeof(N_Vector));
324 for (j=0; j<count; j++) {
359 for (i=0; i <
nt; i++) {
389 for (i=0; i <
nt; ++
i) {
391 data = N_VClone(wdata);
409 for (i = 0; i <
nt; ++
i) {
411 if (data) { N_VDestroy(data); }
436 return((realtype*)v_data);
548 s = N_VDotProd_Serial(
xarg(i),
yarg(i));
564 max = N_VMaxNorm_Serial(
xarg(i));
582 realtype prodi, *xd, *wd;
588 for (i=0; i < N; i++) {
589 prodi = (*xd++) * (*wd++);
590 sum += prodi * prodi;
617 return(RSqrt(
retval / N));
623 realtype sum =
ZERO, prodi, *xd, *wd, *idd;
630 for (i=0; i < N; i++) {
632 prodi = xd[
i] * wd[
i];
633 sum += prodi * prodi;
654 return(RSqrt(
retval / N));
660 if (NV_LENGTH_S(
xarg(i))) {
661 min = N_VMin_Serial(
xarg(i));
678 realtype sum =
ZERO, prodi, *xd, *wd;
684 for (i=0; i < N; i++) {
685 prodi = (*xd++) * (*wd++);
686 sum += prodi * prodi;
712 sum = N_VL1Norm_Serial(
xarg(i));
751 b = N_VInvTest_Serial(
xarg(i),
zarg(i));
783 min = N_VMinQuotient_Serial(
xarg(i),
yarg(i));
#define locklongdadd(arg)
#define NV_CONTENT_NT_LD(v)
void N_VConst_NrnThreadLD(realtype c, N_Vector z)
double max(double a, double b)
realtype N_VWrmsNormMask_NrnThreadLD(N_Vector x, N_Vector w, N_Vector id)
void nrn_multithread_job(void *(*job)(NrnThread *))
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)
static void * vconstrmask(NrnThread *nt)
static realtype vwrmsnormmask_help(N_Vector x, N_Vector w, N_Vector id)
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.
static void * vinvtest(NrnThread *nt)
static void * vminquotient(NrnThread *nt)
void N_VAddConst_NrnThreadLD(N_Vector x, realtype b, N_Vector z)
static void * vmaxnorm(NrnThread *nt)
static void * v1mask(NrnThread *nt)
static void * vaddconst(NrnThread *nt)
void N_VScale_NrnThreadLD(realtype c, N_Vector x, N_Vector z)
static void * vcompare(NrnThread *nt)
#define NV_OWN_DATA_NT_LD(v)
void N_VSetArrayPointer_NrnThreadLD(realtype *v_data, N_Vector v)
static void * vwl2norm(NrnThread *nt)
struct _N_VectorContent_NrnThreadLD * N_VectorContent_NrnThreadLD
static void pr(N_Vector x)
void N_VDiv_NrnThreadLD(N_Vector x, N_Vector y, N_Vector z)
static realtype N_VWL2Norm_helper(N_Vector x, N_Vector w)
static long double longdretval
static void * vlinearsum(NrnThread *nt)
static void * vwrmsnormmask(NrnThread *nt)
#define NV_LENGTH_NT_LD(v)
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)
static void * vprod(NrnThread *nt)
N_Vector * N_VNewVectorArrayEmpty_NrnThreadLD(int count, long int length, int nthread, long int *sizes)
static void * vinv(NrnThread *nt)
void N_VSpace_NrnThreadLD(N_Vector v, long int *lrw, long int *liw)
realtype N_VMaxNorm_NrnThreadLD(N_Vector x)
static void * vscale(NrnThread *nt)
#define MUTCONSTRUCT(mkmut)
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)
static void * vwrmsnorm(NrnThread *nt)
realtype N_VMinQuotient_NrnThreadLD(N_Vector x, N_Vector y)
N_Vector N_VNew_NrnThreadLD(long int length, int nthread, long int *sizes)
void N_VOneMask_Serial(N_Vector x)
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 void * vl1norm(NrnThread *nt)
realtype N_VDotProd_NrnThreadLD(N_Vector x, N_Vector y)
void N_VInv_NrnThreadLD(N_Vector x, N_Vector z)
N_Vector N_VClone_NrnThreadLD(N_Vector w)
static void * vabs(NrnThread *nt)
realtype N_VL1Norm_NrnThreadLD(N_Vector x)
static booleantype bretval
static void * vdiv(NrnThread *nt)