SF_BLACS.f90 Source File


Files dependent on this one

sourcefile~~sf_blacs.f90~~AfferentGraph sourcefile~sf_blacs.f90 SF_BLACS.f90 sourcefile~scifor.f90 SCIFOR.f90 sourcefile~scifor.f90->sourcefile~sf_blacs.f90 sourcefile~sf_linalg.f90 SF_LINALG.f90 sourcefile~scifor.f90->sourcefile~sf_linalg.f90 sourcefile~sf_optimize.f90 SF_OPTIMIZE.f90 sourcefile~scifor.f90->sourcefile~sf_optimize.f90 sourcefile~sf_sp_linalg.f90 SF_SP_LINALG.f90 sourcefile~scifor.f90->sourcefile~sf_sp_linalg.f90 sourcefile~sf_stat.f90 SF_STAT.f90 sourcefile~scifor.f90->sourcefile~sf_stat.f90 sourcefile~sf_linalg.f90->sourcefile~sf_blacs.f90 sourcefile~sf_optimize.f90->sourcefile~sf_linalg.f90 sourcefile~sf_sp_linalg.f90->sourcefile~sf_linalg.f90 sourcefile~sf_sparse.f90 SF_SPARSE.f90 sourcefile~sf_sparse.f90->sourcefile~sf_linalg.f90 sourcefile~sf_sparse_array_csc.f90 SF_SPARSE_ARRAY_CSC.f90 sourcefile~sf_sparse.f90->sourcefile~sf_sparse_array_csc.f90 sourcefile~sf_sparse_array_csr.f90 SF_SPARSE_ARRAY_CSR.f90 sourcefile~sf_sparse.f90->sourcefile~sf_sparse_array_csr.f90 sourcefile~sf_sparse_array_csc.f90->sourcefile~sf_linalg.f90 sourcefile~sf_sparse_common.f90 SF_SPARSE_COMMON.f90 sourcefile~sf_sparse_array_csc.f90->sourcefile~sf_sparse_common.f90 sourcefile~sf_sparse_array_csr.f90->sourcefile~sf_linalg.f90 sourcefile~sf_sparse_array_csr.f90->sourcefile~sf_sparse_common.f90 sourcefile~sf_sparse_common.f90->sourcefile~sf_linalg.f90 sourcefile~sf_stat.f90->sourcefile~sf_linalg.f90 sourcefile~sf_sparse_array_algebra.f90 SF_SPARSE_ARRAY_ALGEBRA.f90 sourcefile~sf_sparse_array_algebra.f90->sourcefile~sf_sparse_array_csc.f90 sourcefile~sf_sparse_array_algebra.f90->sourcefile~sf_sparse_array_csr.f90 sourcefile~sf_sparse_array_algebra.f90->sourcefile~sf_sparse_common.f90 sourcefile~sf_sparse_array_coo.f90 SF_SPARSE_ARRAY_COO.f90 sourcefile~sf_sparse_array_coo.f90->sourcefile~sf_sparse_common.f90

Source Code

MODULE SF_BLACS
  implicit none
  private

  integer :: p_rank=0
  integer :: p_size=1
  integer :: p_Nx=0
  integer :: p_Ny=0
  integer :: p_context=0
  logical :: blacs_status=.false.

  public :: p_rank
  public :: p_size
  public :: p_Nx,p_Ny
  public :: p_context
  public :: blacs_status


#ifdef _SCALAPACK
  public :: init_BLACS
  public :: finalize_BLACS
  public :: get_master_BLACS
  public :: get_rank_BLACS
  public :: get_size_BLACS
  !


contains

  subroutine init_BLACS()
    integer :: i
    !< Initialize BLACS processor grid (like MPI)
    call blacs_setup(p_rank,p_size)  ![id, size]
    !
    do i=1,int( sqrt( dble(p_size) ) + 1 )
       if(mod(p_size,i)==0) p_Nx = i
    end do
    p_Ny = p_size/p_Nx
    !
    !< Init context with p_Nx,p_Ny procs
    call sl_init(p_context,p_Nx,p_Ny)
    !
    blacs_status=.true.
  end subroutine init_BLACS


  subroutine finalize_BLACS(blacs_end)
    integer,optional :: blacs_end
    integer :: blacs_end_
    blacs_end_=0;if(present(blacs_end))blacs_end_=blacs_end
    call blacs_gridexit(p_context)
    call blacs_exit(blacs_end_)
    blacs_status=.false.
  end subroutine finalize_BLACS


  function get_master_BLACS() result(master)
    logical :: master
    if(.not.blacs_status)stop "get_master_BLACS error: blacs_status=F. call init_BLACS"
    master = p_rank==0
  end function get_master_BLACS

  function get_rank_BLACS() result(id)
    integer :: id
    if(.not.blacs_status)stop "get_master_BLACS error: blacs_status=F. call init_BLACS"
    id = p_rank
  end function get_rank_BLACS


  function get_size_BLACS() result(numproc)
    integer :: numproc
    if(.not.blacs_status)stop "get_master_BLACS error: blacs_status=F. call init_BLACS"
    numproc = p_size
  end function get_size_BLACS

#else


  public :: init_BLACS
  public :: finalize_BLACS
  public :: get_master_BLACS
  public :: get_rank_BLACS
  public :: get_size_BLACS
  !


contains

  !****************************************
  !              BLACS START/STOP
  !****************************************
  subroutine init_BLACS()
    return
  end subroutine init_BLACS

  subroutine finalize_BLACS(blacs_end)
    integer,optional :: blacs_end
    return
  end subroutine finalize_BLACS



  !****************************************
  !            BLACS BASIC FUNCTIONS
  !****************************************
  function get_master_BLACS() result(master)
    logical :: master
    master = .true.
  end function get_master_BLACS

  function get_rank_BLACS() result(id)
    integer :: id
    id = 0
  end function get_rank_BLACS

  function get_size_BLACS() result(numproc)
    integer :: numproc
    numproc = 1
  end function get_size_BLACS

#endif

END MODULE SF_BLACS