CAMLprim value sunml_nvec_par_n_vwrmsnormmask(value vx, value vw, value vid)
{
    CAMLparam3(vx, vw, vid);
    realtype r = N_VWrmsNormMask_Parallel(NVEC_VAL(vx), NVEC_VAL(vw),
					  NVEC_VAL(vid));
    CAMLreturn(caml_copy_double(r));
}
CAMLprim value sunml_lsolver_lapack_band(value vnvec, value vbmat)
{
    CAMLparam2(vnvec, vbmat);
#if SUNDIALS_LIB_VERSION >= 300 && defined SUNDIALS_ML_LAPACK
    SUNMatrix bmat = MAT_VAL(vbmat);
    SUNLinearSolver ls = SUNLapackBand(NVEC_VAL(vnvec), bmat);

    if (ls == NULL) {
	if (SUNBandMatrix_Rows(bmat) != SUNBandMatrix_Columns(bmat))
	    caml_raise_constant(LSOLVER_EXN(MatrixNotSquare));

	if (SUNBandMatrix_StoredUpperBandwidth(bmat) <
	    SUNMIN(SUNBandMatrix_Rows(bmat) - 1,
		   SUNBandMatrix_LowerBandwidth(bmat)
		   + SUNBandMatrix_UpperBandwidth(bmat)))
	    caml_raise_constant(LSOLVER_EXN(InsufficientStorageUpperBandwidth));

	if (SUNBandMatrix_Rows(bmat) != NV_LENGTH_S(NVEC_VAL(vnvec)))
	    caml_raise_constant(LSOLVER_EXN(MatrixVectorMismatch));

	caml_raise_out_of_memory();
    }

    CAMLreturn(alloc_lsolver(ls));
#else
    CAMLreturn(Val_unit);
#endif
}
CAMLprim value sunml_nvec_par_n_vconstrmask(value vc, value vx, value vm)
{
    CAMLparam3(vc, vx, vm);
    booleantype r = N_VConstrMask_Parallel(NVEC_VAL(vc), NVEC_VAL(vx),
					   NVEC_VAL(vm));
    CAMLreturn(Val_bool(r));
}
CAMLprim value sunml_nvec_par_n_vlinearsum(value va, value vx, value vb, value vy,
					value vz)
{
    CAMLparam5(va, vx, vb, vy, vz);
    N_VLinearSum_Parallel(Double_val(va), NVEC_VAL(vx), Double_val(vb),
			  NVEC_VAL(vy), NVEC_VAL(vz));
    CAMLreturn (Val_unit);
}
CAMLprim value sunml_lsolver_call_atimes(value vcptr, value vv, value vz)
{
    CAMLparam3(vcptr, vv, vz);
    int r;

    r = ATIMES_WITH_DATA(vcptr)->atimes_func(
	    ATIMES_WITH_DATA(vcptr)->atimes_data, NVEC_VAL(vv), NVEC_VAL(vz));
    if (r != 0)
	caml_raise_with_arg(LSOLVER_EXN(ATimesFailure), Val_bool(r > 0));

    CAMLreturn(Val_unit);
}
CAMLprim value sunml_spils_classical_gs(value vargs)
{
    CAMLparam1(vargs);
    CAMLlocal3(vv, vh, vs);

    int k = Int_val(Field(vargs, 2));
    int p = Int_val(Field(vargs, 3));
    N_Vector temp = NVEC_VAL(Field(vargs, 4));
    int i;
    int i0 = SUNMAX(k-p, 0);
    realtype new_vk_norm;
    N_Vector* v;

    vv = Field(vargs, 0);
    vh = Field(vargs, 1);
    vs = Field(vargs, 5);

#if SUNDIALS_ML_SAFE == 1
    struct caml_ba_array *bh = ARRAY2_DATA(vh);
    intnat hn = bh->dim[0];
    intnat hm = bh->dim[1];

    if (hn < k + 1)
	caml_invalid_argument("classical_gs: h is too small (< k + 1).");
    if (hm < k)
	caml_invalid_argument("classical_gs: h is too small (< k).");

    if (Wosize_val (vv) < k + 1)
	caml_invalid_argument("classical_gs: v is too small (< k + 1).");
    if (ARRAY1_LEN(vs) < k)
	caml_invalid_argument("classical_gs: s is too small (< k).");
#endif

    v = calloc(p + 1, sizeof(N_Vector));

    if (v == NULL) caml_raise_out_of_memory();

    for (i = i0; i <= k; ++i)
	v[i] = NVEC_VAL(Field(vv, i));

    ClassicalGS(v, ARRAY2_ACOLS(vh), k, p, &new_vk_norm,
	        temp, REAL_ARRAY(vs));

    free(v);

    CAMLreturn(caml_copy_double(new_vk_norm));
}
CAMLprim value sunml_lsolver_call_psolve(value vcptr, value vr, value vz,
				         value vtol, value vlr)
{
    CAMLparam5(vcptr, vr, vz, vtol, vlr);
    int r;
    PSolveFn psolve = PRECOND_WITH_DATA(vcptr)->psolve_func;

    if (psolve != NULL) {
	r = psolve(PRECOND_WITH_DATA(vcptr)->precond_data,
		   NVEC_VAL(vr),
		   NVEC_VAL(vz),
		   Double_val(vtol),
		   Bool_val(vlr) ? 1 : 2);
	if (r != 0)
	    caml_raise_with_arg(LSOLVER_EXN(PSolveFailure), Val_bool(r > 0));
    }

    CAMLreturn(Val_unit);
}
CAMLprim value sunml_lsolver_pcg(value vmaxl, value vnvec)
{
    CAMLparam2(vmaxl, vnvec);
#if SUNDIALS_LIB_VERSION >= 300
    SUNLinearSolver ls = SUNPCG(NVEC_VAL(vnvec), PREC_NONE, Int_val(vmaxl));
    if (ls == NULL) caml_raise_out_of_memory();

    CAMLreturn(alloc_lsolver(ls));
#else
    CAMLreturn(Val_unit);
#endif
}
CAMLprim value sunml_lsolver_dense(value vnvec, value vdmat)
{
    CAMLparam2(vnvec, vdmat);
#if SUNDIALS_LIB_VERSION >= 300
    SUNMatrix dmat = MAT_VAL(vdmat);
    SUNLinearSolver ls = SUNDenseLinearSolver(NVEC_VAL(vnvec), dmat);

    if (ls == NULL) {
	if (SUNDenseMatrix_Rows(dmat) != SUNDenseMatrix_Columns(dmat))
	    caml_raise_constant(LSOLVER_EXN(MatrixNotSquare));

	if (SUNDenseMatrix_Rows(dmat) != NV_LENGTH_S(NVEC_VAL(vnvec)))
	    caml_raise_constant(LSOLVER_EXN(MatrixVectorMismatch));

	caml_raise_out_of_memory();
    }

    CAMLreturn(alloc_lsolver(ls));
#else
    CAMLreturn(Val_unit);
#endif
}
CAMLprim value sunml_lsolver_klu(value vnvec, value vsmat)
{
    CAMLparam2(vnvec, vsmat);
#if SUNDIALS_LIB_VERSION >= 300 && defined SUNDIALS_ML_KLU
    SUNMatrix smat = MAT_VAL(vsmat);
    SUNLinearSolver ls = SUNKLU(NVEC_VAL(vnvec), smat);

    if (ls == NULL) {
	if (SUNSparseMatrix_Rows(smat) != SUNSparseMatrix_Columns(smat))
	    caml_raise_constant(LSOLVER_EXN(MatrixNotSquare));

	if (SUNBandMatrix_Rows(smat) != NV_LENGTH_S(NVEC_VAL(vnvec)))
	    caml_raise_constant(LSOLVER_EXN(MatrixVectorMismatch));

	caml_raise_out_of_memory();
    }

    CAMLreturn(alloc_lsolver(ls));
#else
    CAMLreturn(Val_unit);
#endif
}
static N_Vector callml_custom_resid(SUNLinearSolver ls)
{
    CAMLparam0();
    CAMLlocal1(r);

    r = caml_callback_exn(GET_OP(ls, GET_RES_ID), Val_unit);
    if (Is_exception_result (r)) {
	sunml_warn_discarded_exn (Extract_exception (r),
					"user-defined res id handler");
	CAMLreturnT(N_Vector, NULL);
    }

    CAMLreturnT(N_Vector, NVEC_VAL(r));
}
CAMLprim value sunml_nvec_par_n_vspace(value vx)
{
    CAMLparam1(vx);
    CAMLlocal1(r);
    sundials_ml_index lrw, liw;

    N_VSpace_Parallel(NVEC_VAL(vx), &lrw, &liw);

    r = caml_alloc_tuple(2);
    Store_field(r, 0, Val_index(lrw));
    Store_field(r, 1, Val_index(liw));

    CAMLreturn(r);
}
CAMLprim value sunml_spils_modified_gs(value vv, value vh, value vk, value vp)
{
    CAMLparam4(vv, vh, vk, vp);

    int p = Int_val(vp);
    int k = Int_val(vk);
    int i;
    int i0 = SUNMAX(k-p, 0);
    realtype new_vk_norm;
    N_Vector* v;

#if SUNDIALS_ML_SAFE == 1
    struct caml_ba_array *bh = ARRAY2_DATA(vh);
    intnat hn = bh->dim[0];
    intnat hm = bh->dim[1];

    if (hn < k + 1)
	caml_invalid_argument("modified_gs: h is too small (dim1 < k + 1).");
    if (hm < k)
	caml_invalid_argument("modified_gs: h is too small (dim2 < k).");
    if (Wosize_val (vv) < k + 1)
	caml_invalid_argument("modified_gs: v is too small (< k + 1).");
#endif

    v = calloc(k + 1, sizeof(N_Vector));

    if (v == NULL) caml_raise_out_of_memory();

    for (i = i0; i <= k; ++i)
	v[i] = NVEC_VAL(Field(vv, i));

    ModifiedGS(v, ARRAY2_ACOLS(vh), k, p, &new_vk_norm);

    free(v);

    CAMLreturn(caml_copy_double(new_vk_norm));
}
CAMLprim value sunml_nvec_par_n_vconst(value vc, value vz)
{
    CAMLparam2(vc, vz);
    N_VConst_Parallel(Double_val(vc), NVEC_VAL(vz));
    CAMLreturn (Val_unit);
}
CAMLprim value sunml_nvec_par_n_vminquotient(value vnum, value vdenom)
{
    CAMLparam2(vnum, vdenom);
    realtype r = N_VMinQuotient_Parallel(NVEC_VAL(vnum), NVEC_VAL(vdenom));
    CAMLreturn(caml_copy_double(r));
}
CAMLprim value sunml_nvec_par_n_vcompare(value vc, value vx, value vz)
{
    CAMLparam3(vc, vx, vz);
    N_VCompare_Parallel(Double_val(vc), NVEC_VAL(vx), NVEC_VAL(vz));
    CAMLreturn (Val_unit);
}
CAMLprim value sunml_nvec_par_n_vinvtest(value vx, value vz)
{
    CAMLparam2(vx, vz);
    booleantype r = N_VInvTest_Parallel(NVEC_VAL(vx), NVEC_VAL(vz));
    CAMLreturn(Val_bool(r));
}
CAMLprim value sunml_nvec_par_n_vwl2norm(value vx, value vw)
{
    CAMLparam2(vx, vw);
    realtype r = N_VWL2Norm_Parallel(NVEC_VAL(vx), NVEC_VAL(vw));
    CAMLreturn(caml_copy_double(r));
}
CAMLprim value sunml_nvec_par_n_vl1norm(value vx)
{
    CAMLparam1(vx);
    realtype r = N_VL1Norm_Parallel(NVEC_VAL(vx));
    CAMLreturn(caml_copy_double(r));
}
CAMLprim value sunml_nvec_par_n_vdotprod(value vx, value vy)
{
    CAMLparam2(vx, vy);
    realtype r = N_VDotProd_Parallel(NVEC_VAL(vx), NVEC_VAL(vy));
    CAMLreturn(caml_copy_double(r));
}
Esempio n. 21
0
CAMLprim value ml_nvec_par_n_vprod(value vx, value vy, value vz)
{
    CAMLparam3(vx, vy, vz);
    N_VProd_Parallel(NVEC_VAL(vx), NVEC_VAL(vy), NVEC_VAL(vz));
    CAMLreturn (Val_unit);
}
CAMLprim value sunml_nvec_par_n_vaddconst(value vx, value vb, value vz)
{
    CAMLparam3(vx, vb, vz);
    N_VAddConst_Parallel(NVEC_VAL(vx), Double_val(vb), NVEC_VAL(vz));
    CAMLreturn (Val_unit);
}
CAMLprim value sunml_nvec_par_n_vinv(value vx, value vz)
{
    CAMLparam2(vx, vz);
    N_VInv_Parallel(NVEC_VAL(vx), NVEC_VAL(vz));
    CAMLreturn (Val_unit);
}
CAMLprim value sunml_nvec_par_n_vdiv(value vx, value vy, value vz)
{
    CAMLparam3(vx, vy, vz);
    N_VDiv_Parallel(NVEC_VAL(vx), NVEC_VAL(vy), NVEC_VAL(vz));
    CAMLreturn (Val_unit);
}
Esempio n. 25
0
CAMLprim value ml_nvec_par_n_vabs(value vx, value vz)
{
    CAMLparam2(vx, vz);
    N_VAbs_Parallel(NVEC_VAL(vx), NVEC_VAL(vz));
    CAMLreturn (Val_unit);
}
Esempio n. 26
0
CAMLprim value ml_nvec_par_n_vmin(value vx)
{
    CAMLparam1(vx);
    realtype r = N_VMin_Parallel(NVEC_VAL(vx));
    CAMLreturn(caml_copy_double(r));
}