void FNV_INITOMP(int *code, long int *N, int *num_threads, int *ier) { *ier = 0; switch(*code) { case FCMIX_CVODE: F2C_CVODE_vec = NULL; F2C_CVODE_vec = N_VNewEmpty_OpenMP(*N, *num_threads); if (F2C_CVODE_vec == NULL) *ier = -1; break; case FCMIX_IDA: F2C_IDA_vec = NULL; F2C_IDA_vec = N_VNewEmpty_OpenMP(*N, *num_threads); if (F2C_IDA_vec == NULL) *ier = -1; break; case FCMIX_KINSOL: F2C_KINSOL_vec = NULL; F2C_KINSOL_vec = N_VNewEmpty_OpenMP(*N, *num_threads); if (F2C_KINSOL_vec == NULL) *ier = -1; break; case FCMIX_ARKODE: F2C_ARKODE_vec = NULL; F2C_ARKODE_vec = N_VNewEmpty_OpenMP(*N, *num_threads); if (F2C_ARKODE_vec == NULL) *ier = -1; break; default: *ier = -1; } }
N_Vector N_VNew_OpenMP(long int length, int num_threads) { N_Vector v; realtype *data; v = NULL; v = N_VNewEmpty_OpenMP(length, num_threads); if (v == NULL) return(NULL); /* Create data */ if (length > 0) { /* Allocate memory */ data = NULL; data = (realtype *) malloc(length * sizeof(realtype)); if(data == NULL) { N_VDestroy_OpenMP(v); return(NULL); } /* Attach data */ NV_OWN_DATA_OMP(v) = TRUE; NV_DATA_OMP(v) = data; } return(v); }
N_Vector N_VMake_OpenMP(long int length, realtype *v_data, int num_threads) { N_Vector v; v = NULL; v = N_VNewEmpty_OpenMP(length, num_threads); if (v == NULL) return(NULL); if (length > 0) { /* Attach data */ NV_OWN_DATA_OMP(v) = FALSE; NV_DATA_OMP(v) = v_data; } return(v); }
/* ---------------------------------------------------------------------- * Main NVector Testing Routine * --------------------------------------------------------------------*/ int main(int argc, char *argv[]) { int fails = 0; /* counter for test failures */ long int veclen; /* vector length */ N_Vector W, X, Y, Z; /* test vectors */ int num_threads; int print_timing; /* check input and set vector length */ if (argc < 4){ printf("ERROR: THREE (3) arguments required: <vector length> <number of threads> <print timing>\n"); return(-1); } veclen = atol(argv[1]); if (veclen <= 0) { printf("ERROR: length of vector must be a positive integer \n"); return(-1); } num_threads = atoi(argv[2]); if (num_threads <= 0) { printf("ERROR: numbber of threads must be a positive integer \n"); return(-1); } print_timing = atoi(argv[3]); SetTiming(print_timing); printf("\nRunning with vector length %ld \n \n", veclen); printf("\nRunning with number of threads %d \n \n", num_threads); /* Create vectors */ W = N_VNewEmpty_OpenMP(veclen, num_threads); X = N_VNew_OpenMP(veclen, num_threads); Y = N_VNew_OpenMP(veclen, num_threads); Z = N_VNew_OpenMP(veclen, num_threads); /* NVector Tests */ fails += Test_N_VSetArrayPointer(W, veclen, 0); fails += Test_N_VGetArrayPointer(X, veclen, 0); fails += Test_N_VLinearSum(X, Y, Z, veclen, 0); fails += Test_N_VConst(X, veclen, 0); fails += Test_N_VProd(X, Y, Z, veclen, 0); fails += Test_N_VDiv(X, Y, Z, veclen, 0); fails += Test_N_VScale(X, Z, veclen, 0); fails += Test_N_VAbs(X, Z, veclen, 0); fails += Test_N_VInv(X, Z, veclen, 0); fails += Test_N_VAddConst(X, Z, veclen, 0); fails += Test_N_VDotProd(X, Y, veclen, veclen, 0); fails += Test_N_VMaxNorm(X, veclen, 0); fails += Test_N_VWrmsNorm(X, Y, veclen, 0); fails += Test_N_VWrmsNormMask(X, Y, Z, veclen, veclen, 0); fails += Test_N_VMin(X, veclen, 0); fails += Test_N_VWL2Norm(X, Y, veclen, veclen, 0); fails += Test_N_VL1Norm(X, veclen, veclen, 0); fails += Test_N_VCompare(X, Z, veclen, 0); fails += Test_N_VInvTest(X, Z, veclen, 0); fails += Test_N_VConstrMask(X, Y, Z, veclen, 0); fails += Test_N_VMinQuotient(X, Y, veclen, 0); fails += Test_N_VCloneVectorArray(5, X, veclen, 0); fails += Test_N_VCloneEmptyVectorArray(5, X, 0); fails += Test_N_VCloneEmpty(X, 0); fails += Test_N_VClone(X, veclen, 0); /* Free vectors */ N_VDestroy_OpenMP(W); N_VDestroy_OpenMP(X); N_VDestroy_OpenMP(Y); N_VDestroy_OpenMP(Z); /* Print results */ if (fails) { printf("FAIL: NVector module failed %i tests \n \n", fails); } else { printf("SUCCESS: NVector module passed all tests \n \n"); } return(0); }