module hpcmw_eps_fvm_util

!C
!C-- PARAMETERS
        include 'mpif.h'

        integer,parameter:: HPCMW_NAME_LEN     =   63
        integer,parameter:: HPCMW_HEADER_LEN   =  127
        integer,parameter:: HPCMW_MSG_LEN      =  255
        integer,parameter:: HPCMW_FILENAME_LEN = 1023
        integer:: kreal
        integer:: kint
        parameter (kreal= 8)
        parameter (kint = 4)

        integer, parameter :: hpcmw_sum              = 46801
        integer, parameter :: hpcmw_prod             = 46802
        integer, parameter :: hpcmw_max              = 46803
        integer, parameter :: hpcmw_min              = 46804
        integer, parameter :: hpcmw_integer          = 53951
        integer, parameter :: hpcmw_single_precision = 53952
        integer, parameter :: hpcmw_double_precision = 53953
        integer, parameter :: hpcmw_character        = 53954

!C
!C-- FILES
        character(HPCMW_FILENAME_LEN) :: hpcmw_eps_fvm_files (:)

!C
!C-- MESH
        integer :: NODE_tot, intNODE_tot
        integer :: NODE_GLOBAL(:)
        real (kind=kreal) :: NODE_VOL(:), NODE_COND(:), NODE_XYZ(:)

        integer :: CONN_tot
        integer :: CONN_NODE(:)
        real (kind=kreal) :: CONN_COEF(:)

        integer :: FIX_NODE_tot
        integer :: FIX_NODE_ID(:)
        real (kind=kreal) :: FIX_NODE_COEF(:), FIX_NODE_VAL(:)

        integer :: SURF_NODE_tot
        integer :: SURF_NODE_ID(:)
        real (kind=kreal) :: SURF_NODE_FLUX(:)

        integer :: BODY_NODE_tot
        integer :: BODY_NODE_ID(:)
        real (kind=kreal) :: BODY_NODE_FLUX(:)

!C
!C-- COMMUNICATION
          integer zero 
          integer PETOT, PEsmpTOT, my_rank, errno
          integer n_neighbor_pe
          integer :: neighbor_pe(:)
          integer :: import_index(:), import_item(:)
          integer :: export_index(:), export_item(:)

      contains


!C
!C***
!C*** HPCMW_EPS_FVM_INIT
!C***
!C
!C    INIT. HPCMW-FEM process's
!C
      subroutine HPCMW_EPS_FVM_INIT
      integer :: ierr

      call MPI_INIT      (ierr)
      call MPI_COMM_SIZE (MPI_COMM_WORLD, PETOT   , ierr)
      call MPI_COMM_RANK (MPI_COMM_WORLD, my_rank , ierr)

      if (my_rank.eq.0) then
        zero= 1
       else
        zero= 0
      endif

      end subroutine hpcmw_eps_fvm_init


!C
!C***
!C*** HPCMW_EPS_FVM_FINALIZE
!C***
!C
      subroutine HPCMW_EPS_FVM_FINALIZE
      integer :: ierr

      call MPI_FINALIZE (ierr)
      if (my_rank.eq.0) stop ' * normal termination'

      end subroutine hpcmw_eps_fvm_finalize


!C
!C***
!C*** HPCMW_EPS_FVM_ABORT
!C***
!C
      subroutine HPCMW_EPS_FVM_ABORT
      integer :: ierr, ier2

      call MPI_BARRIER (MPI_COMM_WORLD, ierr)
      call MPI_ABORT   (MPI_COMM_WORLD, ierr, ier2)

      end subroutine hpcmw_eps_fvm_abort


!C
!C***
!C*** HPCMW_EPS_FVM_DEFINE_FILE_NAME
!C***
!C
      subroutine HPCMW_EPS_FVM_DEFINE_FILE_NAME (member, HEADERo)

      character (len=HPCMW_HEADER_LEN) ::  HEADERo, FILENAME
      character (len=HPCMW_NAME_LEN)     ::  member
      character (len=HPCMW_NAME_LEN)     ::  HEADER
      character (len= 1) ::  SUBindex1
      character (len= 2) ::  SUBindex2
      character (len= 3) ::  SUBindex3
      character (len= 4) ::  SUBindex4
      character (len= 5) ::  SUBindex5
      character (len= 6) ::  SUBindex6
      integer:: LENGTH, ID
   
      HEADER= adjustL (HEADERo)
      LENGTH= len_trim(HEADER)

      if (my_rank.le.9) then
        ID= 1
        write(SUBindex1 ,'(i1.1)') my_rank
       else if (my_rank.le.99) then
        ID= 2
        write(SUBindex2 ,'(i2.2)') my_rank
       else if (my_rank.le.999) then
        ID= 3
        write(SUBindex3 ,'(i3.3)') my_rank
       else if (my_rank.le.9999) then
        ID= 4
        write(SUBindex5 ,'(i4.4)') my_rank
       else if (my_rank.le.99999) then
        ID= 5
        write(SUBindex6 ,'(i5.5)') my_rank
       else if (my_rank.le.999999) then
        ID= 6
        write(SUBindex4 ,'(i6.6)') my_rank
      endif

      if (ID.eq.1) filename= HEADER(1:LENGTH)//'.'//SUBindex1
      if (ID.eq.2) filename= HEADER(1:LENGTH)//'.'//SUBindex2
      if (ID.eq.3) filename= HEADER(1:LENGTH)//'.'//SUBindex3
      if (ID.eq.4) filename= HEADER(1:LENGTH)//'.'//SUBindex4
      if (ID.eq.5) filename= HEADER(1:LENGTH)//'.'//SUBindex5
      if (ID.eq.6) filename= HEADER(1:LENGTH)//'.'//SUBindex6

      if (member.eq. 'gridfile') hpcmw_eps_fvm_files(1)= filename
      if (member.eq. 'result'  ) hpcmw_eps_fvm_files(2)= filename
      if (member.eq. 'commfile') hpcmw_eps_fvm_files(4)= filename

      end subroutine hpcmw_eps_fvm_define_file_name


      end module hpcmw_eps_fvm_util