Python PETSc Example BP1#1806
Conversation
|
@tylercollins5737 , thank you for your work. Are you able to address the reviewer's comments? |
|
@valeriabarra I was able to get it working using the "python" matrix type, MatAIJ was not the best. I believe the "python" type and MatCreateShell can achieve the same thing. |
| with self.v.array_read() as va: | ||
| y.setValues(range(lo, hi), va[lo:hi]) | ||
| y.assemble() |
There was a problem hiding this comment.
Ideally, you'd set v to use y's array before you apply the libCEED operator
There was a problem hiding this comment.
That makes more sense, thank you!
| def CreateRestriction(ceed, mesh_elem, P, num_comp, ndofs, offsets): | ||
| return ceed.ElemRestriction(mesh_elem, P, num_comp, 1, ndofs, offsets, cmode=libceed.USE_POINTER) |
There was a problem hiding this comment.
If this just wraps another function call, I think its clearer to use the function call itself
There was a problem hiding this comment.
Totally agree, I have another CreateRestriction function that reflects C but its a WIP
|
Hey @tylercollins5737 , how are you? I was wondering if you intended to complete this PR or if there were any impeding issues that you encountered. There are a couple of other potential contributors that are eyeing this project and I was wondering if there was a missing interface for which this BP could not be completed or if it was just for personal reasons. Thank you! |
Hey @valeriabarra hope you are doing well! In short, progress didn't stop because of any major limitations in the libceed or petsc libraries. But the qfunction for building the RHS "SetupMassRHS" and "Error" I believe aren't available so a workaround would have to be implemented which could be very slow, or an addition to the gallery of qfunctions, or someway to use the qfunctions used by the BPs, or a way to define a custom one in python. If there are interested contributors they're more than welcome to work on it. If no one picks it up, I'll start on it again and get the development environment setup on a computer I actually own. Cheers! |
|
Yeah, since there are QFunctions that are not available via the gallery, you'd have to use the technique shown in this folder for |
|
@jeremylt Cool, yeah that should do the trick. |
|
Hi @tylercollins5737, I'm hoping to have this ready in case next semester's students want to build on this for BP 2-6. This is good work so far and will be very helpful to future users. Is there anything I can do to help here? I'm happy to help out on any pieces that have you stuck so we can get this moving again. |
Cool, thank you for the support. I have the development environment setup again with everything updated, and I'm making progress on the example! I will reach out if I get stumped. |
|
@tylercollins5737 are you planning on coming back to this? I think there's a lot of good work here! If not, it may be time to close this PR. |
@zatkins-dev Yes! I should have have a pretty complete update soon, ideally by the end of the weekend. |
|
Awesome! Happy to keep it open then, thanks! |
The gallery has Mass3DBuild and MassApply, but nothing like SetupMassRhs or Error, which depend on the exact solution the benchmark solves for. These follow the ex1-ex3 pattern: C sources next to the Python examples, built into the QFunctions library by qfunctions.c.
Port examples/petsc/bpsraw.c to Python with petsc4py and the libCEED Python bindings, solving BP1. A python PETSc Mat takes the place of the MatShell; its mult() runs the libCEED operator. MatMult hands the PETSc Vec arrays straight to libCEED with CEED_USE_POINTER instead of copying them, on the host and on the device. petsc4py has no VecGetArrayAndMemType, so on the device the pointer comes from getCUDAHandle and is passed through the CUDA array interface.
The example picks its iteration limit from how long a first solve takes, so the tests pin it with ksp_max_it_clip to keep the iteration count the same every run, as the C test does.
c387450 to
f833966
Compare
Two notes:
|
| # Apply libCEED operator | ||
| self.op_apply.apply(self.x_ceed, self.y_ceed) | ||
|
|
||
| # Restore arrays; the C also detaches them with CeedVectorTakeArray, which the Python bindings do not |
There was a problem hiding this comment.
We really should just add CeedVectorTakeArarry to the Python bindings - @zatkins-dev or I can hit that, though dunno how long it'll take to publish that
There was a problem hiding this comment.
Just let me know about this. I can open a PR for it.
|
I have just a handful of comments, but this looks great! |
ex1-ex3 only need libCEED, so moved the BP1 tests out of ex_test.py into their own bps_test.py, which skips itself when petsc4py is not available. The test target runs both.
Rename Split3, GlobalNodes, GlobalStart, CreateRestriction and ComputeErrorMax to snake_case, matching the rest of the file and ex1-ex3.
Gave every function, class and method a docstring with Args and Returns to match ex_common.py style.
|
So the BP tests skip when petsc4py isn't installed, and right now that's every CI setup because GitHub Actions has no PETSc, and GitLab CI has PETSc but not petsc4py. So they only really run locally at the moment. |
| write_solution=False, | ||
| ksp_max_it_clip=[15, 15], | ||
| ) | ||
| assert bpsraw.example_bps(args) == 0 |
There was a problem hiding this comment.
Hmm, we either should use assert in the other test cases or not use it here. I think but am not sure that not having the assert results in this test just returning the error code of example_bps
| # ------------------------------------------------------------------------------- | ||
|
|
||
|
|
||
| def test_401(ceed_resource): |
There was a problem hiding this comment.
I'd pick a clearer set of test names, like test_bp_1_degree_1 or such? Once this merges, I'll be adding an issue for a student to expand this to BP2, BP3, and BP4, so naming the tests by the BP will help us there
Hello!
This is a Python implementation of bpsraw.c for BP1 and was initially discussed in #1774 . I'm aiming to recreate the benchmark behavior using libceed and petsc4py. I appreciate any feedback or indications I'm headed in the right direction!
It does run, but this is a work in progress. Remaining tasks: