Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
df2f519
Begin adding the ability to specify bias of the solution in fem_poiss…
manauref Nov 10, 2025
20cbfa8
Add infra in fem_poisson_perp to bias a line in the domain, for now r…
manauref Nov 11, 2025
eb6ed85
Add accepted results for 2x fem_poisson_perp tests with bias.
manauref Nov 11, 2025
8288a78
Add 3x tests of biasing in fem_poisson_perp. Need to test on GPUs next.
manauref Nov 11, 2025
08f5414
Small edits in fem_poisson biasing code
manauref Nov 11, 2025
3c425e9
Modify fem_poisson_perp device code to make the biasing work on GPUs.…
manauref Nov 11, 2025
3ff3ad1
Modify all IWL reg tests to use new interface for specifying biasing.…
manauref Nov 11, 2025
59e416e
Fix LBO energy conservation in 1x and 2x. Two things were wrong here:…
manauref Nov 13, 2025
48202cc
Add qprofile to gk_geometry so we can extract q profiles from numeric…
manauref Nov 20, 2025
2722fb4
Rename function for clarity
manauref Nov 20, 2025
f82fd64
Improve the determination of the index of the cell that holds the bia…
manauref Nov 23, 2025
699529d
Experiment with a new workflow for the IWL field solve. Namely: a) Af…
manauref Nov 24, 2025
36c4129
Fix logic in gk_field and apply similar changes in fem_parproj_cu to …
manauref Nov 24, 2025
857319a
Add IWL q profile calculation
akashukla Nov 24, 2025
cd4ebce
Use bc_basic to fill the ghost cell in the sol, which is used by fem_…
manauref Nov 24, 2025
57ff907
Change fem_parproj src dirichlet kernel for the case where dirichlet …
manauref Dec 13, 2025
cac6f4b
Merge branch 'poisson_perp_bias-new_IWL_field_solve' of https://githu…
manauref Dec 13, 2025
fec91e6
Fix error in unit test. Now all dirichlet fem_parproj tests pass on GPU.
manauref Dec 13, 2025
fb0c526
Fix some program flow in new IWL field solver; we were filling the gh…
manauref Dec 19, 2025
c24747d
Apply TS BC to phi at the upper core boundary instead, because why no…
manauref Dec 19, 2025
f41502a
Replace some sqrt(3.0) by its float in bc_basic_gyrokinetic.
manauref Dec 22, 2025
8df4757
Meant to push previous commit to another branch with message: Hacky b…
manauref Dec 23, 2025
796143d
Found bug in fem_poisson_perp biasing that affected z-slabs other tha…
manauref Dec 23, 2025
2f764d1
Remove debugging prints, and restore post-poisson_perp steps in gk_fi…
manauref Dec 23, 2025
76e6536
Restore fem_poisson_perp unit test.
manauref Dec 23, 2025
eed7f3c
Adapt fem_parproj so the Dirichlet value can be given from the skin o…
manauref Dec 26, 2025
e94fab9
Merge branch 'poisson_perp_bias-new_IWL_field_solve' of https://githu…
manauref Dec 26, 2025
dc8005d
Fixes to device code given recent changes in fem_parproj. Unit tests …
manauref Dec 27, 2025
534a10a
Clean up gk_field. Locally the d3d reg test is throwing a really conf…
manauref Dec 27, 2025
65eddaf
Fix size of buffer used in gk_field for applying BCs on phi at the up…
manauref Dec 28, 2025
0b1edb6
Merge branch 'poisson_perp_bias-new_IWL_field_solve' into poisson_per…
manauref Jan 6, 2026
d529573
Merge main -> poisson_perp_bias
manauref Jan 7, 2026
a14b44e
Turns out compute-sanitizer can come out clean when there are still m…
manauref Jan 7, 2026
dea3141
Remove writing bmag_inv to file from unit tests.
manauref Jan 7, 2026
3218ca7
Fix BC setting in unit test.
manauref Jan 7, 2026
a23a3ea
Move the creation of fem_parproj_core and fem_parproj_sol to the func…
manauref Jan 7, 2026
26ce3be
Minor mods.
manauref Jan 7, 2026
078d8f5
Alignment change
manauref Jan 7, 2026
c442a2c
Add a couple of comments.
manauref Jan 7, 2026
50aa035
Fix use of wrong range. Must have happened during main merge.
manauref Jan 7, 2026
aadc9a7
Move the new ranges created in gk_field for IWL BCs to the gyrokineti…
manauref Jan 12, 2026
0038059
Rename fem_parproj function pointers in gk_field so they are more pre…
manauref Jan 15, 2026
8fee1f5
Use the correct smoothing option for the charge density in 2x IWL
manauref Jan 16, 2026
4729a0a
Merge branch 'main' into poisson_perp_bias
manauref Feb 10, 2026
c3f0fc9
Change left over enum specification in unit test.
manauref Feb 10, 2026
63cf001
Merge branch 'main' into poisson_perp_bias
manauref Feb 28, 2026
ce90494
Fix normalization issue in fdot_multiplier. Add a _reset method allow…
manauref Mar 4, 2026
48500e5
New fem_poisson_perp LHS kernels intended to let us update the entrie…
manauref Mar 15, 2026
7697e06
Cast void pointer in fem_poisson_perp lhs kernels so C++ compiler doe…
manauref Mar 16, 2026
faf290d
Add GKYL_LONG option to gkyl_array type. Modify cudss and fem_poisson…
manauref Mar 17, 2026
3383336
Change superLU solver so we can reuse the column permutation vector, …
manauref Mar 17, 2026
1e2540f
Modify how we set the values in the RHS matrix B in SuperLU so that w…
manauref Mar 18, 2026
56bddcc
Fix error in unit test and mem management in superlu when solving aft…
manauref Mar 19, 2026
ad2bc1d
Fix memory error mentioned in earlier commits where one of the unit t…
manauref Mar 19, 2026
f9e6261
Optimize memory use in SuperLU's dgssvx by allocating the work array …
manauref Mar 19, 2026
06d6639
Merge main -> poisson_perp_bias
manauref Mar 20, 2026
5734c39
Merge fem_poisson_perp_bias -> fem_poisson_update-prototyping.
manauref Mar 20, 2026
b52bdfe
Merge branch 'poisson_perp_bias' into fem_poisson_update-prototyping-…
manauref Mar 20, 2026
fdabef9
Merge branch 'main' into poisson_perp_bias
manauref Mar 20, 2026
376244e
Merge branch 'main' into fem_poisson_update-prototyping-fem_poisson_p…
manauref Mar 20, 2026
2511dcb
Merge pull request #981 from ammarhakim/fem_poisson_update-prototypin…
manauref Mar 23, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
248 changes: 239 additions & 9 deletions core/unit/ctest_cudss.cu
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ extern "C" {
extern "C" {
void test_cudss_simple();
void test_cudss_ops();
void test_cudss_ops_update_amat();
void test_cudss_ops_multiple_rhs();
}

Expand Down Expand Up @@ -259,6 +260,109 @@ void test_cudss_ops()
gkyl_culinsolver_prob_release(prob);
}

