HYPRE_Int HYPRE_SStructSplitDestroy( HYPRE_SStructSolver solver ) { hypre_SStructVector *y; HYPRE_Int nparts; HYPRE_Int *nvars; void ****smatvec_data; HYPRE_Int (***ssolver_solve)(); HYPRE_Int (***ssolver_destroy)(); void ***ssolver_data; HYPRE_Int (*sdestroy)(); void *sdata; HYPRE_Int part, vi, vj; if (solver) { y = (solver -> y); nparts = (solver -> nparts); nvars = (solver -> nvars); smatvec_data = (solver -> smatvec_data); ssolver_solve = (solver -> ssolver_solve); ssolver_destroy = (solver -> ssolver_destroy); ssolver_data = (solver -> ssolver_data); HYPRE_SStructVectorDestroy(y); for (part = 0; part < nparts; part++) { for (vi = 0; vi < nvars[part]; vi++) { for (vj = 0; vj < nvars[part]; vj++) { if (smatvec_data[part][vi][vj] != NULL) { hypre_StructMatvecDestroy(smatvec_data[part][vi][vj]); } } hypre_TFree(smatvec_data[part][vi]); sdestroy = ssolver_destroy[part][vi]; sdata = ssolver_data[part][vi]; sdestroy(sdata); } hypre_TFree(smatvec_data[part]); hypre_TFree(ssolver_solve[part]); hypre_TFree(ssolver_destroy[part]); hypre_TFree(ssolver_data[part]); } hypre_TFree(nvars); hypre_TFree(smatvec_data); hypre_TFree(ssolver_solve); hypre_TFree(ssolver_destroy); hypre_TFree(ssolver_data); hypre_SStructMatvecDestroy(solver -> matvec_data); hypre_TFree(solver); } return hypre_error_flag; }
HYPRE_Int hypre_SStructMatvec( HYPRE_Complex alpha, hypre_SStructMatrix *A, hypre_SStructVector *x, HYPRE_Complex beta, hypre_SStructVector *y ) { void *matvec_data; hypre_SStructMatvecCreate(&matvec_data); hypre_SStructMatvecSetup(matvec_data, A, x); hypre_SStructMatvecCompute(matvec_data, alpha, A, x, beta, y); hypre_SStructMatvecDestroy(matvec_data); return hypre_error_flag; }