PyMFEM
PyMFEM copied to clipboard
Array wrapping enhancement
This PR includes
- address recent addition of kernel_dispatch.hpp in MFEM C++.
- kernel_dispatch.hpp doesn't need to be exposed to Python. But, we need MFEM_REGISTER_KERNELS macro to be defined somehow. In this PR, MFEM_REGISTER_KERNELS is replaced to be empty macro. So that SWIG does not see the lines containing this macro.
- Add CoefficentArray, VectorCoefficientArray, and MatrixCoefficientArray (represent Array<* Coefficient> and so on)
- Changed Array constructor behavior when list of SWIG-wrapped MFEM objects is passed. SWIG objects passed as an item in list/tuple looses owner ship to underlying C++ MFEM object. Internally, we create a new Array (depending on the length of container) and set each Array element one by one (after setting thisown to False).
- Renamed other Array< * MFEM object>.
- They are used to be named like VectorPtrArray. We simplify it as VectorArray.
- SparseMatrixArray2D, DenseMatrixArray2D, HypreParMatrixArray2D are added
- HypreParMatrixArray2D can be used with mfem.HypreParMatrixFromBlocks
- DenseMatrixArray2D appears in BlockNonlinearFormIntegrator
- SparseMatrixArray2D is used wtih MixedBilinearForm::GetBlocks
ToDo:
- Update Doc
- Add test/test_array2d.py
PR is made to trigger the test.
Example asked in https://github.com/mfem/PyMFEM/issues/253 can be done as follows.
tensors = [mfem.DenseMatrix(np.ones((3,3))*i) for i in range(max_attr)]
tensor_coefs = [mfem.MatrixConstantCoefficient(mat) for mat in tensors]
sigma_array = mfem.MatrixCoefficientArray(tensor_coefs)
sigma_attr = mfem.intArray([1,2,3,4,5])
sigmaCoef = mfem.PWMatrixCoefficient(dim, sigma_attr, sigma_array, False)
@sshiraiwa let me know when this is ready I'm happy to test it out.
Closing this one w/o merging, since this version will be baseline of PyMFEM4.8