void test_cudss_ops_update_amat()
{
int nfail = 0;
double s, u, p, e, r, l;
int nrhs, m, n;

/* Initialize matrix A. */
/* A : matrix([s,0,u,u,0],[l,u,0,0,0],[0,l,p,0,0],[0,0,0,e,u],[l,l,0,0,r]); */
m = n = 5;
nrhs = 1;

s = 19.0; u = 21.0; p = 16.0; e = 5.0; r = 18.0; l = 12.0;
/* A : matrix([s,0,u,u,0],[l,u,0,0,0],[0,l,p,0,0],[0,0,0,e,u],[l,l,0,0,r]); */
struct gkyl_mat_triples **tri_arr = (struct gkyl_mat_triples **) gkyl_malloc(sizeof(struct gkyl_mat_triples *));
tri_arr[0] = gkyl_mat_triples_new(m, n);
struct gkyl_mat_triples *tri = tri_arr[0];
gkyl_mat_triples_set_rowmaj_order(tri);
// row 0
gkyl_mat_triples_insert(tri, 0, 0, s);
gkyl_mat_triples_insert(tri, 0, 2, u);
gkyl_mat_triples_insert(tri, 0, 3, u);
// row 1
gkyl_mat_triples_insert(tri, 1, 0, l);
gkyl_mat_triples_insert(tri, 1, 1, u);
// row 2
gkyl_mat_triples_insert(tri, 2, 1, l);
gkyl_mat_triples_insert(tri, 2, 2, p);
// row 3
gkyl_mat_triples_insert(tri, 3, 3, e);
gkyl_mat_triples_insert(tri, 3, 4, u);
// row 4
gkyl_mat_triples_insert(tri, 4, 0, l);
gkyl_mat_triples_insert(tri, 4, 1, l);
gkyl_mat_triples_insert(tri, 4, 4, r);

// Create the cuSolver linear problem setup.
gkyl_culinsolver_prob *prob = gkyl_culinsolver_prob_new(1, m, n, nrhs);

// Allocate the A matrix from triples.
gkyl_culinsolver_amat_from_triples(prob, tri_arr);

// Create right-hand side matrix B = transpose([1,1,1,1,1]).
gkyl_mat_triples *triRHS = gkyl_mat_triples_new(m, nrhs);
gkyl_mat_triples_insert(triRHS, 0, 0, 1.0);
gkyl_mat_triples_insert(triRHS, 1, 0, 1.0);
gkyl_mat_triples_insert(triRHS, 2, 0, 1.0);
gkyl_mat_triples_insert(triRHS, 3, 0, 1.0);
gkyl_mat_triples_insert(triRHS, 4, 0, 1.0);
gkyl_culinsolver_brhs_from_triples(prob, triRHS);

gkyl_culinsolver_solve(prob);
gkyl_culinsolver_finish_host(prob);

// Solution is: [-1/32, 11/168, 3/224, 1/16, 11/336].
GKYL_CU_CHECK( gkyl_compare_double(-1.0/32.0 , gkyl_culinsolver_get_sol_lin(prob,0), 1e-14), &nfail );
GKYL_CU_CHECK( gkyl_compare_double( 11.0/168.0, gkyl_culinsolver_get_sol_lin(prob,1), 1e-14), &nfail );
GKYL_CU_CHECK( gkyl_compare_double( 3.0/224.0 , gkyl_culinsolver_get_sol_lin(prob,2), 1e-14), &nfail );
GKYL_CU_CHECK( gkyl_compare_double( 1.0/16.0 , gkyl_culinsolver_get_sol_lin(prob,3), 1e-14), &nfail );
GKYL_CU_CHECK( gkyl_compare_double( 11.0/336.0, gkyl_culinsolver_get_sol_lin(prob,4), 1e-14), &nfail );

// Now update the LHS matrix. Multiply it by a constant so the solution should be the same as before but divided by that constant.
double prob_fac = 1.3;

gkyl_mat_triples_set_rowmaj_order(tri);
// row 0
gkyl_mat_triples_insert(tri, 0, 0, s*prob_fac);
gkyl_mat_triples_insert(tri, 0, 2, u*prob_fac);
gkyl_mat_triples_insert(tri, 0, 3, u*prob_fac);
// row 1
gkyl_mat_triples_insert(tri, 1, 0, l*prob_fac);
gkyl_mat_triples_insert(tri, 1, 1, u*prob_fac);
// row 2
gkyl_mat_triples_insert(tri, 2, 1, l*prob_fac);
gkyl_mat_triples_insert(tri, 2, 2, p*prob_fac);
// row 3
gkyl_mat_triples_insert(tri, 3, 3, e*prob_fac);
gkyl_mat_triples_insert(tri, 3, 4, u*prob_fac);
// row 4
gkyl_mat_triples_insert(tri, 4, 0, l*prob_fac);
gkyl_mat_triples_insert(tri, 4, 1, l*prob_fac);
gkyl_mat_triples_insert(tri, 4, 4, r*prob_fac);

gkyl_culinsolver_amat_update_from_triples(prob, tri_arr);

// Reset RHS for good measure.
gkyl_culinsolver_brhs_from_triples(prob, triRHS);

gkyl_culinsolver_solve(prob);
gkyl_culinsolver_finish_host(prob);

// Solution is: (1/prob_fac)*[-1/32, 11/168, 3/224, 1/16, 11/336].
GKYL_CU_CHECK( gkyl_compare_double((1.0/prob_fac)*(-1.0/32.0 ), gkyl_culinsolver_get_sol_lin(prob,0), 1e-14), &nfail );
GKYL_CU_CHECK( gkyl_compare_double((1.0/prob_fac)*( 11.0/168.0), gkyl_culinsolver_get_sol_lin(prob,1), 1e-14), &nfail );
GKYL_CU_CHECK( gkyl_compare_double((1.0/prob_fac)*( 3.0/224.0 ), gkyl_culinsolver_get_sol_lin(prob,2), 1e-14), &nfail );
GKYL_CU_CHECK( gkyl_compare_double((1.0/prob_fac)*( 1.0/16.0 ), gkyl_culinsolver_get_sol_lin(prob,3), 1e-14), &nfail );
GKYL_CU_CHECK( gkyl_compare_double((1.0/prob_fac)*( 11.0/336.0), gkyl_culinsolver_get_sol_lin(prob,4), 1e-14), &nfail );

gkyl_mat_triples_release(tri);
gkyl_free(tri_arr);
gkyl_mat_triples_release(triRHS);
gkyl_culinsolver_prob_release(prob);
}

