Hi In C a 2-dimensional array with m rows is stored row-wise in a contiguous memory area while it is stored in m+1 1-dimensional arrays in Java (each 1-dimensional array is stored in a contiguous memory area, but the whole matrix isn't stored in a contiguous memory area). "Datatype.Vector" is implemented via JNI and calls the C function MPI_Type_vector which expects that a matrix is stored in a contiguous memory area. This leads to wrong results if you want to construct a new datatype for column elements of a matrix in Java. Jeff suggested some possible solutions in the last weeks which I will now discuss.
1) Simulate a 2-dimensional (m,n)-array in one 1-dimensional array with m*n elements and perform all necessary index computations yourself. This solution works and with the new method Datatype.Resized you can scatter all columns of a matrix to different processes. The problem is that you don't use a multi-dimensional array from Java. I'm not a Java expert, but I suppose that it even contradicts the philosophy of object-oriented programming. In my opinion this solution will also add new sources of errors if you must implement complicated algorithms (bugs with index computations, unreadable source code, etc.). 2) Implement a wrapper class in Java so that you don't have to deal with index computations in your normal program. As far as I know, it would have been necessary to use set- and get-methods to write and read matrix elements in that case, because Java doesn't allow operator overloading (I'm not even sure, if it would have been possible to overload "[][]" in the case that overloading would have been supported). In my opinion this approach wouldn't solve the problem, because I wouldn't be able to apply Datatype.Vector to an object of this new class. If I'm right, "Datatype.Vector" would be needless or I would have to implement methods to create a column datatype and to send and to receive column blocks in that class as well. I think, that I would also get once more complicated and unreadable source code. 3) Implement a wrapper class which possibly needs to be written in C. Yesterday I tried to understand how I can use JNI to solve this problem, because I didn't have any experience with JNI before. I can use JNI to convert a Java matrix into a C matrix and vice versa and in this way my original Java matrix can be stored into a contiguous memory area. However, in that case I can also use MPI_Type_vector, because I'm already using C, so that Datatype.Vector would be needless. In my opinion Datatype.Vector and friends should be implemented in a way that they can be used with multi-dimensional Java arrays, although I'm not sure if that is possible. The current version of their implementation is not optimal, but nevertheless better than nothing. Does somebody have other ideas or comments? Jeff, thank you very much for all your time and comments. Now I will try some other methods and I let you know, if I find more problems :-)) Kind regards Siegmar