Dear all, here how I create a 2D vector type to send 3D array element: (in the attachment)
The vectors are: real*4 AA(4,5,3), BB(4,5,3) In my idea both AA and BB have three elements (last columns) and each elements has (4x5) features. 1) What do you think? 2) why I can not send AA(1,1,2:3) as call MPI_SEND(AA(1,1,2:3), 2, rowtype, 1, 300, MPI_COMM_WORLD, ierr) Thanks a lot Diego On 18 January 2015 at 13:02, Diego Avesani <diego.aves...@gmail.com> wrote: > Dear All, Dear Gus, Dear George, > I almost get it. In the attachment the program. > > All data arrived, However I got a segmentation fault. > The idea is to have mpi_type_row and then construct a mpi_rowcolumn_type. > Probably I am not able to understand the correct position in Fortran. > > (P.S. I am sorry for the other post in the other treat.) > > What do you think? > > Thanks again > > > > Diego > > > On 16 January 2015 at 20:04, Diego Avesani <diego.aves...@gmail.com> > wrote: > >> Dear all, >> here the 3D example, but unfortunately it does not work. >> I believe that there is some problem with the stride. >> >> What do you think? >> >> Thanks again to everyone >> >> Diego >> >> >> On 16 January 2015 at 19:20, Diego Avesani <diego.aves...@gmail.com> >> wrote: >> >>> Dear All, >>> in the attachment the 2D example, Now I will try the 3D example. >>> >>> What do you think of it? is it correct? >>> The idea is to build a 2D data_type, to sent 3D data >>> >>> Diego >>> >>> >>> On 16 January 2015 at 18:19, Diego Avesani <diego.aves...@gmail.com> >>> wrote: >>> >>>> Dear George, Dear All, >>>> >>>> and what do you think about the previous post? >>>> >>>> Thanks again >>>> >>>> Diego >>>> >>>> >>>> On 16 January 2015 at 18:11, George Bosilca <bosi...@icl.utk.edu> >>>> wrote: >>>> >>>>> You could but you don’t need to. The datatype engine of Open MPI is >>>>> doing a fair job of packing/unpacking the data on the flight, so you don’t >>>>> have to. >>>>> >>>>> George. >>>>> >>>>> On Jan 16, 2015, at 11:32 , Diego Avesani <diego.aves...@gmail.com> >>>>> wrote: >>>>> >>>>> Dear all, >>>>> >>>>> Could I use MPI_PACK? >>>>> >>>>> >>>>> Diego >>>>> >>>>> >>>>> On 16 January 2015 at 16:26, Diego Avesani <diego.aves...@gmail.com> >>>>> wrote: >>>>> >>>>>> Dear George, Dear all, >>>>>> >>>>>> I have been studying. It's clear for 2D case QQ(:,:). >>>>>> >>>>>> For example if >>>>>> real :: QQ(npt,9) , with 9 the characteristic of each particles. >>>>>> >>>>>> I can simple: >>>>>> >>>>>> call MPI_TYPE_VECTOR(QQ(1:50), 9, 9, MPI_REAL, my_2D_type, ierr) >>>>>> >>>>>> I send 50 element of QQ. I am in fortran so a two dimensional array >>>>>> is organized in a 1D array and a new row start after the 9 elements of a >>>>>> colum >>>>>> >>>>>> The problem is a 3D array. I belive that I have to create a sort of >>>>>> *vector >>>>>> of vectors.* >>>>>> More or less like: >>>>>> >>>>>> call MPI_TYPE_VECTOR(xxx, xxx, xxx, MPI_REAL, my_row, ierr) >>>>>> >>>>>> and then >>>>>> >>>>>> call MPI_TYPE_VECTOR(xxx, xxx, xxx, *my_row*, my_type, ierr). >>>>>> >>>>>> You can note that in the second case I have *my_row *instead of >>>>>> mpi_real. >>>>>> >>>>>> I found somethind about it in a tutorial but I am not able to find it >>>>>> again in google. I think that is not convinient the use of struct in this >>>>>> case, I have only real. Moreover, mpi_struct is think to emulate >>>>>> Fortran90 and C structures, as Gus' suggestion. >>>>>> >>>>>> Let's me look to that tutorial >>>>>> What do you think? >>>>>> >>>>>> Thanks again >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> Diego >>>>>> >>>>>> >>>>>> On 16 January 2015 at 16:02, George Bosilca <bosi...@icl.utk.edu> >>>>>> wrote: >>>>>> >>>>>>> The operation you describe is a pack operation, agglomerating >>>>>>> together in a contiguous buffer originally discontinuous elements. As a >>>>>>> result there is no need to use the MPI_TYPE_VECTOR, but instead you can >>>>>>> just use the type you created so far (MPI_my_STRUCT) with a count. >>>>>>> >>>>>>> George. >>>>>>> >>>>>>> >>>>>>> On Fri, Jan 16, 2015 at 5:32 AM, Diego Avesani < >>>>>>> diego.aves...@gmail.com> wrote: >>>>>>> >>>>>>>> Dear All, >>>>>>>> I'm sorry to insist, but I am not able to understand. Moreover, I >>>>>>>> have realized that I have to explain myself better. >>>>>>>> >>>>>>>> I try to explain in may program. Each CPU has *npt* particles. My >>>>>>>> program understand how many particles each CPU has to send, according >>>>>>>> to >>>>>>>> their positions. Then I can do: >>>>>>>> >>>>>>>> *icount=1* >>>>>>>> * DO i=1,npt* >>>>>>>> * IF(i is a particle to send)THEN* >>>>>>>> >>>>>>>> * DATASEND(icount)%ip = PART(ip)%ip* >>>>>>>> * DATASEND(icount)%mc = PART(ip)%mc* >>>>>>>> >>>>>>>> * DATASEND(icount)%RP = PART(ip)%RP* >>>>>>>> * DATASEND(icount)%QQ = PART(ip)%QQ* >>>>>>>> >>>>>>>> * icount=icount+1* >>>>>>>> * ENDIF* >>>>>>>> * ENDDO* >>>>>>>> >>>>>>>> After that, I can send *DATASEND* >>>>>>>> >>>>>>>> I *DATASEND* is a *MPI_my_STRUCT.* I can allocate it according >>>>>>>> to the number of particles that I have to send: >>>>>>>> >>>>>>>> TYPE(tParticle) ,ALLOCATABLE,DIMENSION(:) :: DATASEND,DATARECV >>>>>>>> >>>>>>>> This means that the number of particles which I have to send can >>>>>>>> change every time. >>>>>>>> >>>>>>>> After that, I compute for each particles, somethins called >>>>>>>> QQmls(:,:,:). >>>>>>>> QQmls has all real elements. Now I would like to to the same that I >>>>>>>> did with PART, but in this case: >>>>>>>> >>>>>>>> *icount=1* >>>>>>>> *DO i=1,npt* >>>>>>>> * IF(i is a particle to send)THEN* >>>>>>>> >>>>>>>> *DATASEND_REAL(:,icount,:)=QQmls(:,i,:)* >>>>>>>> * icount=icount+1* >>>>>>>> >>>>>>>> * ENDIF* >>>>>>>> *ENDDO* >>>>>>>> >>>>>>>> I would like to have a sort *MPI_my_TYPE to do that (like * >>>>>>>> *MPI_my_STRUCT**) *and not to create every time *MPI_TYPE_VECTOR * >>>>>>>> because *DATASEND_REAL *changes size every time. >>>>>>>> >>>>>>>> I hope to make myself clear. >>>>>>>> >>>>>>>> So is it correct to use *MPI_TYPE_VECTOR?, *Can I do what I want? >>>>>>>> >>>>>>>> In the meantime, I will study some examples. >>>>>>>> >>>>>>>> Thanks again >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> Diego >>>>>>>> >>>>>>>> >>>>>>>> On 16 January 2015 at 07:39, George Bosilca <bosi...@icl.utk.edu> >>>>>>>> wrote: >>>>>>>> >>>>>>>>> The subarray creation is an multi-dimension extension of the >>>>>>>>> vector type. You can see it as a vector of vector of vector and so >>>>>>>>> on, one >>>>>>>>> vector per dimension. The stride array is used to declare on each >>>>>>>>> dimension >>>>>>>>> what is the relative displacement (in number of elements) from the >>>>>>>>> beginning of the dimension array. >>>>>>>>> >>>>>>>>> It is important to use regular type creation when you can take >>>>>>>>> advantage of such regularity instead of resorting to use of struct or >>>>>>>>> h*. >>>>>>>>> This insure better packing/unpacking performance, as well as possible >>>>>>>>> future support for one-sided communications. >>>>>>>>> >>>>>>>>> George. >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> > On Jan 15, 2015, at 19:31, Gus Correa <g...@ldeo.columbia.edu> >>>>>>>>> wrote: >>>>>>>>> > >>>>>>>>> > I never used MPI_Type_create_subarray, only MPI_Type_Vector. >>>>>>>>> > What I like about MPI_Type_Vector is that you can define a >>>>>>>>> stride, >>>>>>>>> > hence you can address any regular pattern in memory. >>>>>>>>> > However, it envisages the array layout in memory as a big 1-D >>>>>>>>> array, >>>>>>>>> > with a linear index progressing in either Fortran or C order. >>>>>>>>> > >>>>>>>>> > Somebody correct me please if I am wrong, but at first sight >>>>>>>>> MPI_Type_Vector sounds more flexible to me than >>>>>>>>> MPI_Type_create_subarray, >>>>>>>>> exactly because the latter doesn't have strides. >>>>>>>>> > >>>>>>>>> > The downside is that you need to do some index arithmetic to >>>>>>>>> figure >>>>>>>>> > the right strides, etc, to match the corresponding >>>>>>>>> > Fortran90 array sections. >>>>>>>>> > >>>>>>>>> > There are good examples in the "MPI - The complete reference" >>>>>>>>> books I suggested to you before (actually in vol 1). >>>>>>>>> > >>>>>>>>> > Online I could find the two man pages (good information, but no >>>>>>>>> example): >>>>>>>>> > >>>>>>>>> > http://www.open-mpi.org/doc/v1.8/man3/MPI_Type_vector.3.php >>>>>>>>> > >>>>>>>>> http://www.open-mpi.org/doc/v1.8/man3/MPI_Type_create_subarray.3.php >>>>>>>>> > >>>>>>>>> > There is a very simple 2D example of MPI_Type_vector using >>>>>>>>> strides here: >>>>>>>>> > >>>>>>>>> > https://computing.llnl.gov/tutorials/mpi/#Derived_Data_Types >>>>>>>>> > >>>>>>>>> > and a similar one here: >>>>>>>>> > >>>>>>>>> > >>>>>>>>> http://static.msi.umn.edu/tutorial/scicomp/general/MPI/content6.html >>>>>>>>> > >>>>>>>>> > Gus Correa >>>>>>>>> > >>>>>>>>> >> On 01/15/2015 06:53 PM, Diego Avesani wrote: >>>>>>>>> >> dear George, dear Gus, dear all, >>>>>>>>> >> Could you please tell me where I can find a good example? >>>>>>>>> >> I am sorry but I can not understand the 3D array. >>>>>>>>> >> >>>>>>>>> >> >>>>>>>>> >> Really Thanks >>>>>>>>> >> >>>>>>>>> >> Diego >>>>>>>>> >> >>>>>>>>> >> >>>>>>>>> >> On 15 January 2015 at 20:13, George Bosilca < >>>>>>>>> bosi...@icl.utk.edu >>>>>>>>> >> <mailto:bosi...@icl.utk.edu>> wrote: >>>>>>>>> >> >>>>>>>>> >> >>>>>>>>> >>> On Jan 15, 2015, at 06:02 , Diego Avesani < >>>>>>>>> diego.aves...@gmail.com >>>>>>>>> >>> <mailto:diego.aves...@gmail.com>> wrote: >>>>>>>>> >>> >>>>>>>>> >>> Dear Gus, Dear all, >>>>>>>>> >>> Thanks a lot. >>>>>>>>> >>> MPI_Type_Struct works well for the first part of my >>>>>>>>> problem, so I >>>>>>>>> >>> am very happy to be able to use it. >>>>>>>>> >>> >>>>>>>>> >>> Regarding MPI_TYPE_VECTOR. >>>>>>>>> >>> >>>>>>>>> >>> I have studied it and for simple case it is clear to me >>>>>>>>> what id >>>>>>>>> >>> does (at least I believe). Foe example if I have a matrix >>>>>>>>> define as: >>>>>>>>> >>> REAL, ALLOCATABLE (AA(:,:)) >>>>>>>>> >>> ALLOCATE AA(100,5) >>>>>>>>> >>> >>>>>>>>> >>> I could send part of it defining >>>>>>>>> >>> >>>>>>>>> >>> CALL >>>>>>>>> MPI_TYPE_VECTOR(5,1,5,MPI_DOUBLE_PRECISION,/MY_NEW_TYPE/) >>>>>>>>> >>> >>>>>>>>> >>> after that I can send part of it with >>>>>>>>> >>> >>>>>>>>> >>> CALL MPI_SEND( AA(1:/10/,:), /10/, /MY_NEW_TYPE/, 1, 0, >>>>>>>>> >>> MPI_COMM_WORLD ); >>>>>>>>> >>> >>>>>>>>> >>> Have I understood correctly? >>>>>>>>> >>> >>>>>>>>> >>> What I can do in case of three dimensional array? for >>>>>>>>> example >>>>>>>>> >>> AA(:,:,:), I am looking to MPI_TYPE_CREATE_SUBARRAY. >>>>>>>>> >>> Is that the correct way? >>>>>>>>> >>> >>>>>>>>> >>> Thanks again >>>>>>>>> >> >>>>>>>>> >> Indeed, using the subarray is the right approach independent >>>>>>>>> on the >>>>>>>>> >> number of dimensions of the data (you can use it instead of >>>>>>>>> >> MPI_TYPE_VECTOR as well). >>>>>>>>> >> >>>>>>>>> >> George. >>>>>>>>> >> >>>>>>>>> >> >>>>>>>>> >>> >>>>>>>>> >>> >>>>>>>>> >>> >>>>>>>>> >>> >>>>>>>>> >>> Diego >>>>>>>>> >>> >>>>>>>>> >>> >>>>>>>>> >>> On 13 January 2015 at 19:04, Gus Correa < >>>>>>>>> g...@ldeo.columbia.edu >>>>>>>>> >>> <mailto:g...@ldeo.columbia.edu>> wrote: >>>>>>>>> >>> >>>>>>>>> >>> Hi Diego >>>>>>>>> >>> I guess MPI_Type_Vector is the natural way to send and >>>>>>>>> receive >>>>>>>>> >>> Fortran90 array sections (e.g. your QQMLS(:,50:100,:)). >>>>>>>>> >>> I used that before and it works just fine. >>>>>>>>> >>> I think that is pretty standard MPI programming style. >>>>>>>>> >>> I guess MPI_Type_Struct tries to emulate Fortran90 and C >>>>>>>>> >>> structures >>>>>>>>> >>> (as you did in your previous code, with all the >>>>>>>>> surprises >>>>>>>>> >>> regarding alignment, etc), not array sections. >>>>>>>>> >>> Also, MPI type vector should be more easy going (and >>>>>>>>> probably >>>>>>>>> >>> more efficient) than MPI type struct, with less memory >>>>>>>>> >>> alignment problems. >>>>>>>>> >>> I hope this helps, >>>>>>>>> >>> Gus Correa >>>>>>>>> >>> >>>>>>>>> >>> PS - These books have a quite complete description and >>>>>>>>> several >>>>>>>>> >>> examples >>>>>>>>> >>> of all MPI objects and functions, including MPI types >>>>>>>>> (native >>>>>>>>> >>> and user defined): >>>>>>>>> >>> >>>>>>>>> http://mitpress.mit.edu/books/__mpi-complete-reference-0 >>>>>>>>> >>> <http://mitpress.mit.edu/books/mpi-complete-reference-0 >>>>>>>>> > >>>>>>>>> >>> >>>>>>>>> http://mitpress.mit.edu/books/__mpi-complete-reference-1 >>>>>>>>> >>> <http://mitpress.mit.edu/books/mpi-complete-reference-1 >>>>>>>>> > >>>>>>>>> >>> >>>>>>>>> >>> [They cover MPI 1 and 2. I guess there is a >>>>>>>>> new/upcoming book >>>>>>>>> >>> with MPI 3, but for what you're doing 1 and 2 are more >>>>>>>>> than >>>>>>>>> >>> enough.] >>>>>>>>> >>> >>>>>>>>> >>> >>>>>>>>> >>> On 01/13/2015 09:22 AM, Diego Avesani wrote: >>>>>>>>> >>> >>>>>>>>> >>> Dear all, >>>>>>>>> >>> >>>>>>>>> >>> I had some wonderful talking about >>>>>>>>> MPI_type_create_struct adn >>>>>>>>> >>> isend\irecv with >>>>>>>>> >>> Gilles, Gustavo, George, Gus, Tom and Jeff. Now all >>>>>>>>> is >>>>>>>>> >>> more clear and my >>>>>>>>> >>> program works. >>>>>>>>> >>> >>>>>>>>> >>> Now I have another question. In may program I have >>>>>>>>> matrix: >>>>>>>>> >>> >>>>>>>>> >>> /QQMLS(:,:,:) /that is allocate as >>>>>>>>> >>> >>>>>>>>> >>> /ALLOCATE(QQMLS(9,npt,18)/), where npt is the >>>>>>>>> number of >>>>>>>>> >>> particles >>>>>>>>> >>> >>>>>>>>> >>> QQMLS is double precision. >>>>>>>>> >>> >>>>>>>>> >>> I would like to sent form a CPU to another part of >>>>>>>>> it, for >>>>>>>>> >>> example, >>>>>>>>> >>> sending QQMLS(:,50:100,:). I mean sending the QQMLS >>>>>>>>> of the >>>>>>>>> >>> particles >>>>>>>>> >>> between 50 to 100. >>>>>>>>> >>> I suppose that i could use MPI_Type_vector but I am >>>>>>>>> not >>>>>>>>> >>> sure. The >>>>>>>>> >>> particle that I want to sent could be from 25 to 50 >>>>>>>>> ecc.. >>>>>>>>> >>> ecc..so >>>>>>>>> >>> blocklength changes everytime. >>>>>>>>> >>> >>>>>>>>> >>> Do I have to use MPI_type_create_struct? >>>>>>>>> >>> Do I have correctly understood MPI_Type_vector? >>>>>>>>> >>> >>>>>>>>> >>> Thanks a lot >>>>>>>>> >>> >>>>>>>>> >>> >>>>>>>>> >>> Diego >>>>>>>>> >>> >>>>>>>>> >>> >>>>>>>>> >>> >>>>>>>>> >>> _________________________________________________ >>>>>>>>> >>> users mailing list >>>>>>>>> >>> us...@open-mpi.org <mailto:us...@open-mpi.org> >>>>>>>>> >>> Subscription: >>>>>>>>> >>> >>>>>>>>> http://www.open-mpi.org/__mailman/listinfo.cgi/users >>>>>>>>> >>> <http://www.open-mpi.org/mailman/listinfo.cgi/users >>>>>>>>> > >>>>>>>>> >>> Link to this post: >>>>>>>>> >>> >>>>>>>>> http://www.open-mpi.org/__community/lists/users/2015/01/__26171.php >>>>>>>>> >>> < >>>>>>>>> http://www.open-mpi.org/community/lists/users/2015/01/26171.php> >>>>>>>>> >>> >>>>>>>>> >>> >>>>>>>>> >>> _________________________________________________ >>>>>>>>> >>> users mailing list >>>>>>>>> >>> us...@open-mpi.org <mailto:us...@open-mpi.org> >>>>>>>>> >>> Subscription: >>>>>>>>> >>> http://www.open-mpi.org/__mailman/listinfo.cgi/users >>>>>>>>> >>> <http://www.open-mpi.org/mailman/listinfo.cgi/users> >>>>>>>>> >>> Link to this post: >>>>>>>>> >>> >>>>>>>>> http://www.open-mpi.org/__community/lists/users/2015/01/__26172.php >>>>>>>>> >>> < >>>>>>>>> http://www.open-mpi.org/community/lists/users/2015/01/26172.php> >>>>>>>>> >>> >>>>>>>>> >>> >>>>>>>>> >>> _______________________________________________ >>>>>>>>> >>> users mailing list >>>>>>>>> >>> us...@open-mpi.org <mailto:us...@open-mpi.org> >>>>>>>>> >>> Subscription: >>>>>>>>> http://www.open-mpi.org/mailman/listinfo.cgi/users >>>>>>>>> >>> Link to this post: >>>>>>>>> >>> >>>>>>>>> http://www.open-mpi.org/community/lists/users/2015/01/26184.php >>>>>>>>> >> >>>>>>>>> >> >>>>>>>>> >> _______________________________________________ >>>>>>>>> >> users mailing list >>>>>>>>> >> us...@open-mpi.org <mailto:us...@open-mpi.org> >>>>>>>>> >> Subscription: >>>>>>>>> http://www.open-mpi.org/mailman/listinfo.cgi/users >>>>>>>>> >> Link to this post: >>>>>>>>> >> >>>>>>>>> http://www.open-mpi.org/community/lists/users/2015/01/26192.php >>>>>>>>> >> >>>>>>>>> >> >>>>>>>>> >> >>>>>>>>> >> >>>>>>>>> >> _______________________________________________ >>>>>>>>> >> users mailing list >>>>>>>>> >> us...@open-mpi.org >>>>>>>>> >> Subscription: >>>>>>>>> http://www.open-mpi.org/mailman/listinfo.cgi/users >>>>>>>>> >> Link to this post: >>>>>>>>> http://www.open-mpi.org/community/lists/users/2015/01/26193.php >>>>>>>>> > >>>>>>>>> > _______________________________________________ >>>>>>>>> > users mailing list >>>>>>>>> > us...@open-mpi.org >>>>>>>>> > Subscription: http://www.open-mpi.org/mailman/listinfo.cgi/users >>>>>>>>> > Link to this post: >>>>>>>>> http://www.open-mpi.org/community/lists/users/2015/01/26194.php >>>>>>>>> _______________________________________________ >>>>>>>>> users mailing list >>>>>>>>> us...@open-mpi.org >>>>>>>>> Subscription: http://www.open-mpi.org/mailman/listinfo.cgi/users >>>>>>>>> Link to this post: >>>>>>>>> http://www.open-mpi.org/community/lists/users/2015/01/26195.php >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> _______________________________________________ >>>>>>>> users mailing list >>>>>>>> us...@open-mpi.org >>>>>>>> Subscription: http://www.open-mpi.org/mailman/listinfo.cgi/users >>>>>>>> Link to this post: >>>>>>>> http://www.open-mpi.org/community/lists/users/2015/01/26197.php >>>>>>>> >>>>>>> >>>>>>> >>>>>>> _______________________________________________ >>>>>>> users mailing list >>>>>>> us...@open-mpi.org >>>>>>> Subscription: http://www.open-mpi.org/mailman/listinfo.cgi/users >>>>>>> Link to this post: >>>>>>> http://www.open-mpi.org/community/lists/users/2015/01/26199.php >>>>>>> >>>>>> >>>>>> >>>>> _______________________________________________ >>>>> users mailing list >>>>> us...@open-mpi.org >>>>> Subscription: http://www.open-mpi.org/mailman/listinfo.cgi/users >>>>> Link to this post: >>>>> http://www.open-mpi.org/community/lists/users/2015/01/26201.php >>>>> >>>>> >>>>> >>>>> _______________________________________________ >>>>> users mailing list >>>>> us...@open-mpi.org >>>>> Subscription: http://www.open-mpi.org/mailman/listinfo.cgi/users >>>>> Link to this post: >>>>> http://www.open-mpi.org/community/lists/users/2015/01/26202.php >>>>> >>>> >>>> >>> >> >
program vector USE mpi IMPLICIT NONE integer SIZE_ parameter(SIZE_=5) integer numtasks, rank, source, dest, tag, i, ierr real*4 AA(4,5,3), BB(4,5,3) integer stat(MPI_STATUS_SIZE), rowtype,coltype !Fortran stores this array in column major order AA=0. AA(1,:,1)= [1.0,2.0,3.0,4.0,5.0] AA(2,:,1)= [1.0,2.0,3.0,4.0,5.0]*2.0 AA(3,:,1)= [1.0,2.0,3.0,4.0,5.0]*4.0 AA(4,:,1)= [1.0,2.0,3.0,4.0,5.0]*5.0 AA(1,:,2)= [1.0,2.0,3.0,4.0,5.0]*10. AA(2,:,2)= [1.0,2.0,3.0,4.0,5.0]*20.0 AA(3,:,2)= [1.0,2.0,3.0,4.0,5.0]*40.0 AA(4,:,2)= [1.0,2.0,3.0,4.0,5.0]*50.0 AA(1,:,3)= [1.0,2.0,3.0,4.0,5.0]*100. AA(2,:,3)= [1.0,2.0,3.0,4.0,5.0]*200.0 AA(3,:,3)= [1.0,2.0,3.0,4.0,5.0]*400.0 AA(4,:,3)= [1.0,2.0,3.0,4.0,5.0]*500.0 CALL MPI_INIT(ierr) CALL MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr) CALL MPI_COMM_SIZE(MPI_COMM_WORLD, numtasks, ierr) CALL MPI_TYPE_VECTOR(1, 4, 4, MPI_REAL, coltype, ierr) CALL MPI_TYPE_COMMIT(coltype, ierr) CALL MPI_TYPE_VECTOR(1, 5, 5, coltype, rowtype, ierr) CALL MPI_TYPE_COMMIT(rowtype, ierr) CALL MPI_BARRIER(MPI_COMM_WORLD, ierr) IF(rank==0)THEN i=1 call MPI_SEND(AA(1,1,1), 2, rowtype, 1, 300, MPI_COMM_WORLD, ierr) ENDIF IF(rank==1)THEN source = 0 call MPI_RECV(BB(1,1,1), 2, rowtype, 0, 300, MPI_COMM_WORLD, stat, ierr) ! WRITE(*,*) BB(1,:,2) WRITE(*,*) BB(1,:,3) ! ENDIF CALL MPI_FINALIZE(ierr) ENDPROGRAM