void test_cudss_ops_multiple_rhs()
{
double s, u, p, e, r, l;
Expand Down Expand Up @@ -320,26 +424,152 @@ void test_cudss_ops_multiple_rhs()

// Solution is: [-1/32, 11/168, 3/224, 1/16, 11/336].
// 1st problem
GKYL_CU_CHECK( gkyl_compare_double(-1.0/32.0, gkyl_culinsolver_get_sol_lin(prob,0), 1e-14), &nfail );
GKYL_CU_CHECK( gkyl_compare_double(-1.0/32.0 , gkyl_culinsolver_get_sol_lin(prob,0), 1e-14), &nfail );
GKYL_CU_CHECK( gkyl_compare_double( 11.0/168.0, gkyl_culinsolver_get_sol_lin(prob,1), 1e-14), &nfail );
GKYL_CU_CHECK( gkyl_compare_double( 3.0/224.0, gkyl_culinsolver_get_sol_lin(prob,2), 1e-14), &nfail );
GKYL_CU_CHECK( gkyl_compare_double( 1.0/16.0, gkyl_culinsolver_get_sol_lin(prob,3), 1e-14), &nfail );
GKYL_CU_CHECK( gkyl_compare_double( 3.0/224.0 , gkyl_culinsolver_get_sol_lin(prob,2), 1e-14), &nfail );
GKYL_CU_CHECK( gkyl_compare_double( 1.0/16.0 , gkyl_culinsolver_get_sol_lin(prob,3), 1e-14), &nfail );
GKYL_CU_CHECK( gkyl_compare_double( 11.0/336.0, gkyl_culinsolver_get_sol_lin(prob,4), 1e-14), &nfail );
// 2nd problem
GKYL_CU_CHECK( gkyl_compare_double(-1.0/32.0, gkyl_culinsolver_get_sol_lin(prob,5), 1e-14), &nfail );
GKYL_CU_CHECK( gkyl_compare_double(-1.0/32.0 , gkyl_culinsolver_get_sol_lin(prob,5), 1e-14), &nfail );
GKYL_CU_CHECK( gkyl_compare_double( 11.0/168.0, gkyl_culinsolver_get_sol_lin(prob,6), 1e-14), &nfail );
GKYL_CU_CHECK( gkyl_compare_double( 3.0/224.0, gkyl_culinsolver_get_sol_lin(prob,7), 1e-14), &nfail );
GKYL_CU_CHECK( gkyl_compare_double( 1.0/16.0, gkyl_culinsolver_get_sol_lin(prob,8), 1e-14), &nfail );
GKYL_CU_CHECK( gkyl_compare_double( 3.0/224.0 , gkyl_culinsolver_get_sol_lin(prob,7), 1e-14), &nfail );
GKYL_CU_CHECK( gkyl_compare_double( 1.0/16.0 , gkyl_culinsolver_get_sol_lin(prob,8), 1e-14), &nfail );
GKYL_CU_CHECK( gkyl_compare_double( 11.0/336.0, gkyl_culinsolver_get_sol_lin(prob,9), 1e-14), &nfail );
// 3rd problem
GKYL_CU_CHECK( gkyl_compare_double(-1.0/32.0, gkyl_culinsolver_get_sol_lin(prob,10), 1e-14), &nfail );
GKYL_CU_CHECK( gkyl_compare_double(-1.0/32.0 , gkyl_culinsolver_get_sol_lin(prob,10), 1e-14), &nfail );
GKYL_CU_CHECK( gkyl_compare_double( 11.0/168.0, gkyl_culinsolver_get_sol_lin(prob,11), 1e-14), &nfail );
GKYL_CU_CHECK( gkyl_compare_double( 3.0/224.0, gkyl_culinsolver_get_sol_lin(prob,12), 1e-14), &nfail );
GKYL_CU_CHECK( gkyl_compare_double( 1.0/16.0, gkyl_culinsolver_get_sol_lin(prob,13), 1e-14), &nfail );
GKYL_CU_CHECK( gkyl_compare_double( 3.0/224.0 , gkyl_culinsolver_get_sol_lin(prob,12), 1e-14), &nfail );
GKYL_CU_CHECK( gkyl_compare_double( 1.0/16.0 , gkyl_culinsolver_get_sol_lin(prob,13), 1e-14), &nfail );
GKYL_CU_CHECK( gkyl_compare_double( 11.0/336.0, gkyl_culinsolver_get_sol_lin(prob,14), 1e-14), &nfail );

gkyl_culinsolver_prob_release(prob);
}

