-
Notifications
You must be signed in to change notification settings - Fork 57
Python PETSc Example BP1 #1806
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Python PETSc Example BP1 #1806
Conversation
examples/python/bpsraw.py
Outdated
matrix = PETSc.Mat().createAIJ([num_dofs, num_dofs], comm=PETSc.COMM_WORLD) | ||
matrix.setFromOptions() | ||
matrix.setUp() | ||
for i in range(num_dofs): | ||
e_vec = ceed.Vector(num_dofs) | ||
r_vec = ceed.Vector(num_dofs) | ||
e_vec.set_value(0.0) | ||
r_vec.set_value(0.0) | ||
with e_vec.array_write() as arr: | ||
arr[i] = 1.0 | ||
op.apply(e_vec, r_vec) | ||
with r_vec.array_read() as r_arr: | ||
matrix.setValues(range(num_dofs), [i], r_arr) | ||
matrix.assemble() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You'll want a MatShell, not a MatAIJ
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Apologies for leaving this a bit stale. Addressing this led to a lot of other changes. I had trouble setting the matrix type to "shell" and applying context, kept getting segmentation faults. So, instead of using the "shell" type, I used the "python" type and set the context through a python class. Pulled that implementation from the petsc4py 2DPoisson example (about half way down) --> link. I'll tidy up what I have a submit an update soon.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Overall this is looking like the right approach. The big thing is to try to avoid copying around data during frequent operations, like the matrix application
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you for all the suggestions! Definitely, keeping the data in place would mean less overhead and better efficiency
@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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ideally, you'd set v to use y's array before you apply the libCEED operator
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If this just wraps another function call, I think its clearer to use the function call itself
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Totally agree, I have another CreateRestriction function that reflects C but its a WIP
Co-authored-by: Jeremy L Thompson <[email protected]>
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: