/tutorial/psc98/yosen.c

https://github.com/tsukud-y/estiva · C · 872 lines · 704 code · 104 blank · 64 comment · 120 complexity · 3fefa6ec53c32b775df88d7f82081149 MD5 · raw file

  1. /*
  2. * PSC98 input data generation
  3. */
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <math.h>
  7. #include <assert.h>
  8. #define MATMAX 4000000
  9. #define NZMAX 9
  10. /* input data generatoin */
  11. static int key = -1;
  12. static int yosen1();
  13. static int yosen2();
  14. static int yosen3();
  15. static int yosen4();
  16. static int yosen5();
  17. static int sample();
  18. static void genmat_common(i, ja, a, b)
  19. int i, *ja;
  20. double *a, *b;
  21. {
  22. char *buff;
  23. if ( key == -1 ) {
  24. buff = getenv( "PSC98" );
  25. if ( buff == NULL ) buff = "0";
  26. key = atoi(buff);
  27. }
  28. switch (key) {
  29. case 1: yosen1(i, ja, a, b); break;
  30. case 2: yosen2(i, ja, a, b); break;
  31. case 3: yosen3(i, ja, a, b); break;
  32. case 4: yosen4(i, ja, a, b); break;
  33. case 5: yosen5(i, ja, a, b); break;
  34. default: key=0; sample(i, ja, a, b); break;
  35. }
  36. }
  37. /*
  38. * Fortran77 Interface Routine
  39. */
  40. /*
  41. * call genmat(i, ja, a, b)
  42. */
  43. void
  44. genmat_(i, ja, a, b)
  45. int *i, ja[];
  46. double a[], *b;
  47. {
  48. #if IDX_BEGINS_WITH_ZERO
  49. genmat_common(*i, ja, a, b);
  50. #else
  51. int i_prime;
  52. if (*i == -1) i_prime = -1;
  53. else i_prime = *i - 1;
  54. genmat_common(i_prime, ja, a, b);
  55. #endif
  56. }
  57. /*
  58. * C Interface Routine
  59. */
  60. void genmat(i, ja, a, b)
  61. int i, *ja;
  62. double *a, *b;
  63. {
  64. #if IDX_BEGINS_WITH_ZERO
  65. genmat_common(i, ja, a, b);
  66. #else
  67. int i_prime;
  68. if (i == -1) i_prime = -1;
  69. else i_prime = i - 1;
  70. genmat_common(i_prime, ja, a, b);
  71. #endif
  72. }
  73. void
  74. chkval(s, n, x)
  75. FILE * s; /* output stream */
  76. int n;
  77. double *x;
  78. {
  79. double a[NZMAX];
  80. int ja[NZMAX], i, mat_size;
  81. double b, resmax, max_r = 0.0, l_time;
  82. genmat(-1, ja, a, &b);
  83. mat_size = ja[0];
  84. resmax = b;
  85. assert(n == mat_size);
  86. for (i = 0; i < mat_size; ++i) {
  87. double r;
  88. int j = 0;
  89. #if IDX_BEGINS_WITH_ZERO
  90. genmat(i, ja, a, &b);
  91. #else
  92. genmat(i + 1, ja, a, &b);
  93. #endif
  94. r = b;
  95. for (j = 0; ja[j] != -1 && j < NZMAX; ++j) {
  96. #if IDX_BEGINS_WITH_ZERO
  97. r -= a[j] * x[ja[j]];
  98. #else
  99. r -= a[j] * x[ja[j]-1];
  100. #endif
  101. }
  102. r = fabs(r);
  103. if (!(max_r >= r)) {
  104. if (max_r >= 0) {
  105. max_r = r;
  106. }
  107. }
  108. }
  109. fprintf(s, "Problem NO : %d\n", key);
  110. fprintf(s, "|b - Ax|_inf = %g", max_r);
  111. if (max_r < resmax) {
  112. fprintf (s, " (OK)\n");
  113. }
  114. else {
  115. fprintf (s, " (NG)\n");
  116. }
  117. }
  118. /*
  119. * Simple sort
  120. */
  121. static void
  122. sort_PSC98(n, idx, perm)
  123. int n, *idx, *perm;
  124. {
  125. int i, j;
  126. for (i = 0; i < n; ++i)
  127. perm[i] = i;
  128. for (i = 0; i < n; ++i) {
  129. int min = idx[perm[i]];
  130. int min_idx = i;
  131. for (j = i + 1; j < n; ++j) {
  132. if (min > idx[perm[j]]) {
  133. min = idx[perm[j]];
  134. min_idx = j;
  135. }
  136. }
  137. {
  138. int t = perm[i];
  139. perm[i] = perm[min_idx];
  140. perm[min_idx] = t;
  141. }
  142. }
  143. }
  144. #define SIZE_X 127
  145. #define SIZE_Y 127
  146. #define PROB_SIZE (SIZE_X * SIZE_Y)
  147. #define MAX_NZERO 5
  148. #define RESMAX 1e-5
  149. static int
  150. sample(i, ja, a, b)
  151. int i, *ja;
  152. double *a, *b;
  153. {
  154. double inv_h = (SIZE_X + 1) * (SIZE_X + 1);
  155. double d0 = 4.0 * inv_h;
  156. double d1 = -1.0 * inv_h;
  157. if (i == -1) {
  158. ja[0] = PROB_SIZE;
  159. ja[1] = PROB_SIZE
  160. + 2 * (PROB_SIZE - SIZE_Y)
  161. + 2 * (PROB_SIZE - SIZE_X);
  162. ja[2] = MAX_NZERO;
  163. *b = RESMAX;
  164. return 0;
  165. }
  166. else if (i >= 0 && i < PROB_SIZE) {
  167. int k = 0;
  168. if (i - SIZE_X >= 0) {
  169. #if IDX_BEGINS_WITH_ZERO
  170. ja[k] = i - SIZE_X;
  171. #else
  172. ja[k] = i + 1 - SIZE_X;
  173. #endif
  174. a[k] = d1;
  175. ++k;
  176. }
  177. if (i % SIZE_X > 0) {
  178. #if IDX_BEGINS_WITH_ZERO
  179. ja[k] = i - 1;
  180. #else
  181. ja[k] = i;
  182. #endif
  183. a[k] = d1;
  184. ++k;
  185. }
  186. #if IDX_BEGINS_WITH_ZERO
  187. ja[k] = i;
  188. #else
  189. ja[k] = i + 1;
  190. #endif
  191. a[k] = d0;
  192. ++k;
  193. if ((i + 1) % SIZE_X > 0) {
  194. #if IDX_BEGINS_WITH_ZERO
  195. ja[k] = i + 1;
  196. #else
  197. ja[k] = i + 2;
  198. #endif
  199. a[k] = d1;
  200. ++k;
  201. }
  202. if (i + SIZE_X < PROB_SIZE) {
  203. #if IDX_BEGINS_WITH_ZERO
  204. ja[k] = i + SIZE_X;
  205. #else
  206. ja[k] = i + 1 + SIZE_X;
  207. #endif
  208. a[k] = d1;
  209. ++k;
  210. }
  211. for (; k < NZMAX; ++k) {
  212. ja[k] = -1;
  213. a[k] = 0.0;
  214. }
  215. *b = 0.5 * (sin((double)i) + 1.0);
  216. return 0;
  217. }
  218. else {
  219. perror("sample");
  220. return 1;
  221. }
  222. }
  223. #undef SIZE_X
  224. #undef SIZE_Y
  225. #undef PROB_SIZE
  226. #undef MAX_NZERO
  227. #undef RESMAX
  228. /************** yosen1 *************/
  229. #define SIZE_X 511
  230. #define SIZE_Y 511
  231. #define PROB_SIZE (SIZE_X * SIZE_Y)
  232. #define MAX_NZERO 5
  233. #define RESMAX 1e-5
  234. static int
  235. yosen1(i, ja, a, b)
  236. int i, *ja;
  237. double *a, *b;
  238. {
  239. double inv_h = (SIZE_X + 1) * (SIZE_X + 1);
  240. double d0 = 4.0 * inv_h;
  241. double d1 = -1.0 * inv_h;
  242. if (i == -1) {
  243. ja[0] = PROB_SIZE;
  244. ja[1] = PROB_SIZE
  245. + 2 * (PROB_SIZE - SIZE_Y)
  246. + 2 * (PROB_SIZE - SIZE_X);
  247. ja[2] = MAX_NZERO;
  248. *b = RESMAX;
  249. return 0;
  250. }
  251. else if (i >= 0 && i < PROB_SIZE) {
  252. int k = 0;
  253. if (i - SIZE_X >= 0) {
  254. #if IDX_BEGINS_WITH_ZERO
  255. ja[k] = i - SIZE_X;
  256. #else
  257. ja[k] = i + 1 - SIZE_X;
  258. #endif
  259. a[k] = d1;
  260. ++k;
  261. }
  262. if (i % SIZE_X > 0) {
  263. #if IDX_BEGINS_WITH_ZERO
  264. ja[k] = i - 1;
  265. #else
  266. ja[k] = i;
  267. #endif
  268. a[k] = d1;
  269. ++k;
  270. }
  271. #if IDX_BEGINS_WITH_ZERO
  272. ja[k] = i;
  273. #else
  274. ja[k] = i + 1;
  275. #endif
  276. a[k] = d0;
  277. ++k;
  278. if ((i + 1) % SIZE_X > 0) {
  279. #if IDX_BEGINS_WITH_ZERO
  280. ja[k] = i + 1;
  281. #else
  282. ja[k] = i + 2;
  283. #endif
  284. a[k] = d1;
  285. ++k;
  286. }
  287. if (i + SIZE_X < PROB_SIZE) {
  288. #if IDX_BEGINS_WITH_ZERO
  289. ja[k] = i + SIZE_X;
  290. #else
  291. ja[k] = i + 1 + SIZE_X;
  292. #endif
  293. a[k] = d1;
  294. ++k;
  295. }
  296. for (; k < NZMAX; ++k) {
  297. ja[k] = -1;
  298. a[k] = 0.0;
  299. }
  300. *b = 0.5 * (sin((double)i) + 1.0);
  301. return 0;
  302. }
  303. else {
  304. perror("yosen1");
  305. return 1;
  306. }
  307. }
  308. #undef SIZE_X
  309. #undef SIZE_Y
  310. #undef PROB_SIZE
  311. #undef MAX_NZERO
  312. #undef RESMAX
  313. /************** yosen2 *************/
  314. /*
  315. * 2-dimensional Poisson Equation with Dirichlet Condition
  316. *
  317. * ___________
  318. * | SIZE_X2 |
  319. * | |
  320. * | SIZE_X1 | SIZE_Y
  321. * | |
  322. * ~~~~~~~~~~~
  323. */
  324. #define SIZE_X1 511
  325. #define SIZE_X2 245
  326. #define SIZE_Y 511
  327. #define MAX_NZERO 5
  328. #define RESMAX 1e-5
  329. static int
  330. yosen2(i, ja, a, b)
  331. int i, *ja;
  332. double *a, *b;
  333. {
  334. double inv_h = (SIZE_Y + 1) * (SIZE_Y + 1);
  335. double d0 = 4.0 * inv_h;
  336. double d1 = -1.0 * inv_h;
  337. int n2 = SIZE_Y / 2;
  338. int N2 = SIZE_X1 * n2;
  339. int N = N2 + SIZE_X2 * (SIZE_Y - n2);
  340. if (i == -1) {
  341. ja[0] = N;
  342. ja[1] = N + 2 * (N - SIZE_Y)
  343. + N - SIZE_X1
  344. + N - SIZE_X2
  345. - abs(SIZE_X1 - SIZE_X2);
  346. ja[2] = MAX_NZERO;
  347. *b = RESMAX;
  348. return 0;
  349. }
  350. else if (i >= 0 && i < N) {
  351. int k = 0;
  352. if (i >= SIZE_X1
  353. && (i >= N2 + SIZE_X2 || i < N2 + SIZE_X1)) {
  354. if (i >= N2 + SIZE_X2) {
  355. #if IDX_BEGINS_WITH_ZERO
  356. ja[k] = i - SIZE_X2;
  357. #else
  358. ja[k] = i + 1 - SIZE_X2;
  359. #endif
  360. a[k] = d1;
  361. ++k;
  362. }
  363. else {
  364. #if IDX_BEGINS_WITH_ZERO
  365. ja[k] = i - SIZE_X1;
  366. #else
  367. ja[k] = i + 1 - SIZE_X1;
  368. #endif
  369. a[k] = d1;
  370. ++k;
  371. }
  372. }
  373. if (i >= N2 && (i - N2) % SIZE_X2 > 0
  374. || i < N2 && i % SIZE_X1 > 0) {
  375. #if IDX_BEGINS_WITH_ZERO
  376. ja[k] = i - 1;
  377. #else
  378. ja[k] = i;
  379. #endif
  380. a[k] = d1;
  381. ++k;
  382. }
  383. /** Diagonal elements **/
  384. #if IDX_BEGINS_WITH_ZERO
  385. ja[k] = i;
  386. #else
  387. ja[k] = i + 1;
  388. #endif
  389. a[k] = d0;
  390. ++k;
  391. if (i >= N2 && (i + 1 - N2) % SIZE_X2 > 0
  392. || i < N2 && (i + 1) % SIZE_X1 > 0) {
  393. #if IDX_BEGINS_WITH_ZERO
  394. ja[k] = i + 1;
  395. #else
  396. ja[k] = i + 2;
  397. #endif
  398. a[k] = d1;
  399. ++k;
  400. }
  401. if (i < N - SIZE_X2
  402. && (i >= N2 || i < N2 - SIZE_X1 + SIZE_X2)) {
  403. if (i >= N2) {
  404. #if IDX_BEGINS_WITH_ZERO
  405. ja[k] = i + SIZE_X2;
  406. #else
  407. ja[k] = i + 1 + SIZE_X2;
  408. #endif
  409. a[k] = d1;
  410. ++k;
  411. }
  412. else {
  413. #if IDX_BEGINS_WITH_ZERO
  414. ja[k] = i + SIZE_X1;
  415. #else
  416. ja[k] = i + 1 + SIZE_X1;
  417. #endif
  418. a[k] = d1;
  419. ++k;
  420. }
  421. }
  422. for (; k < NZMAX; ++k) {
  423. ja[k] = -1;
  424. a[k] = 0.0;
  425. }
  426. /* right-hand side */
  427. *b = 0.5 * (sin((double)i) + 1.0);
  428. return 0;
  429. }
  430. else {
  431. perror("yosen2");
  432. return 1;
  433. }
  434. }
  435. #undef SIZE_X1
  436. #undef SIZE_X2
  437. #undef SIZE_Y
  438. #undef PROB_SIZE
  439. #undef MAX_NZERO
  440. #undef RESMAX
  441. /************** yosen3 *************/
  442. /*
  443. * 3-dimensional Poisson Equation with Dirichlet Condition
  444. *
  445. *
  446. */
  447. #define SIZE_X 63
  448. #define SIZE_Y 127
  449. #define SIZE_Z 127
  450. #define PROB_SIZE (SIZE_X * SIZE_Y * SIZE_Z)
  451. #define SIZE_XY (SIZE_X * SIZE_Y)
  452. #define MAX_NZERO 7
  453. #define RESMAX 1e-5
  454. static int
  455. yosen3(i, ja, a, b)
  456. int i, *ja;
  457. double *a, *b;
  458. {
  459. double inv_h = (SIZE_X + 1) * (SIZE_X + 1);
  460. double d0 = 6.0 * inv_h;
  461. double d1 = -1.0 * inv_h;
  462. if (i == -1) {
  463. ja[0] = PROB_SIZE;
  464. ja[1] = PROB_SIZE
  465. + 2 * (PROB_SIZE - SIZE_XY)
  466. + 2 * (PROB_SIZE - SIZE_Y * SIZE_Z)
  467. + 2 * (PROB_SIZE - SIZE_Z * SIZE_X);
  468. ja[2] = MAX_NZERO;
  469. *b = RESMAX;
  470. return 0;
  471. }
  472. else if (i >= 0 && i < PROB_SIZE) {
  473. int k = 0;
  474. if (i >= SIZE_XY) {
  475. #if IDX_BEGINS_WITH_ZERO
  476. ja[k] = i - SIZE_XY;
  477. #else
  478. ja[k] = i + 1 - SIZE_XY;
  479. #endif
  480. a[k] = d1;
  481. ++k;
  482. }
  483. if (i % SIZE_XY >= SIZE_X) {
  484. #if IDX_BEGINS_WITH_ZERO
  485. ja[k] = i - SIZE_X;
  486. #else
  487. ja[k] = i + 1 - SIZE_X;
  488. #endif
  489. a[k] = d1;
  490. ++k;
  491. }
  492. if (i % SIZE_XY % SIZE_X > 0) {
  493. #if IDX_BEGINS_WITH_ZERO
  494. ja[k] = i - 1;
  495. #else
  496. ja[k] = i;
  497. #endif
  498. a[k] = d1;
  499. ++k;
  500. }
  501. #if IDX_BEGINS_WITH_ZERO
  502. ja[k] = i;
  503. #else
  504. ja[k] = i + 1;
  505. #endif
  506. a[k] = d0;
  507. ++k;
  508. if ((i + 1) % SIZE_XY % SIZE_X > 0) {
  509. #if IDX_BEGINS_WITH_ZERO
  510. ja[k] = i + 1;
  511. #else
  512. ja[k] = i + 2;
  513. #endif
  514. a[k] = d1;
  515. ++k;
  516. }
  517. if (i % SIZE_XY < SIZE_XY - SIZE_X) {
  518. #if IDX_BEGINS_WITH_ZERO
  519. ja[k] = i + SIZE_X;
  520. #else
  521. ja[k] = i + 1 + SIZE_X;
  522. #endif
  523. a[k] = d1;
  524. ++k;
  525. }
  526. if (i < PROB_SIZE - SIZE_XY) {
  527. #if IDX_BEGINS_WITH_ZERO
  528. ja[k] = i + SIZE_XY;
  529. #else
  530. ja[k] = i + 1 + SIZE_XY;
  531. #endif
  532. a[k] = d1;
  533. ++k;
  534. }
  535. for (; k < NZMAX; ++k) {
  536. ja[k] = -1;
  537. a[k] = 0.0;
  538. }
  539. *b = 0.5 * (sin((double)i) + 1.0);
  540. return 0;
  541. }
  542. else {
  543. perror("yosen3");
  544. return 1;
  545. }
  546. }
  547. #undef SIZE_X
  548. #undef SIZE_Y
  549. #undef SIZE_Z
  550. #undef SIZE_XY
  551. #undef PROB_SIZE
  552. #undef MAX_NZERO
  553. #undef RESMAX
  554. /************** yosen4 *************/
  555. /*
  556. * 2-dimensional Poisson Equation with Dirichlet Condition
  557. *
  558. * Non-uniform diffusion constant
  559. */
  560. #define SIZE_X 511
  561. #define SIZE_Y 511
  562. #define PROB_SIZE (SIZE_X * SIZE_Y)
  563. #define MAX_NZERO 5
  564. #define RESMAX 1e-5
  565. /*
  566. * +----------+
  567. * | k1 |
  568. * | +--+ |
  569. * | |k2| |
  570. * | +--+ |
  571. * | |
  572. * | |
  573. * +----------+
  574. */
  575. static void
  576. get_coeff(i, c)
  577. int i;
  578. double *c;
  579. {
  580. double k1 = 1;
  581. double k2 = 100;
  582. int ix, iy;
  583. int cx1, cy1, cx2, cy2;
  584. iy = i / SIZE_X;
  585. ix = i % SIZE_X;
  586. cx1 = SIZE_X / 4;
  587. cy1 = SIZE_Y / 4;
  588. cx2 = 3 * SIZE_X / 4;
  589. cy2 = 3 * SIZE_Y / 4;
  590. if ((ix > cx1 && iy > cy1)
  591. && (ix <= cx2 && iy <= cy2))
  592. c[0] = k2;
  593. else
  594. c[0] = k1;
  595. if ((ix >= cx1 && iy > cy1)
  596. && (ix < cx2 && iy <= cy2))
  597. c[1] = k2;
  598. else
  599. c[1] = k1;
  600. if ((ix > cx1 && iy >= cy1)
  601. && (ix <= cx2 && iy < cy2))
  602. c[2] = k2;
  603. else
  604. c[2] = k1;
  605. if ((ix >= cx1 && iy >= cy1)
  606. && (ix < cx2 && iy < cy2))
  607. c[3] = k2;
  608. else
  609. c[3] = k1;
  610. }
  611. static int
  612. yosen4(i, ja, a, b)
  613. int i, *ja;
  614. double *a, *b;
  615. {
  616. double inv_h = (SIZE_X + 1) * (SIZE_X + 1);
  617. if (i == -1) {
  618. ja[0] = PROB_SIZE;
  619. ja[1] = PROB_SIZE
  620. + 2 * (PROB_SIZE - SIZE_Y)
  621. + 2 * (PROB_SIZE - SIZE_X);
  622. ja[2] = MAX_NZERO;
  623. *b = RESMAX;
  624. return 0;
  625. }
  626. else if (i >= 0 && i < PROB_SIZE) {
  627. int k = 0;
  628. double c[4];
  629. double c0, c1, c2, c3;
  630. /*
  631. * c[2] | c[3]
  632. * -----+-----
  633. * c[0] | c[1]
  634. */
  635. get_coeff(i, c);
  636. c0 = c[0] * inv_h;
  637. c1 = c[1] * inv_h;
  638. c2 = c[2] * inv_h;
  639. c3 = c[3] * inv_h;
  640. if (i - SIZE_X >= 0) {
  641. #if IDX_BEGINS_WITH_ZERO
  642. ja[k] = i - SIZE_X;
  643. #else
  644. ja[k] = i + 1 - SIZE_X;
  645. #endif
  646. a[k] = -.5 * (c0 + c1);
  647. ++k;
  648. }
  649. if (i % SIZE_X > 0) {
  650. #if IDX_BEGINS_WITH_ZERO
  651. ja[k] = i - 1;
  652. #else
  653. ja[k] = i;
  654. #endif
  655. a[k] = -.5 * (c0 + c2);
  656. ++k;
  657. }
  658. #if IDX_BEGINS_WITH_ZERO
  659. ja[k] = i;
  660. #else
  661. ja[k] = i + 1;
  662. #endif
  663. a[k] = c0 + c1 + c2 + c3;
  664. ++k;
  665. if ((i + 1) % SIZE_X > 0) {
  666. #if IDX_BEGINS_WITH_ZERO
  667. ja[k] = i + 1;
  668. #else
  669. ja[k] = i + 2;
  670. #endif
  671. a[k] = -.5 * (c1 + c3);
  672. ++k;
  673. }
  674. if (i + SIZE_X < PROB_SIZE) {
  675. #if IDX_BEGINS_WITH_ZERO
  676. ja[k] = i + SIZE_X;
  677. #else
  678. ja[k] = i + 1 + SIZE_X;
  679. #endif
  680. a[k] = -.5 * (c2 + c3);
  681. ++k;
  682. }
  683. for (; k < NZMAX; ++k) {
  684. ja[k] = -1;
  685. a[k] = 0.0;
  686. }
  687. *b = 0.5 * (sin((double)i) + 1.0);
  688. return 0;
  689. }
  690. else {
  691. perror("genmat");
  692. return 1;
  693. }
  694. }
  695. #undef SIZE_X
  696. #undef SIZE_Y
  697. #undef PROB_SIZE
  698. #undef MAX_NZERO
  699. #undef RESMAX
  700. /************** yosen5 *************/
  701. /*
  702. * 1-dimensional Poisson Equation with Dirichlet Condition
  703. *
  704. *
  705. */
  706. /* #define SIZE_X 524287 */
  707. #define SIZE_X 16383
  708. #define PROB_SIZE (SIZE_X)
  709. #define MAX_NZERO 3
  710. #define RESMAX 1e-5
  711. static int
  712. yosen5(i, ja, a, b)
  713. int i, *ja;
  714. double *a, *b;
  715. {
  716. double inv_h = (double)(SIZE_X + 1) * (double)(SIZE_X + 1);
  717. double d0 = 2.0 * inv_h;
  718. double d1 = -1.0 * inv_h;
  719. if (i == -1) {
  720. ja[0] = PROB_SIZE;
  721. ja[1] = PROB_SIZE + 2 * (PROB_SIZE - 1);
  722. ja[2] = MAX_NZERO;
  723. *b = RESMAX;
  724. return 0;
  725. }
  726. else if (i >= 0 && i < PROB_SIZE) {
  727. int k = 0;
  728. if (i - 1 >= 0) {
  729. #if IDX_BEGINS_WITH_ZERO
  730. ja[k] = i - 1;
  731. #else
  732. ja[k] = i;
  733. #endif
  734. a[k] = d1;
  735. ++k;
  736. }
  737. #if IDX_BEGINS_WITH_ZERO
  738. ja[k] = i;
  739. #else
  740. ja[k] = i + 1;
  741. #endif
  742. a[k] = d0;
  743. ++k;
  744. if (i + 1 < PROB_SIZE) {
  745. #if IDX_BEGINS_WITH_ZERO
  746. ja[k] = i + 1;
  747. #else
  748. ja[k] = i + 2;
  749. #endif
  750. a[k] = d1;
  751. ++k;
  752. }
  753. for (; k < NZMAX; ++k) {
  754. ja[k] = -1;
  755. a[k] = 0.0;
  756. }
  757. *b = 0.5 * (sin((double)i) + 1.0);
  758. return 0;
  759. }
  760. else {
  761. perror("yosen5");
  762. return 1;
  763. }
  764. }
  765. #undef SIZE_X
  766. #undef PROB_SIZE
  767. #undef MAX_NZERO
  768. #undef RESMAX