void test_cudss_ops_update_amat_multiple_rhs()
{
double s, u, p, e, r, l;
int nrhs, m, n;

/* Initialize matrix A. */
/* A : matrix([s,0,u,u,0],[l,u,0,0,0],[0,l,p,0,0],[0,0,0,e,u],[l,l,0,0,r]); */
m = n = 5;
nrhs = 3;

s = 19.0; u = 21.0; p = 16.0; e = 5.0; r = 18.0; l = 12.0;
/* A : matrix([s,0,u,u,0],[l,u,0,0,0],[0,l,p,0,0],[0,0,0,e,u],[l,l,0,0,r]); */
struct gkyl_mat_triples **tri_arr = (struct gkyl_mat_triples **) gkyl_malloc(sizeof(struct gkyl_mat_triples *));
tri_arr[0] = gkyl_mat_triples_new(m, n);
struct gkyl_mat_triples *tri = tri_arr[0];
gkyl_mat_triples_set_rowmaj_order(tri);
// row 0
gkyl_mat_triples_insert(tri, 0, 0, s);
gkyl_mat_triples_insert(tri, 0, 2, u);
gkyl_mat_triples_insert(tri, 0, 3, u);
// row 1
gkyl_mat_triples_insert(tri, 1, 0, l);
gkyl_mat_triples_insert(tri, 1, 1, u);
// row 2
gkyl_mat_triples_insert(tri, 2, 1, l);
gkyl_mat_triples_insert(tri, 2, 2, p);
// row 3
gkyl_mat_triples_insert(tri, 3, 3, e);
gkyl_mat_triples_insert(tri, 3, 4, u);
// row 4
gkyl_mat_triples_insert(tri, 4, 0, l);
gkyl_mat_triples_insert(tri, 4, 1, l);
gkyl_mat_triples_insert(tri, 4, 4, r);

// Create the cuSolver linear problem setup.
gkyl_culinsolver_prob *prob = gkyl_culinsolver_prob_new(1, m, n, nrhs);

// Allocate the A matrix from triples.
gkyl_culinsolver_amat_from_triples(prob, tri_arr);

// Create right-hand side matrix B = transpose([1,1,1,1,1]).
gkyl_mat_triples *triRHS = gkyl_mat_triples_new(m, nrhs);
for (int k=0; k<nrhs; k++) {
gkyl_mat_triples_insert(triRHS, 0, k, 1.0);
gkyl_mat_triples_insert(triRHS, 1, k, 1.0);
gkyl_mat_triples_insert(triRHS, 2, k, 1.0);
gkyl_mat_triples_insert(triRHS, 3, k, 1.0);
gkyl_mat_triples_insert(triRHS, 4, k, 1.0);
}
gkyl_culinsolver_brhs_from_triples(prob, triRHS);

gkyl_culinsolver_solve(prob);
gkyl_culinsolver_finish_host(prob);

int nfail = 0;

// Solution is: [-1/32, 11/168, 3/224, 1/16, 11/336].
for (int k=0; k<nrhs; k++) {
int off = m*k;
GKYL_CU_CHECK( gkyl_compare_double(-1.0/32.0 , gkyl_culinsolver_get_sol_lin(prob,off+0), 1e-14), &nfail );
GKYL_CU_CHECK( gkyl_compare_double( 11.0/168.0, gkyl_culinsolver_get_sol_lin(prob,off+1), 1e-14), &nfail );
GKYL_CU_CHECK( gkyl_compare_double( 3.0/224.0 , gkyl_culinsolver_get_sol_lin(prob,off+2), 1e-14), &nfail );
GKYL_CU_CHECK( gkyl_compare_double( 1.0/16.0 , gkyl_culinsolver_get_sol_lin(prob,off+3), 1e-14), &nfail );
GKYL_CU_CHECK( gkyl_compare_double( 11.0/336.0, gkyl_culinsolver_get_sol_lin(prob,off+4), 1e-14), &nfail );
}

// Now update the LHS matrix. Multiply it by a constant, and multiply the RHS
// by 2X that constant, so the solution should be the same but divided by 2.
double prob_fac = 1.3;
double *prob_fac_per_rhs = (double *) gkyl_malloc(nrhs*sizeof(double));
for (int k=0; k<nrhs; k++)
prob_fac_per_rhs[k] = (k+1)*prob_fac;

gkyl_mat_triples_set_rowmaj_order(tri);
// row 0
gkyl_mat_triples_insert(tri, 0, 0, s*prob_fac);
gkyl_mat_triples_insert(tri, 0, 2, u*prob_fac);
gkyl_mat_triples_insert(tri, 0, 3, u*prob_fac);
// row 1
gkyl_mat_triples_insert(tri, 1, 0, l*prob_fac);
gkyl_mat_triples_insert(tri, 1, 1, u*prob_fac);
// row 2
gkyl_mat_triples_insert(tri, 2, 1, l*prob_fac);
gkyl_mat_triples_insert(tri, 2, 2, p*prob_fac);
// row 3
gkyl_mat_triples_insert(tri, 3, 3, e*prob_fac);
gkyl_mat_triples_insert(tri, 3, 4, u*prob_fac);
// row 4
gkyl_mat_triples_insert(tri, 4, 0, l*prob_fac);
gkyl_mat_triples_insert(tri, 4, 1, l*prob_fac);
gkyl_mat_triples_insert(tri, 4, 4, r*prob_fac);

// Create the cuSolver linear problem setup.
gkyl_culinsolver_amat_update_from_triples(prob, tri_arr);

// Reset RHS.
for (int k=0; k<nrhs; k++) {
gkyl_mat_triples_insert(triRHS, 0, k, 1.0*prob_fac_per_rhs[k]);
gkyl_mat_triples_insert(triRHS, 1, k, 1.0*prob_fac_per_rhs[k]);
gkyl_mat_triples_insert(triRHS, 2, k, 1.0*prob_fac_per_rhs[k]);
gkyl_mat_triples_insert(triRHS, 3, k, 1.0*prob_fac_per_rhs[k]);
gkyl_mat_triples_insert(triRHS, 4, k, 1.0*prob_fac_per_rhs[k]);
}
gkyl_culinsolver_brhs_from_triples(prob, triRHS);

gkyl_culinsolver_solve(prob);
gkyl_culinsolver_finish_host(prob);

// Solution is: (k+1)*[-1/32, 11/168, 3/224, 1/16, 11/336].
for (int k=0; k<nrhs; k++) {
int off = m*k;
double fac = prob_fac_per_rhs[k]/prob_fac;
GKYL_CU_CHECK( gkyl_compare_double(fac*(-1.0/32.0 ), gkyl_culinsolver_get_sol_lin(prob,off+0), 1e-14), &nfail );
GKYL_CU_CHECK( gkyl_compare_double(fac*( 11.0/168.0), gkyl_culinsolver_get_sol_lin(prob,off+1), 1e-14), &nfail );
GKYL_CU_CHECK( gkyl_compare_double(fac*( 3.0/224.0 ), gkyl_culinsolver_get_sol_lin(prob,off+2), 1e-14), &nfail );
GKYL_CU_CHECK( gkyl_compare_double(fac*( 1.0/16.0 ), gkyl_culinsolver_get_sol_lin(prob,off+3), 1e-14), &nfail );
GKYL_CU_CHECK( gkyl_compare_double(fac*( 11.0/336.0), gkyl_culinsolver_get_sol_lin(prob,off+4), 1e-14), &nfail );
}

gkyl_free(prob_fac_per_rhs);
gkyl_mat_triples_release(tri);
gkyl_free(tri_arr);
gkyl_mat_triples_release(triRHS);
gkyl_culinsolver_prob_release(prob);
}

// End ifdef GKYL_HAVE_CUDSS statement.
#endif
Loading
Loading