/* nag_sort_realvec_vec_search (m01ndc) Example Program.
*
* Copyright 2024 Numerical Algorithms Group.
*
* Mark 30.2, 2024.
*/
#include <nag.h>
#include <stdio.h>
static int ex1(double *rv, Integer n, Integer m1, Integer m2, double *item,
Integer m);
static int ex2(double *rv, Integer n, Integer m1, Integer m2, double *item,
Integer m);
int main(void) {
/* Scalars */
Integer exit_status = 0;
Integer exit_status_ex1 = 0;
Integer exit_status_ex2 = 0;
Integer i, n, m1, m2, m;
/* Arrays */
double *item = 0, *rv = 0;
printf("nag_sort_realvec_vec_search (m01ndc) Example Program Results\n");
printf("\n");
/* Read dimensions of arrays from data file */
scanf("%*[^\n] ");
scanf("%" NAG_IFMT "%" NAG_IFMT "%" NAG_IFMT "%*[^\n]", &n, &m1, &m2);
scanf("%" NAG_IFMT "%*[^\n]", &m);
/* Allocate arrays accordingly */
if (!(rv = NAG_ALLOC((n), double)) || !(item = NAG_ALLOC((m), double))) {
printf("Allocation failure\n");
exit_status = -1;
goto END;
}
/* Read array values from data file */
for (i = 0; i < n; i++) {
scanf("%lf", &rv[i]);
}
scanf("%*[^\n]");
printf("Vector to be searched is:\n");
for (i = 0; i < n; i++)
printf("%7.1f%s", rv[i], (i + 1) % 8 ? " " : "\n");
for (i = 0; i < m; i++) {
scanf("%lf", &item[i]);
}
scanf("%*[^\n]");
exit_status_ex1 = ex1(rv, n, m1, m2, item, m);
exit_status_ex2 = ex2(rv, n, m1, m2, item, m);
END:
NAG_FREE(rv);
NAG_FREE(item);
return (exit_status == 0 && exit_status_ex1 == 0 && exit_status_ex2 == 0) ? 0
: 1;
}
/* Example 1: Calling nag_sort_realvec_vec_search with mode=4 */
static int ex1(double *rv, Integer n, Integer m1, Integer m2, double *item,
Integer m) {
/* Logicals */
Nag_Boolean validate;
/* Scalars */
Integer exit_status = 0;
Integer i, mode, lk;
double h = 0;
/* Arrays */
Integer *idx = 0, *k = 0;
/* Nag Types */
NagError fail;
INIT_FAIL(fail);
/* First call nag_sort_realvec_vec_search with mode=0 and to calculate */
/* the necessary values for h and lk */
mode = 0;
lk = 0;
if (!(idx = NAG_ALLOC((m), Integer))) {
printf("Allocation failure\n");
exit_status = -1;
goto END;
}
/* Validate input parameters the first time */
/* nag_sort_realvec_vec_search is called */
validate = Nag_TRUE;
/* nag_sort_realvec_vec_search (m01ndc) */
/* Search in a set of real numbers using an O(1) method */
nag_sort_realvec_vec_search(validate, mode, rv, n, m1, m2, item, m, idx, &h,
k, &lk, &fail);
if (fail.code != NE_NOERROR) {
printf("Error from nag_sort_realvec_vec_search (m01ndc).\n%s\n",
fail.message);
exit_status = 1;
goto END;
}
/* Allocate k using the value of lk returned in the previous call */
if (!(k = NAG_ALLOC((lk), Integer))) {
printf("Allocation failure\n");
exit_status = -2;
goto END;
}
/* There is no need to validate input parameters again */
validate = Nag_FALSE;
/* Call nag_sort_realvec_vec_search with mode=4 to populate k and to */
/* search rv. */
mode = 4;
/* nag_sort_realvec_vec_search (m01ndc), see above */
nag_sort_realvec_vec_search(validate, mode, rv, n, m1, m2, item, m, idx, &h,
k, &lk, &fail);
if (fail.code != NE_NOERROR) {
printf("Error from nag_sort_realvec_vec_search (m01ndc).\n%s\n",
fail.message);
exit_status = 2;
goto END;
}
printf("\n\nExample 1\n\n");
for (i = 0; i < m; i++) {
printf(" Search for item %7.1f returned index: %4" NAG_IFMT "\n", item[i],
idx[i]);
}
END:
NAG_FREE(k);
NAG_FREE(idx);
return exit_status;
}
/* Example 2: Calling nag_sort_realvec_vec_search with mode=3 */
static int ex2(double *rv, Integer n, Integer m1, Integer m2, double *item,
Integer m) {
/* Logicals */
Nag_Boolean validate;
/* Scalars */
Integer exit_status = 0;
Integer i, mode, lk;
double h = 0;
/* Arrays */
Integer *idx = 0, *k = 0;
/* Nag Types */
NagError fail;
INIT_FAIL(fail);
if (!(idx = NAG_ALLOC((m), Integer))) {
printf("Allocation failure\n");
exit_status = -1;
goto END;
}
/* Validate input parameters */
validate = Nag_TRUE;
/* Mode 3 does not use h or k, so k does not need to be allocated */
mode = 3;
h = 0.0;
lk = 0;
/* Make a single call to nag_sort_realvec_vec_search to search rv for */
/* the items without using h or k */
/* nag_sort_realvec_vec_search (m01ndc) */
/* Search in a set of real numbers */
nag_sort_realvec_vec_search(validate, mode, rv, n, m1, m2, item, m, idx, &h,
k, &lk, &fail);
if (fail.code != NE_NOERROR) {
printf("Error from nag_sort_realvec_vec_search (m01ndc).\n%s\n",
fail.message);
exit_status = 1;
goto END;
}
printf("\n\nExample 2\n\n");
for (i = 0; i < m; i++) {
printf(" Search for item %7.1f returned index: %4" NAG_IFMT "\n", item[i],
idx[i]);
}
END:
NAG_FREE(idx);
return exit_status;
}