18 #include <../../nrnconf.h>
25 #include <nrnmpidec.h>
29 #include "sundialsmath.h"
30 #include "sundialstypes.h"
32 #define ZERO RCONST(0.0)
33 #define HALF RCONST(0.5)
34 #define ONE RCONST(1.0)
35 #define ONEPT5 RCONST(1.5)
39 #define BAD_N1 "N_VNew_NrnParallelLD -- Sum of local vector lengths differs from "
40 #define BAD_N2 "input global length. \n\n"
41 #define BAD_N BAD_N1 BAD_N2
88 nrnmpi_long_allreduce_vec(&
n, &Nsum, 1, 1);
89 if (Nsum != global_length) {
95 v = (N_Vector) malloc(
sizeof *
v);
100 ops = (N_Vector_Ops) malloc(
sizeof(
struct _generic_N_Vector_Ops));
133 if (content ==
NULL) {
142 content->
comm = comm;
147 v->content = content;
158 long int local_length,
159 long int global_length) {
168 if (local_length > 0) {
170 data = (realtype*) malloc(local_length *
sizeof(realtype));
197 v = (N_Vector) malloc(
sizeof *
v);
202 ops = (N_Vector_Ops) malloc(
sizeof(
struct _generic_N_Vector_Ops));
208 ops->nvclone = w->ops->nvclone;
209 ops->nvdestroy = w->ops->nvdestroy;
210 ops->nvspace = w->ops->nvspace;
211 ops->nvgetarraypointer = w->ops->nvgetarraypointer;
212 ops->nvsetarraypointer = w->ops->nvsetarraypointer;
213 ops->nvlinearsum = w->ops->nvlinearsum;
214 ops->nvconst = w->ops->nvconst;
215 ops->nvprod = w->ops->nvprod;
216 ops->nvdiv = w->ops->nvdiv;
217 ops->nvscale = w->ops->nvscale;
218 ops->nvabs = w->ops->nvabs;
219 ops->nvinv = w->ops->nvinv;
220 ops->nvaddconst = w->ops->nvaddconst;
221 ops->nvdotprod = w->ops->nvdotprod;
222 ops->nvmaxnorm = w->ops->nvmaxnorm;
223 ops->nvwrmsnormmask = w->ops->nvwrmsnormmask;
224 ops->nvwrmsnorm = w->ops->nvwrmsnorm;
225 ops->nvmin = w->ops->nvmin;
226 ops->nvwl2norm = w->ops->nvwl2norm;
227 ops->nvl1norm = w->ops->nvl1norm;
228 ops->nvcompare = w->ops->nvcompare;
229 ops->nvinvtest = w->ops->nvinvtest;
230 ops->nvconstrmask = w->ops->nvconstrmask;
231 ops->nvminquotient = w->ops->nvminquotient;
235 if (content ==
NULL) {
249 v->content = content;
260 long int local_length,
261 long int global_length,
269 if (local_length > 0) {
284 long int local_length,
285 long int global_length) {
292 vs = (N_Vector*) malloc(count *
sizeof(N_Vector));
296 for (
j = 0;
j < count;
j++) {
314 long int local_length,
315 long int global_length) {
322 vs = (N_Vector*) malloc(count *
sizeof(N_Vector));
326 for (
j = 0;
j < count;
j++) {
344 for (
j = 0;
j < count;
j++)
361 for (
i = 0;
i < N;
i++) {
376 long int local_length;
385 if (local_length > 0) {
387 data = (realtype*) malloc(local_length *
sizeof(realtype));
435 realtype
c, *xd, *yd, *zd;
439 if ((b ==
ONE) && (z == y)) {
444 if ((a ==
ONE) && (z == x)) {
451 if ((a ==
ONE) && (b ==
ONE)) {
458 if ((test = ((a ==
ONE) && (b == -
ONE))) || ((a == -
ONE) && (b ==
ONE))) {
468 if ((test = (a ==
ONE)) || (b ==
ONE)) {
478 if ((test = (a == -
ONE)) || (b == -
ONE)) {
511 for (
i = 0;
i < N;
i++)
512 *zd++ = a * (*xd++) + b * (*yd++);
522 for (
i = 0;
i < N;
i++)
528 realtype *xd, *yd, *zd;
535 for (
i = 0;
i < N;
i++)
536 *zd++ = (*xd++) * (*yd++);
541 realtype *xd, *yd, *zd;
548 for (
i = 0;
i < N;
i++)
549 *zd++ = (*xd++) / (*yd++);
563 }
else if (
c == -
ONE) {
569 for (
i = 0;
i < N;
i++)
582 for (
i = 0;
i < N;
i++, xd++, zd++)
594 for (
i = 0;
i < N;
i++)
595 *zd++ =
ONE / (*xd++);
606 for (
i = 0;
i < N;
i++)
612 realtype sum =
ZERO, *xd, *yd, gsum;
620 for (
i = 0;
i < N;
i++)
621 sum += xd[
i] * yd[
i];
629 realtype max, *xd, gmax;
638 for (
i = 0;
i < N;
i++, xd++) {
648 long int i, N, N_global;
649 realtype prodi, *xd, *wd;
659 for (
i = 0;
i < N;
i++) {
660 prodi = (*xd++) * (*wd++);
661 auto const y = prodi * prodi -
c;
662 auto const t = sum + y;
668 return RSqrt(gsum / N_global);
672 long int i, N, N_global;
673 realtype prodi, *xd, *wd, *idd;
684 for (
i = 0;
i < N;
i++) {
686 prodi = xd[
i] * wd[
i];
687 auto const y = prodi * prodi -
c;
688 auto const t = sum + y;
695 return RSqrt(gsum / N_global);
700 realtype min, *xd, gmin;
714 for (
i = 1;
i < N;
i++, xd++) {
726 realtype prodi, *xd, *wd;
735 for (
i = 0;
i < N;
i++) {
736 prodi = (*xd++) * (*wd++);
737 auto const y = prodi * prodi -
c;
738 auto const t = sum + y;
757 for (
i = 0;
i < N;
i++, xd++) {
758 auto const y =
ABS(*xd) -
c;
759 auto const t = sum + y;
776 for (
i = 0;
i < N;
i++, xd++, zd++) {
783 realtype *xd, *zd, val, gval;
792 for (
i = 0;
i < N;
i++) {
796 *zd++ =
ONE / (*xd++);
809 realtype *cd, *xd, *md;
820 for (
i = 0;
i < N;
i++, cd++, xd++, md++) {
825 if ((*xd) * (*cd) <=
ZERO) {
831 if ((*cd) >
HALF || (*cd) < -
HALF) {
832 if ((*xd) * (*cd) <
ZERO) {
843 booleantype notEvenOnce;
845 realtype *nd, *dd, min = 0.0;
855 for (
i = 0;
i < N;
i++, nd++, dd++) {
863 min =
MIN(min, (*nd) / (*dd));
867 if (notEvenOnce || (N == 0))
888 nrnmpi_dbl_allreduce_vec(&d, &out, 1, op);
901 long double ld_in{d}, ld_out{};
902 nrnmpi_longdbl_allreduce_vec(&ld_in, &ld_out, 1, op);
914 for (
i = 0;
i < N;
i++)
920 realtype *xd, *yd, *zd;
927 for (
i = 0;
i < N;
i++)
928 *zd++ = (*xd++) + (*yd++);
933 realtype *xd, *yd, *zd;
940 for (
i = 0;
i < N;
i++)
941 *zd++ = (*xd++) - (*yd++);
952 for (
i = 0;
i < N;
i++)
958 realtype *xd, *yd, *zd;
965 for (
i = 0;
i < N;
i++)
966 *zd++ =
c * ((*xd++) + (*yd++));
971 realtype *xd, *yd, *zd;
978 for (
i = 0;
i < N;
i++)
979 *zd++ =
c * ((*xd++) - (*yd++));
984 realtype *xd, *yd, *zd;
991 for (
i = 0;
i < N;
i++)
992 *zd++ = a * (*xd++) + (*yd++);
997 realtype *xd, *yd, *zd;
1004 for (
i = 0;
i < N;
i++)
1005 *zd++ = a * (*xd++) - (*yd++);
1017 for (
i = 0;
i < N;
i++)
1023 for (
i = 0;
i < N;
i++)
1028 for (
i = 0;
i < N;
i++)
1029 *yd++ += a * (*xd++);
1039 for (
i = 0;
i < N;
i++)
int const size_t const size_t n
static void VDiff_NrnParallelLD(N_Vector x, N_Vector y, N_Vector z)
static realtype VAllReduce_NrnParallelLD(realtype d, int op, MPI_Comm comm)
realtype N_VWL2Norm_NrnParallelLD(N_Vector x, N_Vector w)
void N_VSetArrayPointer_NrnParallelLD(realtype *v_data, N_Vector v)
N_Vector N_VClone_NrnParallelLD(N_Vector w)
booleantype N_VInvTest_NrnParallelLD(N_Vector x, N_Vector z)
static void VSum_NrnParallelLD(N_Vector x, N_Vector y, N_Vector z)
realtype N_VL1Norm_NrnParallelLD(N_Vector x)
void N_VProd_NrnParallelLD(N_Vector x, N_Vector y, N_Vector z)
void N_VScale_NrnParallelLD(realtype c, N_Vector x, N_Vector z)
static void VCopy_NrnParallelLD(N_Vector x, N_Vector z)
N_Vector N_VCloneEmpty_NrnParallelLD(N_Vector w)
N_Vector N_VMake_NrnParallelLD(MPI_Comm comm, long int local_length, long int global_length, realtype *v_data)
realtype N_VMin_NrnParallelLD(N_Vector x)
realtype N_VWrmsNormMask_NrnParallelLD(N_Vector x, N_Vector w, N_Vector id)
void N_VDiv_NrnParallelLD(N_Vector x, N_Vector y, N_Vector z)
void N_VSpace_NrnParallelLD(N_Vector v, long int *lrw, long int *liw)
N_Vector N_VNewEmpty_NrnParallelLD(MPI_Comm comm, long int local_length, long int global_length)
void N_VAddConst_NrnParallelLD(N_Vector x, realtype b, N_Vector z)
static void VScaleDiff_NrnParallelLD(realtype c, N_Vector x, N_Vector y, N_Vector z)
booleantype N_VConstrMask_NrnParallelLD(N_Vector c, N_Vector x, N_Vector m)
void N_VInv_NrnParallelLD(N_Vector x, N_Vector z)
void N_VAbs_NrnParallelLD(N_Vector x, N_Vector z)
static void VScaleBy_NrnParallelLD(realtype a, N_Vector x)
void N_VLinearSum_NrnParallelLD(realtype a, N_Vector x, realtype b, N_Vector y, N_Vector z)
void N_VConst_NrnParallelLD(realtype c, N_Vector z)
void N_VDestroyVectorArray_NrnParallelLD(N_Vector *vs, int count)
void N_VPrint_NrnParallelLD(N_Vector x)
static void VNeg_NrnParallelLD(N_Vector x, N_Vector z)
static void VLin1_NrnParallelLD(realtype a, N_Vector x, N_Vector y, N_Vector z)
void N_VDestroy_NrnParallelLD(N_Vector v)
realtype N_VMaxNorm_NrnParallelLD(N_Vector x)
N_Vector * N_VNewVectorArray_NrnParallelLD(int count, MPI_Comm comm, long int local_length, long int global_length)
realtype * N_VGetArrayPointer_NrnParallelLD(N_Vector v)
realtype N_VDotProd_NrnParallelLD(N_Vector x, N_Vector y)
realtype N_VMinQuotient_NrnParallelLD(N_Vector num, N_Vector denom)
realtype N_VWrmsNorm_NrnParallelLD(N_Vector x, N_Vector w)
void N_VCompare_NrnParallelLD(realtype c, N_Vector x, N_Vector z)
N_Vector N_VNew_NrnParallelLD(MPI_Comm comm, long int local_length, long int global_length)
static void VScaleSum_NrnParallelLD(realtype c, N_Vector x, N_Vector y, N_Vector z)
N_Vector * N_VNewVectorArrayEmpty_NrnParallelLD(int count, MPI_Comm comm, long int local_length, long int global_length)
static void VLin2_NrnParallelLD(realtype a, N_Vector x, N_Vector y, N_Vector z)
static realtype VAllReduce_long_NrnParallelLD(realtype d, int op, MPI_Comm comm)
static void Vaxpy_NrnParallelLD(realtype a, N_Vector x, N_Vector y)
#define NV_OWN_DATA_P_LD(v)
struct _N_VectorContent_NrnParallelLD * N_VectorContent_NrnParallelLD
#define NV_GLOBLENGTH_P_LD(v)
#define NV_LOCLENGTH_P_LD(v)