Dear all,

I would like to share with what I have done in oder to create my own MPI
data type. The strange thing is that it worked until some day ago and then
it stopped working. This because probably I have changed my data type and I
miss some knowledge about MPI data type

This is my data type:
******
  TYPE tParticle
    SEQUENCE
    INTEGER          :: ip
    INTEGER         :: mc
    INTEGER         :: bcflag
    INTEGER         :: cpu
    REAL               :: RP(di)
    REAL               :: QQ(nVar)
    REAL               :: UU0(2*(1+di+nVar))
    REAL               :: lij
    REAL               :: lmls
    REAL               :: vol
    REAL               :: mm
  ENDTYPE tParticle
******

Then I have this variables in order to create mine:

******
  INTEGER,                   ALLOCATABLE,DIMENSION(:)   :: TYPES,LENGTHS
  INTEGER(MPI_ADDRESS_KIND), ALLOCATABLE,DIMENSION(:)   :: DISPLACEMENTS
  TYPE(tParticle) :: dummy(2)
******

Having 5 structures:  Nstruct=5

In the following how I create my MPI data TYPE

******
ALLOCATE(TYPES          (Nstruct)    )
ALLOCATE(LENGTHS        (Nstruct)    )
ALLOCATE(DISPLACEMENTS  (0:nstruct+1))
!set the types
TYPES(1)   = MPI_INTEGER
TYPES(2)   = MPI_DOUBLE_PRECISION
TYPES(3)   = MPI_DOUBLE_PRECISION
TYPES(4)   = MPI_DOUBLE_PRECISION
TYPES(5)   = MPI_DOUBLE_PRECISION
!set the lengths
LENGTHS(1) = 4
LENGTHS(2) = SIZE(dummy(1)%RP)
LENGTHS(3) = SIZE(dummy(1)%QQ)
LENGTHS(4) = SIZE(dummy(1)%UU0)
LENGTHS(5) = 4
  !
  CALL MPI_GET_ADDRESS(dummy(1)        ,DISPLACEMENTS(0),MPIdata%iErr)
  CALL MPI_GET_ADDRESS(dummy(1)%ip     ,DISPLACEMENTS(1),MPIdata%iErr)
  CALL MPI_GET_ADDRESS(dummy(1)%RP(1)  ,DISPLACEMENTS(2),MPIdata%iErr)
  CALL MPI_GET_ADDRESS(dummy(1)%QQ(1)  ,DISPLACEMENTS(3),MPIdata%iErr)
  CALL MPI_GET_ADDRESS(dummy(1)%UU0(1) ,DISPLACEMENTS(4),MPIdata%iErr)
  CALL MPI_GET_ADDRESS(dummy(1)%lij    ,DISPLACEMENTS(5),MPIdata%iErr)
  CALL MPI_GET_ADDRESS(dummy(2)        ,DISPLACEMENTS(6),MPIdata%iErr)
  !
  DISPLACEMENTS(1:nstruct+1)= DISPLACEMENTS(1:nstruct+1)-DISPLACEMENTS(0)
  !
  CALL
MPI_TYPE_CREATE_STRUCT(nstruct,lengths,DISPLACEMENTS(1:nstruct+1),types,MPI_PARTICLE_TYPE_OLD,MPIdata%iErr)
  CALL MPI_TYPE_COMMIT(MPI_PARTICLE_TYPE_OLD,MPIdata%iErr)
  !
  CALL MPI_TYPE_CREATE_RESIZED(MPI_PARTICLE_TYPE_OLD, DISPLACEMENTS(1),
DISPLACEMENTS(6), MPI_PARTICLE_TYPE, MPIdata%iErr)
  CALL MPI_TYPE_COMMIT(MPI_PARTICLE_TYPE,MPIdata%iErr)


Do you see something wrong, maybe related to the DISPLACEMENTS. This
beacuse, As already told you, something has happend and I have just added
"    REAL               :: mm  "
 in my type and consequently set "LENGTHS(5) = 4 ".

What do you think?
Thanks in advance for any kind of help.

Best,

Diego

Reply via email to