lagrangian_set_CreateMPIType Subroutine

private impure subroutine lagrangian_set_CreateMPIType(this)

Creates an MPI data type for parallel communication of the Lagrangian objects.

Type Bound

lagrangian_set

Arguments

Type IntentOptional Attributes Name
class(lagrangian_set), intent(inout) :: this

A set of Lagrangian objects


Calls

proc~~lagrangian_set_creatempitype~~CallsGraph proc~lagrangian_set_creatempitype lagrangian_set%lagrangian_set_CreateMPIType SetMPIDataTypeParams SetMPIDataTypeParams proc~lagrangian_set_creatempitype->SetMPIDataTypeParams mpi_type_commit mpi_type_commit proc~lagrangian_set_creatempitype->mpi_type_commit mpi_type_create_resized mpi_type_create_resized proc~lagrangian_set_creatempitype->mpi_type_create_resized mpi_type_create_struct mpi_type_create_struct proc~lagrangian_set_creatempitype->mpi_type_create_struct mpi_type_get_extent mpi_type_get_extent proc~lagrangian_set_creatempitype->mpi_type_get_extent mpi_type_size mpi_type_size proc~lagrangian_set_creatempitype->mpi_type_size

Called by

proc~~lagrangian_set_creatempitype~~CalledByGraph proc~lagrangian_set_creatempitype lagrangian_set%lagrangian_set_CreateMPIType proc~lagrangian_set_init lagrangian_set%lagrangian_set_Init proc~lagrangian_set_init->proc~lagrangian_set_creatempitype proc~marker_set_init marker_set%marker_set_Init proc~marker_set_init->proc~lagrangian_set_creatempitype proc~particle_set_changeparttype particle_set%particle_set_ChangePartType proc~particle_set_changeparttype->proc~lagrangian_set_creatempitype proc~respart_set_init ResPart_set%ResPart_set_Init proc~respart_set_init->proc~lagrangian_set_creatempitype none~initialize~27 marker_set%Initialize proc~respart_set_init->none~initialize~27 none~initialize~26 ResPart_set%Initialize none~initialize~26->proc~respart_set_init none~initialize~27->proc~respart_set_init none~initialize~28 particle_set%Initialize none~initialize~28->proc~respart_set_init none~initialize~29 solid_obj%Initialize none~initialize~29->proc~respart_set_init proc~particle_set_prepare particle_set%particle_set_Prepare proc~particle_set_prepare->proc~particle_set_changeparttype proc~setupcasepp SetUpCasePP proc~setupcasepp->proc~particle_set_changeparttype proc~setupcasepp->none~initialize~28 proc~setupcasepp~2 SetUpCasePP proc~setupcasepp~2->proc~particle_set_changeparttype proc~setupcasepp~2->none~initialize~28 proc~cdifs_obj_preparesolver cdifs_obj_PrepareSolver proc~cdifs_obj_preparesolver->none~initialize~26 proc~grans_obj_preparesolver grans_obj_PrepareSolver proc~grans_obj_preparesolver->none~initialize~27 proc~setupcaseib SetUpCaseIB proc~setupcaseib->none~initialize~27 proc~setupcaseib~2 SetUpCaseIB proc~setupcaseib~2->none~initialize~27 proc~setupcaseib~3 SetUpCaseIB proc~setupcaseib~3->none~initialize~27 proc~setupcaseib~4 SetUpCaseIB proc~setupcaseib~4->none~initialize~27 proc~setupcaserespart SetUpCaseResPart proc~setupcaserespart->none~initialize~26 proc~setupcaserespart~2 SetUpCaseResPart proc~setupcaserespart~2->none~initialize~26 proc~setupcaserp SetUpCaseRP proc~setupcaserp->none~initialize~26 proc~setupcaserp~2 SetUpCaseRP proc~setupcaserp~2->none~initialize~26 proc~setupcaserp~3 SetUpCaseRP proc~setupcaserp~3->none~initialize~26 proc~solid_set_init solid_set%solid_set_Init proc~solid_set_init->none~initialize~29 program~main~6 main program~main~6->proc~setupcasepp program~main~6->proc~setupcaserp~3 program~main~7 main program~main~7->proc~setupcasepp~2 interface~cdifs_obj_preparesolver cdifs_obj%cdifs_obj_PrepareSolver interface~cdifs_obj_preparesolver->proc~cdifs_obj_preparesolver interface~grans_obj_preparesolver grans_obj%grans_obj_PrepareSolver interface~grans_obj_preparesolver->proc~grans_obj_preparesolver program~main main program~main->proc~setupcaserespart program~main~14 main program~main~14->proc~setupcaseib~4 program~main~2 main program~main~2->proc~setupcaseib program~main~2->proc~setupcaserp program~main~4 main program~main~4->proc~setupcaseib~2 program~main~4->proc~setupcaserp~2 program~main~9 main program~main~9->proc~setupcaseib~3 program~main~9->proc~setupcaserespart~2

Source Code

    impure subroutine lagrangian_set_CreateMPIType(this)
      !> Creates an MPI data type for parallel communication
      ! of the Lagrangian objects.
      implicit none
      class(lagrangian_set), intent(inout) :: this                             !! A set of Lagrangian objects
      ! Work variables
      integer,                        allocatable :: lengths(:)
      type(MPI_DATATYPE),             allocatable :: types(:)
      integer(kind=MPI_ADDRESS_KIND), allocatable :: displacement(:)
      integer(kind=MPI_ADDRESS_KIND) :: extent,lb
      type(MPI_DATATYPE) :: type_tmp
      integer :: ierr

      associate(mpi=>this%parallel)
        ! Compute types, lengths and displacements
        call this%SetMPIDataTypeParams(types,lengths,displacement)

        ! Create MPI type
        call MPI_TYPE_CREATE_STRUCT(size(lengths),lengths,displacement,types,type_tmp,ierr)
        if (ierr.ne.0) error stop "Problem with MPI_TYPE"

        ! Get actual lower bound and extent of this type
        call MPI_TYPE_GET_EXTENT(type_tmp,lb,extent,ierr)
        if (ierr.ne.0) error stop "Problem with MPI_TYPE"

        ! Adjust upper and lower bounds
        call MPI_TYPE_CREATE_RESIZED(type_tmp,lb,extent,this%MPI_TYPE,ierr)
        call MPI_TYPE_COMMIT(this%MPI_TYPE,ierr)
        if (ierr.ne.0) error stop "Problem with MPI_TYPE"

        ! Get the size of this type
        call MPI_TYPE_SIZE(this%MPI_TYPE,this%MPI_SIZE,ierr)
        if (ierr.ne.0) error stop "Problem with MPI_TYPE"
      end associate

      return
    end subroutine lagrangian_set_CreateMPIType