22 #include "shared/nvector_serial.h"
24 #include "shared/sundialsmath.h"
25 #include "shared/sundialstypes.h"
29 #define ZERO RCONST(0.0)
30 #define HALF RCONST(0.5)
31 #define ONE RCONST(1.0)
32 #define ONEPT5 RCONST(1.5)
35 #define mydebug(a) printf(a)
36 #define mydebug2(a, b) printf(a, b)
39 #define mydebug2(a, b)
42 #if NRN_ENABLE_THREADS
62 #define idpass id_ = id;
66 #define xarg(i) NV_SUBVEC_NT_LD(x_, i)
67 #define yarg(i) NV_SUBVEC_NT_LD(y_, i)
68 #define zarg(i) NV_SUBVEC_NT_LD(z_, i)
69 #define warg(i) NV_SUBVEC_NT_LD(w_, i)
70 #define idarg(i) NV_SUBVEC_NT_LD(id_, i)
75 #define unlock MUTUNLOCK
76 #define lockadd(arg) \
80 #define lockmax(arg) \
86 #define lockmin(arg) \
118 v = (N_Vector) malloc(
sizeof *
v);
123 ops = (N_Vector_Ops) malloc(
sizeof(
struct _generic_N_Vector_Ops));
156 if (content ==
NULL) {
163 content->
nt = nthread;
165 content->
data = (N_Vector*) malloc(
sizeof(N_Vector) * nthread);
172 for (
i = 0;
i < nthread; ++
i) {
176 v->content = content;
200 for (
i = 0;
i < nthread; ++
i) {
201 data = N_VNew_Serial(sizes[
i]);
228 v = (N_Vector) malloc(
sizeof *
v);
233 ops = (N_Vector_Ops) malloc(
sizeof(
struct _generic_N_Vector_Ops));
239 ops->nvclone = w->ops->nvclone;
240 ops->nvdestroy = w->ops->nvdestroy;
241 ops->nvspace = w->ops->nvspace;
242 ops->nvgetarraypointer = w->ops->nvgetarraypointer;
243 ops->nvsetarraypointer = w->ops->nvsetarraypointer;
244 ops->nvlinearsum = w->ops->nvlinearsum;
245 ops->nvconst = w->ops->nvconst;
246 ops->nvprod = w->ops->nvprod;
247 ops->nvdiv = w->ops->nvdiv;
248 ops->nvscale = w->ops->nvscale;
249 ops->nvabs = w->ops->nvabs;
250 ops->nvinv = w->ops->nvinv;
251 ops->nvaddconst = w->ops->nvaddconst;
252 ops->nvdotprod = w->ops->nvdotprod;
253 ops->nvmaxnorm = w->ops->nvmaxnorm;
254 ops->nvwrmsnormmask = w->ops->nvwrmsnormmask;
255 ops->nvwrmsnorm = w->ops->nvwrmsnorm;
256 ops->nvmin = w->ops->nvmin;
257 ops->nvwl2norm = w->ops->nvwl2norm;
258 ops->nvl1norm = w->ops->nvl1norm;
259 ops->nvcompare = w->ops->nvcompare;
260 ops->nvinvtest = w->ops->nvinvtest;
261 ops->nvconstrmask = w->ops->nvconstrmask;
262 ops->nvminquotient = w->ops->nvminquotient;
266 if (content ==
NULL) {
275 content->
nt = wcontent->
nt;
276 content->
data = (N_Vector*) malloc(
sizeof(N_Vector) * content->
nt);
283 for (
i = 0;
i < content->
nt; ++
i) {
288 v->content = content;
326 vs = (N_Vector*) malloc(count *
sizeof(N_Vector));
330 for (
j = 0;
j < count;
j++) {
355 vs = (N_Vector*) malloc(count *
sizeof(N_Vector));
359 for (
j = 0;
j < count;
j++) {
377 for (
j = 0;
j < count;
j++)
393 for (
i = 0;
i < nt;
i++) {
399 static void pr(N_Vector x) {
425 for (
i = 0;
i < nt; ++
i) {
427 data = N_VClone(wdata);
446 for (
i = 0;
i < nt; ++
i) {
473 return ((realtype*) v_data);
582 max = N_VMaxNorm_Serial(
xarg(
i));
603 for (
i = 0;
i < N;
i++) {
604 auto const prodi = (*xd++) * (*wd++);
605 auto const y = prodi * prodi -
c;
606 auto const t = sum + y;
622 auto const tmp_t =
retval + tmp_y;
634 return (RSqrt(
retval / N));
639 realtype sum =
ZERO, prodi, *xd, *wd, *idd;
646 for (
i = 0;
i < N;
i++) {
648 prodi = xd[
i] * wd[
i];
649 sum += prodi * prodi;
668 return (RSqrt(
retval / N));
674 if (NV_LENGTH_S(
xarg(
i))) {
675 min = N_VMin_Serial(
xarg(
i));
689 realtype sum =
ZERO, prodi, *xd, *wd;
695 for (
i = 0;
i < N;
i++) {
696 prodi = (*xd++) * (*wd++);
697 sum += prodi * prodi;
721 sum = N_VL1Norm_Serial(
xarg(
i));
786 min = N_VMinQuotient_Serial(
xarg(
i),
yarg(
i));
void nrn_multithread_job(F &&job, Args &&... args)
#define MUTCONSTRUCT(mkmut)
void N_VOneMask_Serial(N_Vector x)
static booleantype bretval
realtype N_VDotProd_NrnThreadLD(N_Vector x, N_Vector y)
void N_VInv_NrnThreadLD(N_Vector x, N_Vector z)
N_Vector N_VNew_NrnThreadLD(long int length, int nthread, long int *sizes)
static void * v1mask(NrnThread *nt)
void N_VPrint_NrnThreadLD(N_Vector x)
N_Vector * N_VNewVectorArray_NrnThreadLD(int count, long int length, int nthread, long int *sizes)
static void * vconstrmask(NrnThread *nt)
realtype N_VL1Norm_NrnThreadLD(N_Vector x)
N_Vector N_VCloneEmpty_NrnThreadLD(N_Vector w)
static realtype vwrmsnormmask_help(N_Vector x, N_Vector w, N_Vector id)
static void * vaddconst(NrnThread *nt)
static realtype N_VWL2Norm_helper(N_Vector x, N_Vector w)
static void * vscale(NrnThread *nt)
booleantype N_VConstrMask_NrnThreadLD(N_Vector y, N_Vector x, N_Vector z)
realtype N_VWL2Norm_NrnThreadLD(N_Vector x, N_Vector w)
static void * vwrmsnormmask(NrnThread *nt)
void N_VAbs_NrnThreadLD(N_Vector x, N_Vector z)
N_Vector N_VClone_NrnThreadLD(N_Vector w)
realtype N_VMin_NrnThreadLD(N_Vector x)
void N_VSetArrayPointer_NrnThreadLD(realtype *v_data, N_Vector v)
N_Vector N_VMake_NrnThreadLD(long int length, realtype *v_data)
void N_VDiv_NrnThreadLD(N_Vector x, N_Vector y, N_Vector z)
realtype N_VMinQuotient_NrnThreadLD(N_Vector x, N_Vector y)
static void * vconst(NrnThread *nt)
static void * vabs(NrnThread *nt)
static void * vlinearsum(NrnThread *nt)
static void * vmin(NrnThread *nt)
void N_VConst_NrnThreadLD(realtype c, N_Vector z)
N_Vector * N_VNewVectorArrayEmpty_NrnThreadLD(int count, long int length, int nthread, long int *sizes)
void N_VCompare_NrnThreadLD(realtype c, N_Vector x, N_Vector z)
void N_VDestroyVectorArray_NrnThreadLD(N_Vector *vs, int count)
N_Vector N_VNewEmpty_NrnThreadLD(long int length, int nthread, long int *sizes)
realtype N_VWrmsNormMask_NrnThreadLD(N_Vector x, N_Vector w, N_Vector id)
void N_VLinearSum_NrnThreadLD(realtype a, N_Vector x, realtype b, N_Vector y, N_Vector z)
booleantype N_VInvTest_NrnThreadLD(N_Vector x, N_Vector z)
static void * vdiv(NrnThread *nt)
static void * vprod(NrnThread *nt)
static void * vmaxnorm(NrnThread *nt)
static void * vminquotient(NrnThread *nt)
static void * vwl2norm(NrnThread *nt)
void N_VProd_NrnThreadLD(N_Vector x, N_Vector y, N_Vector z)
realtype N_VMaxNorm_NrnThreadLD(N_Vector x)
realtype N_VWrmsNorm_NrnThreadLD(N_Vector x, N_Vector w)
static void pr(N_Vector x)
void N_VScale_NrnThreadLD(realtype c, N_Vector x, N_Vector z)
realtype * N_VGetArrayPointer_NrnThreadLD(N_Vector v)
static void * vinv(NrnThread *nt)
static realtype retval_comp
void N_VOneMask_NrnThreadLD(N_Vector x)
static void * vinvtest(NrnThread *nt)
static void * vl1norm(NrnThread *nt)
static void * vdotprod(NrnThread *nt)
static void * vcompare(NrnThread *nt)
void N_VAddConst_NrnThreadLD(N_Vector x, realtype b, N_Vector z)
void N_VDestroy_NrnThreadLD(N_Vector v)
static realtype vwrmsnorm_help(N_Vector x, N_Vector w)
void N_VSpace_NrnThreadLD(N_Vector v, long int *lrw, long int *liw)
static void * vwrmsnorm(NrnThread *nt)
#define NV_CONTENT_NT_LD(v)
#define NV_SUBVEC_NT_LD(v, i)
#define NV_LENGTH_NT_LD(v)
#define NV_OWN_DATA_NT_LD(v)
struct _N_VectorContent_NrnThreadLD * N_VectorContent_NrnThreadLD
Represent main neuron object computed by single thread.