void FC_FUNC_(huti_c_bicgstab_2, HUTI_C_BICGSTAB_2) ( void *xvec, void *rhsvec, int *ipar, double *dpar, void *work, void (*matvecsubr)(), void (*pcondlsubr)(), void (*pcondrsubr)(), void (*dotprodfun)(), void (*normfun)(), void (*mstopfun)() ) { HUTI_Init(); if (pcondrsubr == NULL) pcondrsubr = FC_FUNC_(huti_cdummy_pcondfun, HUTI_CDUMMY_PCONDFUN); if (pcondlsubr == NULL) pcondlsubr = FC_FUNC_(huti_cdummy_pcondfun, HUTI_CDUMMY_PCONDFUN); if (dotprodfun == NULL) dotprodfun = FC_FUNC(cdotu,CDOTU); if (normfun == NULL) normfun = FC_FUNC(scnrm2,SCNRM2); FC_FUNC_(huti_cbicgstab_2solv, HUTI_CBICGSTAB_2SOLV) ( &HUTI_NDIM, &HUTI_WRKDIM, xvec, rhsvec, ipar, dpar, work, matvecsubr, pcondlsubr, pcondrsubr, dotprodfun, normfun, mstopfun ); return; }
void FC_FUNC_(huti_c_gmres, HUTI_C_GMRES) ( void *xvec, void *rhsvec, int *ipar, double *dpar, void *work, void (*matvecsubr)(), void (*pcondlsubr)(), void (*pcondrsubr)(), void (*dotprodfun)(), void (*normfun)(), void (*mstopfun)() ) { HUTI_Init(); if (pcondrsubr == NULL) pcondrsubr = FC_FUNC_(huti_cdummy_pcondfun, HUTI_CDUMMY_PCONDFUN); if (pcondlsubr == NULL) pcondlsubr = FC_FUNC_(huti_cdummy_pcondfun, HUTI_CDUMMY_PCONDFUN); if (dotprodfun == NULL) dotprodfun = FC_FUNC(cdotc,CDOTC); if (normfun == NULL) normfun = FC_FUNC(scnrm2,SCNRM2); FC_FUNC_(huti_cgmressolv, HUTI_CGMRESSOLV) ( &HUTI_NDIM, &HUTI_WRKDIM, xvec, rhsvec, ipar, dpar, work, matvecsubr, pcondlsubr, pcondrsubr, dotprodfun, normfun, mstopfun ); return; }
/* --------------------- Interface to Fortran ---------------------- */ double FC_FUNC_(c_poisson_cutoff_2d_1d, C_POISSON_CUTOFF_2D_1D) (double *gy, double *gx, double *rc) { double result, error, res, b; struct parameters_2d_1d params; const size_t wrk_size = 5000; const double epsilon_abs = 1e-3; const double epsilon_rel = 1e-3; double mu; gsl_integration_workspace * ws = gsl_integration_workspace_alloc (wrk_size); gsl_function F; mu = 0.1/(*gx); b = fabs((*gx))/2.0; params.gx = *gx; params.gy = *gy; params.rc = *rc; F.function = &cutoff_2d_1d; F.params = ¶ms; res = -4.0 * FC_FUNC(intcoslog, INTCOSLOG)(&mu, gy, &b); if( fabs(*gy) > 0.0) { res = res - (4.0 * M_EULER_MASCHERONI / (*gy)) * sin( (*gy)*mu ); }else{ res = res - 4.0 * M_EULER_MASCHERONI * mu; } gsl_integration_qag(&F, mu, (*rc), epsilon_abs, epsilon_rel, wrk_size, 3, ws, &result, &error); res = res + result; gsl_integration_workspace_free (ws); return res; }