19 #define USELONGDOUBLE 1
21 #include <../../nrnconf.h>
24 #if HAVE_POSIX_MEMALIGN
25 #define HAVE_MEMALIGN 1
29 #define _XOPEN_SOURCE 600
36 #include "shared/sundialsmath.h"
37 #include "shared/sundialstypes.h"
39 #define ZERO RCONST(0.0)
40 #define HALF RCONST(0.5)
41 #define ONE RCONST(1.0)
42 #define ONEPT5 RCONST(1.5)
45 #define ldrealtype long double
47 #define ldrealtype realtype
88 v = (N_Vector) malloc(
sizeof *
v);
93 ops = (N_Vector_Ops) malloc(
sizeof(
struct _generic_N_Vector_Ops));
126 if (content ==
NULL) {
137 v->content = content;
159 nrn_assert(posix_memalign((
void**) &
data, 64, length *
sizeof(realtype)) == 0);
161 data = (realtype*) malloc(length *
sizeof(realtype));
189 v = (N_Vector) malloc(
sizeof *
v);
194 ops = (N_Vector_Ops) malloc(
sizeof(
struct _generic_N_Vector_Ops));
200 ops->nvclone = w->ops->nvclone;
201 ops->nvdestroy = w->ops->nvdestroy;
202 ops->nvspace = w->ops->nvspace;
203 ops->nvgetarraypointer = w->ops->nvgetarraypointer;
204 ops->nvsetarraypointer = w->ops->nvsetarraypointer;
205 ops->nvlinearsum = w->ops->nvlinearsum;
206 ops->nvconst = w->ops->nvconst;
207 ops->nvprod = w->ops->nvprod;
208 ops->nvdiv = w->ops->nvdiv;
209 ops->nvscale = w->ops->nvscale;
210 ops->nvabs = w->ops->nvabs;
211 ops->nvinv = w->ops->nvinv;
212 ops->nvaddconst = w->ops->nvaddconst;
213 ops->nvdotprod = w->ops->nvdotprod;
214 ops->nvmaxnorm = w->ops->nvmaxnorm;
215 ops->nvwrmsnormmask = w->ops->nvwrmsnormmask;
216 ops->nvwrmsnorm = w->ops->nvwrmsnorm;
217 ops->nvmin = w->ops->nvmin;
218 ops->nvwl2norm = w->ops->nvwl2norm;
219 ops->nvl1norm = w->ops->nvl1norm;
220 ops->nvcompare = w->ops->nvcompare;
221 ops->nvinvtest = w->ops->nvinvtest;
222 ops->nvconstrmask = w->ops->nvconstrmask;
223 ops->nvminquotient = w->ops->nvminquotient;
227 if (content ==
NULL) {
238 v->content = content;
275 vs = (N_Vector*) malloc(count *
sizeof(N_Vector));
279 for (
j = 0;
j < count;
j++) {
301 vs = (N_Vector*) malloc(count *
sizeof(N_Vector));
305 for (
j = 0;
j < count;
j++) {
323 for (
j = 0;
j < count;
j++)
340 for (
i = 0;
i < N;
i++) {
341 #if defined(SUNDIALS_EXTENDED_PRECISION)
342 printf(
"%11.8Lg\n", *xd++);
343 #elif defined(SUNDIALS_DOUBLE_PRECISION)
344 printf(
"%11.8lg\n", *xd++);
346 printf(
"%11.8g\n", *xd++);
373 nrn_assert(posix_memalign((
void**) &
data, 64, length *
sizeof(realtype)) == 0);
375 data = (realtype*) malloc(length *
sizeof(realtype));
418 realtype
c, *xd, *yd, *zd;
422 if ((b ==
ONE) && (z == y)) {
427 if ((a ==
ONE) && (z == x)) {
434 if ((a ==
ONE) && (b ==
ONE)) {
441 if ((test = ((a ==
ONE) && (b == -
ONE))) || ((a == -
ONE) && (b ==
ONE))) {
451 if ((test = (a ==
ONE)) || (b ==
ONE)) {
461 if ((test = (a == -
ONE)) || (b == -
ONE)) {
494 for (
i = 0;
i < N;
i++)
495 *zd++ = a * (*xd++) + b * (*yd++);
505 for (
i = 0;
i < N;
i++)
511 realtype *xd, *yd, *zd;
518 for (
i = 0;
i < N;
i++)
519 *zd++ = (*xd++) * (*yd++);
524 realtype *xd, *yd, *zd;
531 for (
i = 0;
i < N;
i++)
532 *zd++ = (*xd++) / (*yd++);
546 }
else if (
c == -
ONE) {
552 for (
i = 0;
i < N;
i++)
565 for (
i = 0;
i < N;
i++, xd++, zd++)
577 for (
i = 0;
i < N;
i++)
578 *zd++ =
ONE / (*xd++);
589 for (
i = 0;
i < N;
i++)
595 realtype sum =
ZERO, *xd, *yd;
601 for (
i = 0;
i < N;
i++)
602 sum += (*xd++) * (*yd++);
614 for (
i = 0;
i < N;
i++, xd++) {
624 realtype prodi, *xd, *wd;
631 for (
i = 0;
i < N;
i++) {
632 prodi = (*xd++) * (*wd++);
633 sum += prodi * prodi;
636 return (RSqrt((realtype) sum / N));
641 realtype prodi, *xd, *wd, *idd;
649 for (
i = 0;
i < N;
i++) {
651 prodi = xd[
i] * wd[
i];
652 sum += prodi * prodi;
656 return (RSqrt((realtype) sum / N));
669 for (
i = 1;
i < N;
i++, xd++) {
679 realtype prodi, *xd, *wd;
686 for (
i = 0;
i < N;
i++) {
687 prodi = (*xd++) * (*wd++);
688 sum += prodi * prodi;
691 return (RSqrt((realtype) sum));
702 for (
i = 0;
i < N;
i++)
705 return ((realtype) sum);
715 for (
i = 0;
i < N;
i++, xd++) {
729 for (
i = 0;
i < N;
i++, xd++, zd++) {
742 for (
i = 0;
i < N;
i++) {
745 *zd++ =
ONE / (*xd++);
754 realtype *cd, *xd, *md;
763 for (
i = 0;
i < N;
i++, cd++, xd++, md++) {
768 if ((*xd) * (*cd) <=
ZERO) {
774 if ((*cd) >
HALF || (*cd) < -
HALF) {
775 if ((*xd) * (*cd) <
ZERO) {
785 booleantype notEvenOnce;
787 realtype *nd, *dd,
min = 0.0;
795 for (
i = 0;
i < N;
i++, nd++, dd++) {
807 if (notEvenOnce || (N == 0))
827 for (
i = 0;
i < N;
i++)
833 realtype *xd, *yd, *zd;
840 for (
i = 0;
i < N;
i++)
841 *zd++ = (*xd++) + (*yd++);
846 realtype *xd, *yd, *zd;
853 for (
i = 0;
i < N;
i++)
854 *zd++ = (*xd++) - (*yd++);
865 for (
i = 0;
i < N;
i++)
871 realtype *xd, *yd, *zd;
878 for (
i = 0;
i < N;
i++)
879 *zd++ =
c * ((*xd++) + (*yd++));
884 realtype *xd, *yd, *zd;
891 for (
i = 0;
i < N;
i++)
892 *zd++ =
c * ((*xd++) - (*yd++));
897 realtype *xd, *yd, *zd;
904 for (
i = 0;
i < N;
i++)
905 *zd++ = a * (*xd++) + (*yd++);
910 realtype *xd, *yd, *zd;
917 for (
i = 0;
i < N;
i++)
918 *zd++ = a * (*xd++) - (*yd++);
930 for (
i = 0;
i < N;
i++)
936 for (
i = 0;
i < N;
i++)
941 for (
i = 0;
i < N;
i++)
942 *yd++ += a * (*xd++);
952 for (
i = 0;
i < N;
i++)
void N_VCompare_NrnSerialLD(realtype c, N_Vector x, N_Vector z)
N_Vector N_VCloneEmpty_NrnSerialLD(N_Vector w)
realtype N_VWL2Norm_NrnSerialLD(N_Vector x, N_Vector w)
N_Vector N_VMake_NrnSerialLD(long int length, realtype *v_data)
void N_VScale_NrnSerialLD(realtype c, N_Vector x, N_Vector z)
N_Vector N_VNewEmpty_NrnSerialLD(long int length)
void N_VSpace_NrnSerialLD(N_Vector v, long int *lrw, long int *liw)
static void VScaleSum_NrnSerialLD(realtype c, N_Vector x, N_Vector y, N_Vector z)
void N_VLinearSum_NrnSerialLD(realtype a, N_Vector x, realtype b, N_Vector y, N_Vector z)
static void VDiff_NrnSerialLD(N_Vector x, N_Vector y, N_Vector z)
realtype N_VWrmsNormMask_NrnSerialLD(N_Vector x, N_Vector w, N_Vector id)
booleantype N_VConstrMask_NrnSerialLD(N_Vector c, N_Vector x, N_Vector m)
static void VSum_NrnSerialLD(N_Vector x, N_Vector y, N_Vector z)
realtype N_VDotProd_NrnSerialLD(N_Vector x, N_Vector y)
void N_VPrint_NrnSerialLD(N_Vector x)
static void VCopy_NrnSerialLD(N_Vector x, N_Vector z)
N_Vector N_VClone_NrnSerialLD(N_Vector w)
static void VLin2_NrnSerialLD(realtype a, N_Vector x, N_Vector y, N_Vector z)
booleantype N_VInvTest_NrnSerialLD(N_Vector x, N_Vector z)
realtype N_VWrmsNorm_NrnSerialLD(N_Vector x, N_Vector w)
static void VScaleBy_NrnSerialLD(realtype a, N_Vector x)
void N_VDiv_NrnSerialLD(N_Vector x, N_Vector y, N_Vector z)
void N_VDestroyVectorArray_NrnSerialLD(N_Vector *vs, int count)
realtype N_VMaxNorm_NrnSerialLD(N_Vector x)
static void VLin1_NrnSerialLD(realtype a, N_Vector x, N_Vector y, N_Vector z)
realtype N_VL1Norm_NrnSerialLD(N_Vector x)
N_Vector * N_VNewVectorArray_NrnSerialLD(int count, long int length)
realtype N_VMin_NrnSerialLD(N_Vector x)
void N_VOneMask_NrnSerialLD(N_Vector x)
static void Vaxpy_NrnSerialLD(realtype a, N_Vector x, N_Vector y)
static void VScaleDiff_NrnSerialLD(realtype c, N_Vector x, N_Vector y, N_Vector z)
realtype * N_VGetArrayPointer_NrnSerialLD(N_Vector v)
N_Vector N_VNew_NrnSerialLD(long int length)
static void VNeg_NrnSerialLD(N_Vector x, N_Vector z)
void N_VAbs_NrnSerialLD(N_Vector x, N_Vector z)
void N_VSetArrayPointer_NrnSerialLD(realtype *v_data, N_Vector v)
void N_VDestroy_NrnSerialLD(N_Vector v)
N_Vector * N_VNewVectorArrayEmpty_NrnSerialLD(int count, long int length)
void N_VInv_NrnSerialLD(N_Vector x, N_Vector z)
void N_VAddConst_NrnSerialLD(N_Vector x, realtype b, N_Vector z)
realtype N_VMinQuotient_NrnSerialLD(N_Vector num, N_Vector denom)
void N_VProd_NrnSerialLD(N_Vector x, N_Vector y, N_Vector z)
void N_VConst_NrnSerialLD(realtype c, N_Vector z)
struct _N_VectorContent_NrnSerialLD * N_VectorContent_NrnSerialLD
#define NV_OWN_DATA_S_LD(v)
#define NV_LENGTH_S_LD(v)