nvector_serial.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044
  1. /*
  2. * -----------------------------------------------------------------
  3. * $Revision: 4272 $
  4. * $Date: 2014-12-02 11:19:41 -0800 (Tue, 02 Dec 2014) $
  5. * -----------------------------------------------------------------
  6. * Programmer(s): Scott D. Cohen, Alan C. Hindmarsh, Radu Serban,
  7. * and Aaron Collier @ LLNL
  8. * -----------------------------------------------------------------
  9. * LLNS Copyright Start
  10. * Copyright (c) 2014, Lawrence Livermore National Security
  11. * This work was performed under the auspices of the U.S. Department
  12. * of Energy by Lawrence Livermore National Laboratory in part under
  13. * Contract W-7405-Eng-48 and in part under Contract DE-AC52-07NA27344.
  14. * Produced at the Lawrence Livermore National Laboratory.
  15. * All rights reserved.
  16. * For details, see the LICENSE file.
  17. * LLNS Copyright End
  18. * -----------------------------------------------------------------
  19. * This is the implementation file for a serial implementation
  20. * of the NVECTOR package.
  21. * -----------------------------------------------------------------
  22. */
  23. #include <stdio.h>
  24. #include <stdlib.h>
  25. #include <nvector/nvector_serial.h>
  26. #include <sundials/sundials_math.h>
  27. #define ZERO RCONST(0.0)
  28. #define HALF RCONST(0.5)
  29. #define ONE RCONST(1.0)
  30. #define ONEPT5 RCONST(1.5)
  31. /* Private function prototypes */
  32. /* z=x */
  33. static void VCopy_Serial(N_Vector x, N_Vector z);
  34. /* z=x+y */
  35. static void VSum_Serial(N_Vector x, N_Vector y, N_Vector z);
  36. /* z=x-y */
  37. static void VDiff_Serial(N_Vector x, N_Vector y, N_Vector z);
  38. /* z=-x */
  39. static void VNeg_Serial(N_Vector x, N_Vector z);
  40. /* z=c(x+y) */
  41. static void VScaleSum_Serial(realtype c, N_Vector x, N_Vector y, N_Vector z);
  42. /* z=c(x-y) */
  43. static void VScaleDiff_Serial(realtype c, N_Vector x, N_Vector y, N_Vector z);
  44. /* z=ax+y */
  45. static void VLin1_Serial(realtype a, N_Vector x, N_Vector y, N_Vector z);
  46. /* z=ax-y */
  47. static void VLin2_Serial(realtype a, N_Vector x, N_Vector y, N_Vector z);
  48. /* y <- ax+y */
  49. static void Vaxpy_Serial(realtype a, N_Vector x, N_Vector y);
  50. /* x <- ax */
  51. static void VScaleBy_Serial(realtype a, N_Vector x);
  52. /*
  53. * -----------------------------------------------------------------
  54. * exported functions
  55. * -----------------------------------------------------------------
  56. */
  57. /* ----------------------------------------------------------------------------
  58. * Function to create a new empty serial vector
  59. */
  60. N_Vector N_VNewEmpty_Serial(long int length)
  61. {
  62. N_Vector v;
  63. N_Vector_Ops ops;
  64. N_VectorContent_Serial content;
  65. /* Create vector */
  66. v = NULL;
  67. v = (N_Vector) malloc(sizeof *v);
  68. if (v == NULL) return(NULL);
  69. /* Create vector operation structure */
  70. ops = NULL;
  71. ops = (N_Vector_Ops) malloc(sizeof(struct _generic_N_Vector_Ops));
  72. if (ops == NULL) { free(v); return(NULL); }
  73. ops->nvclone = N_VClone_Serial;
  74. ops->nvcloneempty = N_VCloneEmpty_Serial;
  75. ops->nvdestroy = N_VDestroy_Serial;
  76. ops->nvspace = N_VSpace_Serial;
  77. ops->nvgetarraypointer = N_VGetArrayPointer_Serial;
  78. ops->nvsetarraypointer = N_VSetArrayPointer_Serial;
  79. ops->nvlinearsum = N_VLinearSum_Serial;
  80. ops->nvconst = N_VConst_Serial;
  81. ops->nvprod = N_VProd_Serial;
  82. ops->nvdiv = N_VDiv_Serial;
  83. ops->nvscale = N_VScale_Serial;
  84. ops->nvabs = N_VAbs_Serial;
  85. ops->nvinv = N_VInv_Serial;
  86. ops->nvaddconst = N_VAddConst_Serial;
  87. ops->nvdotprod = N_VDotProd_Serial;
  88. ops->nvmaxnorm = N_VMaxNorm_Serial;
  89. ops->nvwrmsnormmask = N_VWrmsNormMask_Serial;
  90. ops->nvwrmsnorm = N_VWrmsNorm_Serial;
  91. ops->nvmin = N_VMin_Serial;
  92. ops->nvwl2norm = N_VWL2Norm_Serial;
  93. ops->nvl1norm = N_VL1Norm_Serial;
  94. ops->nvcompare = N_VCompare_Serial;
  95. ops->nvinvtest = N_VInvTest_Serial;
  96. ops->nvconstrmask = N_VConstrMask_Serial;
  97. ops->nvminquotient = N_VMinQuotient_Serial;
  98. /* Create content */
  99. content = NULL;
  100. content = (N_VectorContent_Serial) malloc(sizeof(struct _N_VectorContent_Serial));
  101. if (content == NULL) { free(ops); free(v); return(NULL); }
  102. content->length = length;
  103. content->own_data = FALSE;
  104. content->data = NULL;
  105. /* Attach content and ops */
  106. v->content = content;
  107. v->ops = ops;
  108. return(v);
  109. }
  110. /* ----------------------------------------------------------------------------
  111. * Function to create a new serial vector
  112. */
  113. N_Vector N_VNew_Serial(long int length)
  114. {
  115. N_Vector v;
  116. realtype *data;
  117. v = NULL;
  118. v = N_VNewEmpty_Serial(length);
  119. if (v == NULL) return(NULL);
  120. /* Create data */
  121. if (length > 0) {
  122. /* Allocate memory */
  123. data = NULL;
  124. data = (realtype *) malloc(length * sizeof(realtype));
  125. if(data == NULL) { N_VDestroy_Serial(v); return(NULL); }
  126. /* Attach data */
  127. NV_OWN_DATA_S(v) = TRUE;
  128. NV_DATA_S(v) = data;
  129. }
  130. return(v);
  131. }
  132. /* ----------------------------------------------------------------------------
  133. * Function to create a serial N_Vector with user data component
  134. */
  135. N_Vector N_VMake_Serial(long int length, realtype *v_data)
  136. {
  137. N_Vector v;
  138. v = NULL;
  139. v = N_VNewEmpty_Serial(length);
  140. if (v == NULL) return(NULL);
  141. if (length > 0) {
  142. /* Attach data */
  143. NV_OWN_DATA_S(v) = FALSE;
  144. NV_DATA_S(v) = v_data;
  145. }
  146. return(v);
  147. }
  148. /* ----------------------------------------------------------------------------
  149. * Function to create an array of new serial vectors.
  150. */
  151. N_Vector *N_VCloneVectorArray_Serial(int count, N_Vector w)
  152. {
  153. N_Vector *vs;
  154. int j;
  155. if (count <= 0) return(NULL);
  156. vs = NULL;
  157. vs = (N_Vector *) malloc(count * sizeof(N_Vector));
  158. if(vs == NULL) return(NULL);
  159. for (j = 0; j < count; j++) {
  160. vs[j] = NULL;
  161. vs[j] = N_VClone_Serial(w);
  162. if (vs[j] == NULL) {
  163. N_VDestroyVectorArray_Serial(vs, j-1);
  164. return(NULL);
  165. }
  166. }
  167. return(vs);
  168. }
  169. /* ----------------------------------------------------------------------------
  170. * Function to create an array of new serial vectors with NULL data array.
  171. */
  172. N_Vector *N_VCloneVectorArrayEmpty_Serial(int count, N_Vector w)
  173. {
  174. N_Vector *vs;
  175. int j;
  176. if (count <= 0) return(NULL);
  177. vs = NULL;
  178. vs = (N_Vector *) malloc(count * sizeof(N_Vector));
  179. if(vs == NULL) return(NULL);
  180. for (j = 0; j < count; j++) {
  181. vs[j] = NULL;
  182. vs[j] = N_VCloneEmpty_Serial(w);
  183. if (vs[j] == NULL) {
  184. N_VDestroyVectorArray_Serial(vs, j-1);
  185. return(NULL);
  186. }
  187. }
  188. return(vs);
  189. }
  190. /* ----------------------------------------------------------------------------
  191. * Function to free an array created with N_VCloneVectorArray_Serial
  192. */
  193. void N_VDestroyVectorArray_Serial(N_Vector *vs, int count)
  194. {
  195. int j;
  196. for (j = 0; j < count; j++) N_VDestroy_Serial(vs[j]);
  197. free(vs); vs = NULL;
  198. return;
  199. }
  200. /* ----------------------------------------------------------------------------
  201. * Function to print the a serial vector
  202. */
  203. void N_VPrint_Serial(N_Vector x)
  204. {
  205. long int i, N;
  206. realtype *xd;
  207. xd = NULL;
  208. N = NV_LENGTH_S(x);
  209. xd = NV_DATA_S(x);
  210. for (i = 0; i < N; i++) {
  211. #if defined(SUNDIALS_EXTENDED_PRECISION)
  212. printf("%35.32Lg\n", xd[i]);
  213. #elif defined(SUNDIALS_DOUBLE_PRECISION)
  214. printf("%19.16g\n", xd[i]);
  215. #else
  216. printf("%11.8g\n", xd[i]);
  217. #endif
  218. }
  219. printf("\n");
  220. return;
  221. }
  222. /*
  223. * -----------------------------------------------------------------
  224. * implementation of vector operations
  225. * -----------------------------------------------------------------
  226. */
  227. N_Vector N_VCloneEmpty_Serial(N_Vector w)
  228. {
  229. N_Vector v;
  230. N_Vector_Ops ops;
  231. N_VectorContent_Serial content;
  232. if (w == NULL) return(NULL);
  233. /* Create vector */
  234. v = NULL;
  235. v = (N_Vector) malloc(sizeof *v);
  236. if (v == NULL) return(NULL);
  237. /* Create vector operation structure */
  238. ops = NULL;
  239. ops = (N_Vector_Ops) malloc(sizeof(struct _generic_N_Vector_Ops));
  240. if (ops == NULL) { free(v); return(NULL); }
  241. ops->nvclone = w->ops->nvclone;
  242. ops->nvcloneempty = w->ops->nvcloneempty;
  243. ops->nvdestroy = w->ops->nvdestroy;
  244. ops->nvspace = w->ops->nvspace;
  245. ops->nvgetarraypointer = w->ops->nvgetarraypointer;
  246. ops->nvsetarraypointer = w->ops->nvsetarraypointer;
  247. ops->nvlinearsum = w->ops->nvlinearsum;
  248. ops->nvconst = w->ops->nvconst;
  249. ops->nvprod = w->ops->nvprod;
  250. ops->nvdiv = w->ops->nvdiv;
  251. ops->nvscale = w->ops->nvscale;
  252. ops->nvabs = w->ops->nvabs;
  253. ops->nvinv = w->ops->nvinv;
  254. ops->nvaddconst = w->ops->nvaddconst;
  255. ops->nvdotprod = w->ops->nvdotprod;
  256. ops->nvmaxnorm = w->ops->nvmaxnorm;
  257. ops->nvwrmsnormmask = w->ops->nvwrmsnormmask;
  258. ops->nvwrmsnorm = w->ops->nvwrmsnorm;
  259. ops->nvmin = w->ops->nvmin;
  260. ops->nvwl2norm = w->ops->nvwl2norm;
  261. ops->nvl1norm = w->ops->nvl1norm;
  262. ops->nvcompare = w->ops->nvcompare;
  263. ops->nvinvtest = w->ops->nvinvtest;
  264. ops->nvconstrmask = w->ops->nvconstrmask;
  265. ops->nvminquotient = w->ops->nvminquotient;
  266. /* Create content */
  267. content = NULL;
  268. content = (N_VectorContent_Serial) malloc(sizeof(struct _N_VectorContent_Serial));
  269. if (content == NULL) { free(ops); free(v); return(NULL); }
  270. content->length = NV_LENGTH_S(w);
  271. content->own_data = FALSE;
  272. content->data = NULL;
  273. /* Attach content and ops */
  274. v->content = content;
  275. v->ops = ops;
  276. return(v);
  277. }
  278. N_Vector N_VClone_Serial(N_Vector w)
  279. {
  280. N_Vector v;
  281. realtype *data;
  282. long int length;
  283. v = NULL;
  284. v = N_VCloneEmpty_Serial(w);
  285. if (v == NULL) return(NULL);
  286. length = NV_LENGTH_S(w);
  287. /* Create data */
  288. if (length > 0) {
  289. /* Allocate memory */
  290. data = NULL;
  291. data = (realtype *) malloc(length * sizeof(realtype));
  292. if(data == NULL) { N_VDestroy_Serial(v); return(NULL); }
  293. /* Attach data */
  294. NV_OWN_DATA_S(v) = TRUE;
  295. NV_DATA_S(v) = data;
  296. }
  297. return(v);
  298. }
  299. void N_VDestroy_Serial(N_Vector v)
  300. {
  301. if (NV_OWN_DATA_S(v) == TRUE) {
  302. free(NV_DATA_S(v));
  303. NV_DATA_S(v) = NULL;
  304. }
  305. free(v->content); v->content = NULL;
  306. free(v->ops); v->ops = NULL;
  307. free(v); v = NULL;
  308. return;
  309. }
  310. void N_VSpace_Serial(N_Vector v, long int *lrw, long int *liw)
  311. {
  312. *lrw = NV_LENGTH_S(v);
  313. *liw = 1;
  314. return;
  315. }
  316. realtype *N_VGetArrayPointer_Serial(N_Vector v)
  317. {
  318. return((realtype *) NV_DATA_S(v));
  319. }
  320. void N_VSetArrayPointer_Serial(realtype *v_data, N_Vector v)
  321. {
  322. if (NV_LENGTH_S(v) > 0) NV_DATA_S(v) = v_data;
  323. return;
  324. }
  325. void N_VLinearSum_Serial(realtype a, N_Vector x, realtype b, N_Vector y, N_Vector z)
  326. {
  327. long int i, N;
  328. realtype c, *xd, *yd, *zd;
  329. N_Vector v1, v2;
  330. booleantype test;
  331. xd = yd = zd = NULL;
  332. if ((b == ONE) && (z == y)) { /* BLAS usage: axpy y <- ax+y */
  333. Vaxpy_Serial(a,x,y);
  334. return;
  335. }
  336. if ((a == ONE) && (z == x)) { /* BLAS usage: axpy x <- by+x */
  337. Vaxpy_Serial(b,y,x);
  338. return;
  339. }
  340. /* Case: a == b == 1.0 */
  341. if ((a == ONE) && (b == ONE)) {
  342. VSum_Serial(x, y, z);
  343. return;
  344. }
  345. /* Cases: (1) a == 1.0, b = -1.0, (2) a == -1.0, b == 1.0 */
  346. if ((test = ((a == ONE) && (b == -ONE))) || ((a == -ONE) && (b == ONE))) {
  347. v1 = test ? y : x;
  348. v2 = test ? x : y;
  349. VDiff_Serial(v2, v1, z);
  350. return;
  351. }
  352. /* Cases: (1) a == 1.0, b == other or 0.0, (2) a == other or 0.0, b == 1.0 */
  353. /* if a or b is 0.0, then user should have called N_VScale */
  354. if ((test = (a == ONE)) || (b == ONE)) {
  355. c = test ? b : a;
  356. v1 = test ? y : x;
  357. v2 = test ? x : y;
  358. VLin1_Serial(c, v1, v2, z);
  359. return;
  360. }
  361. /* Cases: (1) a == -1.0, b != 1.0, (2) a != 1.0, b == -1.0 */
  362. if ((test = (a == -ONE)) || (b == -ONE)) {
  363. c = test ? b : a;
  364. v1 = test ? y : x;
  365. v2 = test ? x : y;
  366. VLin2_Serial(c, v1, v2, z);
  367. return;
  368. }
  369. /* Case: a == b */
  370. /* catches case both a and b are 0.0 - user should have called N_VConst */
  371. if (a == b) {
  372. VScaleSum_Serial(a, x, y, z);
  373. return;
  374. }
  375. /* Case: a == -b */
  376. if (a == -b) {
  377. VScaleDiff_Serial(a, x, y, z);
  378. return;
  379. }
  380. /* Do all cases not handled above:
  381. (1) a == other, b == 0.0 - user should have called N_VScale
  382. (2) a == 0.0, b == other - user should have called N_VScale
  383. (3) a,b == other, a !=b, a != -b */
  384. N = NV_LENGTH_S(x);
  385. xd = NV_DATA_S(x);
  386. yd = NV_DATA_S(y);
  387. zd = NV_DATA_S(z);
  388. for (i = 0; i < N; i++)
  389. zd[i] = (a*xd[i])+(b*yd[i]);
  390. return;
  391. }
  392. void N_VConst_Serial(realtype c, N_Vector z)
  393. {
  394. long int i, N;
  395. realtype *zd;
  396. zd = NULL;
  397. N = NV_LENGTH_S(z);
  398. zd = NV_DATA_S(z);
  399. for (i = 0; i < N; i++) zd[i] = c;
  400. return;
  401. }
  402. void N_VProd_Serial(N_Vector x, N_Vector y, N_Vector z)
  403. {
  404. long int i, N;
  405. realtype *xd, *yd, *zd;
  406. xd = yd = zd = NULL;
  407. N = NV_LENGTH_S(x);
  408. xd = NV_DATA_S(x);
  409. yd = NV_DATA_S(y);
  410. zd = NV_DATA_S(z);
  411. for (i = 0; i < N; i++)
  412. zd[i] = xd[i]*yd[i];
  413. return;
  414. }
  415. void N_VDiv_Serial(N_Vector x, N_Vector y, N_Vector z)
  416. {
  417. long int i, N;
  418. realtype *xd, *yd, *zd;
  419. xd = yd = zd = NULL;
  420. N = NV_LENGTH_S(x);
  421. xd = NV_DATA_S(x);
  422. yd = NV_DATA_S(y);
  423. zd = NV_DATA_S(z);
  424. for (i = 0; i < N; i++)
  425. zd[i] = xd[i]/yd[i];
  426. return;
  427. }
  428. void N_VScale_Serial(realtype c, N_Vector x, N_Vector z)
  429. {
  430. long int i, N;
  431. realtype *xd, *zd;
  432. xd = zd = NULL;
  433. if (z == x) { /* BLAS usage: scale x <- cx */
  434. VScaleBy_Serial(c, x);
  435. return;
  436. }
  437. if (c == ONE) {
  438. VCopy_Serial(x, z);
  439. } else if (c == -ONE) {
  440. VNeg_Serial(x, z);
  441. } else {
  442. N = NV_LENGTH_S(x);
  443. xd = NV_DATA_S(x);
  444. zd = NV_DATA_S(z);
  445. for (i = 0; i < N; i++)
  446. zd[i] = c*xd[i];
  447. }
  448. return;
  449. }
  450. void N_VAbs_Serial(N_Vector x, N_Vector z)
  451. {
  452. long int i, N;
  453. realtype *xd, *zd;
  454. xd = zd = NULL;
  455. N = NV_LENGTH_S(x);
  456. xd = NV_DATA_S(x);
  457. zd = NV_DATA_S(z);
  458. for (i = 0; i < N; i++)
  459. zd[i] = SUNRabs(xd[i]);
  460. return;
  461. }
  462. void N_VInv_Serial(N_Vector x, N_Vector z)
  463. {
  464. long int i, N;
  465. realtype *xd, *zd;
  466. xd = zd = NULL;
  467. N = NV_LENGTH_S(x);
  468. xd = NV_DATA_S(x);
  469. zd = NV_DATA_S(z);
  470. for (i = 0; i < N; i++)
  471. zd[i] = ONE/xd[i];
  472. return;
  473. }
  474. void N_VAddConst_Serial(N_Vector x, realtype b, N_Vector z)
  475. {
  476. long int i, N;
  477. realtype *xd, *zd;
  478. xd = zd = NULL;
  479. N = NV_LENGTH_S(x);
  480. xd = NV_DATA_S(x);
  481. zd = NV_DATA_S(z);
  482. for (i = 0; i < N; i++)
  483. zd[i] = xd[i]+b;
  484. return;
  485. }
  486. realtype N_VDotProd_Serial(N_Vector x, N_Vector y)
  487. {
  488. long int i, N;
  489. realtype sum, *xd, *yd;
  490. sum = ZERO;
  491. xd = yd = NULL;
  492. N = NV_LENGTH_S(x);
  493. xd = NV_DATA_S(x);
  494. yd = NV_DATA_S(y);
  495. for (i = 0; i < N; i++)
  496. sum += xd[i]*yd[i];
  497. return(sum);
  498. }
  499. realtype N_VMaxNorm_Serial(N_Vector x)
  500. {
  501. long int i, N;
  502. realtype max, *xd;
  503. max = ZERO;
  504. xd = NULL;
  505. N = NV_LENGTH_S(x);
  506. xd = NV_DATA_S(x);
  507. for (i = 0; i < N; i++) {
  508. if (SUNRabs(xd[i]) > max) max = SUNRabs(xd[i]);
  509. }
  510. return(max);
  511. }
  512. realtype N_VWrmsNorm_Serial(N_Vector x, N_Vector w)
  513. {
  514. long int i, N;
  515. realtype sum, prodi, *xd, *wd;
  516. sum = ZERO;
  517. xd = wd = NULL;
  518. N = NV_LENGTH_S(x);
  519. xd = NV_DATA_S(x);
  520. wd = NV_DATA_S(w);
  521. for (i = 0; i < N; i++) {
  522. prodi = xd[i]*wd[i];
  523. sum += SUNSQR(prodi);
  524. }
  525. return(SUNRsqrt(sum/N));
  526. }
  527. realtype N_VWrmsNormMask_Serial(N_Vector x, N_Vector w, N_Vector id)
  528. {
  529. long int i, N;
  530. realtype sum, prodi, *xd, *wd, *idd;
  531. sum = ZERO;
  532. xd = wd = idd = NULL;
  533. N = NV_LENGTH_S(x);
  534. xd = NV_DATA_S(x);
  535. wd = NV_DATA_S(w);
  536. idd = NV_DATA_S(id);
  537. for (i = 0; i < N; i++) {
  538. if (idd[i] > ZERO) {
  539. prodi = xd[i]*wd[i];
  540. sum += SUNSQR(prodi);
  541. }
  542. }
  543. return(SUNRsqrt(sum / N));
  544. }
  545. realtype N_VMin_Serial(N_Vector x)
  546. {
  547. long int i, N;
  548. realtype min, *xd;
  549. xd = NULL;
  550. N = NV_LENGTH_S(x);
  551. xd = NV_DATA_S(x);
  552. min = xd[0];
  553. for (i = 1; i < N; i++) {
  554. if (xd[i] < min) min = xd[i];
  555. }
  556. return(min);
  557. }
  558. realtype N_VWL2Norm_Serial(N_Vector x, N_Vector w)
  559. {
  560. long int i, N;
  561. realtype sum, prodi, *xd, *wd;
  562. sum = ZERO;
  563. xd = wd = NULL;
  564. N = NV_LENGTH_S(x);
  565. xd = NV_DATA_S(x);
  566. wd = NV_DATA_S(w);
  567. for (i = 0; i < N; i++) {
  568. prodi = xd[i]*wd[i];
  569. sum += SUNSQR(prodi);
  570. }
  571. return(SUNRsqrt(sum));
  572. }
  573. realtype N_VL1Norm_Serial(N_Vector x)
  574. {
  575. long int i, N;
  576. realtype sum, *xd;
  577. sum = ZERO;
  578. xd = NULL;
  579. N = NV_LENGTH_S(x);
  580. xd = NV_DATA_S(x);
  581. for (i = 0; i<N; i++)
  582. sum += SUNRabs(xd[i]);
  583. return(sum);
  584. }
  585. void N_VCompare_Serial(realtype c, N_Vector x, N_Vector z)
  586. {
  587. long int i, N;
  588. realtype *xd, *zd;
  589. xd = zd = NULL;
  590. N = NV_LENGTH_S(x);
  591. xd = NV_DATA_S(x);
  592. zd = NV_DATA_S(z);
  593. for (i = 0; i < N; i++) {
  594. zd[i] = (SUNRabs(xd[i]) >= c) ? ONE : ZERO;
  595. }
  596. return;
  597. }
  598. booleantype N_VInvTest_Serial(N_Vector x, N_Vector z)
  599. {
  600. long int i, N;
  601. realtype *xd, *zd;
  602. booleantype no_zero_found;
  603. xd = zd = NULL;
  604. N = NV_LENGTH_S(x);
  605. xd = NV_DATA_S(x);
  606. zd = NV_DATA_S(z);
  607. no_zero_found = TRUE;
  608. for (i = 0; i < N; i++) {
  609. if (xd[i] == ZERO)
  610. no_zero_found = FALSE;
  611. else
  612. zd[i] = ONE/xd[i];
  613. }
  614. return no_zero_found;
  615. }
  616. booleantype N_VConstrMask_Serial(N_Vector c, N_Vector x, N_Vector m)
  617. {
  618. long int i, N;
  619. booleantype test;
  620. realtype *cd, *xd, *md;
  621. cd = xd = md = NULL;
  622. N = NV_LENGTH_S(x);
  623. xd = NV_DATA_S(x);
  624. cd = NV_DATA_S(c);
  625. md = NV_DATA_S(m);
  626. test = TRUE;
  627. for (i = 0; i < N; i++) {
  628. md[i] = ZERO;
  629. if (cd[i] == ZERO) continue;
  630. if (cd[i] > ONEPT5 || cd[i] < -ONEPT5) {
  631. if ( xd[i]*cd[i] <= ZERO) { test = FALSE; md[i] = ONE; }
  632. continue;
  633. }
  634. if ( cd[i] > HALF || cd[i] < -HALF) {
  635. if (xd[i]*cd[i] < ZERO ) { test = FALSE; md[i] = ONE; }
  636. }
  637. }
  638. return(test);
  639. }
  640. realtype N_VMinQuotient_Serial(N_Vector num, N_Vector denom)
  641. {
  642. booleantype notEvenOnce;
  643. long int i, N;
  644. realtype *nd, *dd, min;
  645. nd = dd = NULL;
  646. N = NV_LENGTH_S(num);
  647. nd = NV_DATA_S(num);
  648. dd = NV_DATA_S(denom);
  649. notEvenOnce = TRUE;
  650. min = BIG_REAL;
  651. for (i = 0; i < N; i++) {
  652. if (dd[i] == ZERO) continue;
  653. else {
  654. if (!notEvenOnce) min = SUNMIN(min, nd[i]/dd[i]);
  655. else {
  656. min = nd[i]/dd[i];
  657. notEvenOnce = FALSE;
  658. }
  659. }
  660. }
  661. return(min);
  662. }
  663. /*
  664. * -----------------------------------------------------------------
  665. * private functions
  666. * -----------------------------------------------------------------
  667. */
  668. static void VCopy_Serial(N_Vector x, N_Vector z)
  669. {
  670. long int i, N;
  671. realtype *xd, *zd;
  672. xd = zd = NULL;
  673. N = NV_LENGTH_S(x);
  674. xd = NV_DATA_S(x);
  675. zd = NV_DATA_S(z);
  676. for (i = 0; i < N; i++)
  677. zd[i] = xd[i];
  678. return;
  679. }
  680. static void VSum_Serial(N_Vector x, N_Vector y, N_Vector z)
  681. {
  682. long int i, N;
  683. realtype *xd, *yd, *zd;
  684. xd = yd = zd = NULL;
  685. N = NV_LENGTH_S(x);
  686. xd = NV_DATA_S(x);
  687. yd = NV_DATA_S(y);
  688. zd = NV_DATA_S(z);
  689. for (i = 0; i < N; i++)
  690. zd[i] = xd[i]+yd[i];
  691. return;
  692. }
  693. static void VDiff_Serial(N_Vector x, N_Vector y, N_Vector z)
  694. {
  695. long int i, N;
  696. realtype *xd, *yd, *zd;
  697. xd = yd = zd = NULL;
  698. N = NV_LENGTH_S(x);
  699. xd = NV_DATA_S(x);
  700. yd = NV_DATA_S(y);
  701. zd = NV_DATA_S(z);
  702. for (i = 0; i < N; i++)
  703. zd[i] = xd[i]-yd[i];
  704. return;
  705. }
  706. static void VNeg_Serial(N_Vector x, N_Vector z)
  707. {
  708. long int i, N;
  709. realtype *xd, *zd;
  710. xd = zd = NULL;
  711. N = NV_LENGTH_S(x);
  712. xd = NV_DATA_S(x);
  713. zd = NV_DATA_S(z);
  714. for (i = 0; i < N; i++)
  715. zd[i] = -xd[i];
  716. return;
  717. }
  718. static void VScaleSum_Serial(realtype c, N_Vector x, N_Vector y, N_Vector z)
  719. {
  720. long int i, N;
  721. realtype *xd, *yd, *zd;
  722. xd = yd = zd = NULL;
  723. N = NV_LENGTH_S(x);
  724. xd = NV_DATA_S(x);
  725. yd = NV_DATA_S(y);
  726. zd = NV_DATA_S(z);
  727. for (i = 0; i < N; i++)
  728. zd[i] = c*(xd[i]+yd[i]);
  729. return;
  730. }
  731. static void VScaleDiff_Serial(realtype c, N_Vector x, N_Vector y, N_Vector z)
  732. {
  733. long int i, N;
  734. realtype *xd, *yd, *zd;
  735. xd = yd = zd = NULL;
  736. N = NV_LENGTH_S(x);
  737. xd = NV_DATA_S(x);
  738. yd = NV_DATA_S(y);
  739. zd = NV_DATA_S(z);
  740. for (i = 0; i < N; i++)
  741. zd[i] = c*(xd[i]-yd[i]);
  742. return;
  743. }
  744. static void VLin1_Serial(realtype a, N_Vector x, N_Vector y, N_Vector z)
  745. {
  746. long int i, N;
  747. realtype *xd, *yd, *zd;
  748. xd = yd = zd = NULL;
  749. N = NV_LENGTH_S(x);
  750. xd = NV_DATA_S(x);
  751. yd = NV_DATA_S(y);
  752. zd = NV_DATA_S(z);
  753. for (i = 0; i < N; i++)
  754. zd[i] = (a*xd[i])+yd[i];
  755. return;
  756. }
  757. static void VLin2_Serial(realtype a, N_Vector x, N_Vector y, N_Vector z)
  758. {
  759. long int i, N;
  760. realtype *xd, *yd, *zd;
  761. xd = yd = zd = NULL;
  762. N = NV_LENGTH_S(x);
  763. xd = NV_DATA_S(x);
  764. yd = NV_DATA_S(y);
  765. zd = NV_DATA_S(z);
  766. for (i = 0; i < N; i++)
  767. zd[i] = (a*xd[i])-yd[i];
  768. return;
  769. }
  770. static void Vaxpy_Serial(realtype a, N_Vector x, N_Vector y)
  771. {
  772. long int i, N;
  773. realtype *xd, *yd;
  774. xd = yd = NULL;
  775. N = NV_LENGTH_S(x);
  776. xd = NV_DATA_S(x);
  777. yd = NV_DATA_S(y);
  778. if (a == ONE) {
  779. for (i = 0; i < N; i++)
  780. yd[i] += xd[i];
  781. return;
  782. }
  783. if (a == -ONE) {
  784. for (i = 0; i < N; i++)
  785. yd[i] -= xd[i];
  786. return;
  787. }
  788. for (i = 0; i < N; i++)
  789. yd[i] += a*xd[i];
  790. return;
  791. }
  792. static void VScaleBy_Serial(realtype a, N_Vector x)
  793. {
  794. long int i, N;
  795. realtype *xd;
  796. xd = NULL;
  797. N = NV_LENGTH_S(x);
  798. xd = NV_DATA_S(x);
  799. for (i = 0; i < N; i++)
  800. xd[i] *= a;
  801. return;
  802. }