Start of new interface handling for MUMPS.

stopcriterion
Salvatore Filippone 6 years ago
parent 5474accddd
commit 3d6d453fe4

@ -75,6 +75,8 @@
call psb_info(ictxt, me, np)
call psb_init(ictxt1,np=1,basectxt=ictxt,ids=(/me/))
call psb_get_mpicomm(ictxt1, icomm)
allocate(sv%local_ictxt,stat=info)
sv%local_ictxt = ictxt1
write(*,*)'mumps_bld: +++++>',icomm,ictxt1
call psb_info(ictxt1, me, np)
npr = np
@ -103,11 +105,22 @@
sv%id%comm = icomm
sv%id%job = -1
sv%id%par=1
sv%id%job = -1
sv%id%par = 1
call cmumps(sv%id)
!WARNING: CALLING cMUMPS WITH JOB=-1 DESTROY THE SETTING OF DEFAULT:TO FIX
if (allocated(sv%icntl)) then
do i=1,mld_mumps_icntl_size
if (allocated(sv%icntl(i)%item)) sv%id%icntl(i) = sv%icntl(i)%item
end do
end if
if (allocated(sv%rcntl)) then
do i=1,mld_mumps_rcntl_size
if (allocated(sv%rcntl(i)%item)) sv%id%cntl(i) = sv%rcntl(i)%item
end do
end if
sv%id%icntl(3)=sv%ipar(2)
nglob = desc_a%get_global_rows()
if (sv%ipar(1) < 0) then
nglobrec=desc_a%get_local_rows()
@ -127,10 +140,10 @@
call psb_loc_to_glob(acoo%ja(1:nztota), desc_a, info, iact='I')
call psb_loc_to_glob(acoo%ia(1:nztota), desc_a, info, iact='I')
end if
sv%id%irn_loc=> acoo%ia
sv%id%jcn_loc=> acoo%ja
sv%id%a_loc=> acoo%val
sv%id%icntl(18)=3
sv%id%irn_loc => acoo%ia
sv%id%jcn_loc => acoo%ja
sv%id%a_loc => acoo%val
sv%id%icntl(18) = 3
if(acoo%is_upper() .or. acoo%is_lower()) then
sv%id%sym = 2
else
@ -138,13 +151,13 @@
end if
sv%id%n = nglob
! there should be a better way for this
sv%id%nz_loc = acoo%get_nzeros()
sv%id%nz = acoo%get_nzeros()
sv%id%job = 4
call psb_barrier(ictxt)
sv%id%nz_loc = acoo%get_nzeros()
sv%id%nz = acoo%get_nzeros()
sv%id%job = 4
!call psb_barrier(ictxt)
write(*,*)'calling mumps N,nz,nz_loc',sv%id%n,sv%id%nz,sv%id%nz_loc
call cmumps(sv%id)
call psb_barrier(ictxt)
!call psb_barrier(ictxt)
info = sv%id%infog(1)
if (info /= psb_success_) then
info=psb_err_from_subroutine_

@ -75,6 +75,8 @@
call psb_info(ictxt, me, np)
call psb_init(ictxt1,np=1,basectxt=ictxt,ids=(/me/))
call psb_get_mpicomm(ictxt1, icomm)
allocate(sv%local_ictxt,stat=info)
sv%local_ictxt = ictxt1
write(*,*)'mumps_bld: +++++>',icomm,ictxt1
call psb_info(ictxt1, me, np)
npr = np
@ -103,11 +105,22 @@
sv%id%comm = icomm
sv%id%job = -1
sv%id%par=1
sv%id%job = -1
sv%id%par = 1
call dmumps(sv%id)
!WARNING: CALLING dMUMPS WITH JOB=-1 DESTROY THE SETTING OF DEFAULT:TO FIX
if (allocated(sv%icntl)) then
do i=1,mld_mumps_icntl_size
if (allocated(sv%icntl(i)%item)) sv%id%icntl(i) = sv%icntl(i)%item
end do
end if
if (allocated(sv%rcntl)) then
do i=1,mld_mumps_rcntl_size
if (allocated(sv%rcntl(i)%item)) sv%id%cntl(i) = sv%rcntl(i)%item
end do
end if
sv%id%icntl(3)=sv%ipar(2)
nglob = desc_a%get_global_rows()
if (sv%ipar(1) < 0) then
nglobrec=desc_a%get_local_rows()
@ -127,10 +140,10 @@
call psb_loc_to_glob(acoo%ja(1:nztota), desc_a, info, iact='I')
call psb_loc_to_glob(acoo%ia(1:nztota), desc_a, info, iact='I')
end if
sv%id%irn_loc=> acoo%ia
sv%id%jcn_loc=> acoo%ja
sv%id%a_loc=> acoo%val
sv%id%icntl(18)=3
sv%id%irn_loc => acoo%ia
sv%id%jcn_loc => acoo%ja
sv%id%a_loc => acoo%val
sv%id%icntl(18) = 3
if(acoo%is_upper() .or. acoo%is_lower()) then
sv%id%sym = 2
else
@ -138,13 +151,13 @@
end if
sv%id%n = nglob
! there should be a better way for this
sv%id%nz_loc = acoo%get_nzeros()
sv%id%nz = acoo%get_nzeros()
sv%id%job = 4
call psb_barrier(ictxt)
sv%id%nz_loc = acoo%get_nzeros()
sv%id%nz = acoo%get_nzeros()
sv%id%job = 4
!call psb_barrier(ictxt)
write(*,*)'calling mumps N,nz,nz_loc',sv%id%n,sv%id%nz,sv%id%nz_loc
call dmumps(sv%id)
call psb_barrier(ictxt)
!call psb_barrier(ictxt)
info = sv%id%infog(1)
if (info /= psb_success_) then
info=psb_err_from_subroutine_

@ -75,6 +75,8 @@
call psb_info(ictxt, me, np)
call psb_init(ictxt1,np=1,basectxt=ictxt,ids=(/me/))
call psb_get_mpicomm(ictxt1, icomm)
allocate(sv%local_ictxt,stat=info)
sv%local_ictxt = ictxt1
write(*,*)'mumps_bld: +++++>',icomm,ictxt1
call psb_info(ictxt1, me, np)
npr = np
@ -103,11 +105,22 @@
sv%id%comm = icomm
sv%id%job = -1
sv%id%par=1
sv%id%job = -1
sv%id%par = 1
call smumps(sv%id)
!WARNING: CALLING sMUMPS WITH JOB=-1 DESTROY THE SETTING OF DEFAULT:TO FIX
if (allocated(sv%icntl)) then
do i=1,mld_mumps_icntl_size
if (allocated(sv%icntl(i)%item)) sv%id%icntl(i) = sv%icntl(i)%item
end do
end if
if (allocated(sv%rcntl)) then
do i=1,mld_mumps_rcntl_size
if (allocated(sv%rcntl(i)%item)) sv%id%cntl(i) = sv%rcntl(i)%item
end do
end if
sv%id%icntl(3)=sv%ipar(2)
nglob = desc_a%get_global_rows()
if (sv%ipar(1) < 0) then
nglobrec=desc_a%get_local_rows()
@ -127,10 +140,10 @@
call psb_loc_to_glob(acoo%ja(1:nztota), desc_a, info, iact='I')
call psb_loc_to_glob(acoo%ia(1:nztota), desc_a, info, iact='I')
end if
sv%id%irn_loc=> acoo%ia
sv%id%jcn_loc=> acoo%ja
sv%id%a_loc=> acoo%val
sv%id%icntl(18)=3
sv%id%irn_loc => acoo%ia
sv%id%jcn_loc => acoo%ja
sv%id%a_loc => acoo%val
sv%id%icntl(18) = 3
if(acoo%is_upper() .or. acoo%is_lower()) then
sv%id%sym = 2
else
@ -138,13 +151,13 @@
end if
sv%id%n = nglob
! there should be a better way for this
sv%id%nz_loc = acoo%get_nzeros()
sv%id%nz = acoo%get_nzeros()
sv%id%job = 4
call psb_barrier(ictxt)
sv%id%nz_loc = acoo%get_nzeros()
sv%id%nz = acoo%get_nzeros()
sv%id%job = 4
!call psb_barrier(ictxt)
write(*,*)'calling mumps N,nz,nz_loc',sv%id%n,sv%id%nz,sv%id%nz_loc
call smumps(sv%id)
call psb_barrier(ictxt)
!call psb_barrier(ictxt)
info = sv%id%infog(1)
if (info /= psb_success_) then
info=psb_err_from_subroutine_

@ -75,6 +75,8 @@
call psb_info(ictxt, me, np)
call psb_init(ictxt1,np=1,basectxt=ictxt,ids=(/me/))
call psb_get_mpicomm(ictxt1, icomm)
allocate(sv%local_ictxt,stat=info)
sv%local_ictxt = ictxt1
write(*,*)'mumps_bld: +++++>',icomm,ictxt1
call psb_info(ictxt1, me, np)
npr = np
@ -103,11 +105,22 @@
sv%id%comm = icomm
sv%id%job = -1
sv%id%par=1
sv%id%job = -1
sv%id%par = 1
call zmumps(sv%id)
!WARNING: CALLING zMUMPS WITH JOB=-1 DESTROY THE SETTING OF DEFAULT:TO FIX
if (allocated(sv%icntl)) then
do i=1,mld_mumps_icntl_size
if (allocated(sv%icntl(i)%item)) sv%id%icntl(i) = sv%icntl(i)%item
end do
end if
if (allocated(sv%rcntl)) then
do i=1,mld_mumps_rcntl_size
if (allocated(sv%rcntl(i)%item)) sv%id%cntl(i) = sv%rcntl(i)%item
end do
end if
sv%id%icntl(3)=sv%ipar(2)
nglob = desc_a%get_global_rows()
if (sv%ipar(1) < 0) then
nglobrec=desc_a%get_local_rows()
@ -127,10 +140,10 @@
call psb_loc_to_glob(acoo%ja(1:nztota), desc_a, info, iact='I')
call psb_loc_to_glob(acoo%ia(1:nztota), desc_a, info, iact='I')
end if
sv%id%irn_loc=> acoo%ia
sv%id%jcn_loc=> acoo%ja
sv%id%a_loc=> acoo%val
sv%id%icntl(18)=3
sv%id%irn_loc => acoo%ia
sv%id%jcn_loc => acoo%ja
sv%id%a_loc => acoo%val
sv%id%icntl(18) = 3
if(acoo%is_upper() .or. acoo%is_lower()) then
sv%id%sym = 2
else
@ -138,13 +151,13 @@
end if
sv%id%n = nglob
! there should be a better way for this
sv%id%nz_loc = acoo%get_nzeros()
sv%id%nz = acoo%get_nzeros()
sv%id%job = 4
call psb_barrier(ictxt)
sv%id%nz_loc = acoo%get_nzeros()
sv%id%nz = acoo%get_nzeros()
sv%id%job = 4
!call psb_barrier(ictxt)
write(*,*)'calling mumps N,nz,nz_loc',sv%id%n,sv%id%nz,sv%id%nz_loc
call zmumps(sv%id)
call psb_barrier(ictxt)
!call psb_barrier(ictxt)
info = sv%id%infog(1)
if (info /= psb_success_) then
info=psb_err_from_subroutine_

@ -295,6 +295,9 @@ module mld_base_prec_type
integer(psb_ipk_), parameter :: mld_as_sequential_ = 40
!parameter regulating the error printing of MUMPS
integer(psb_ipk_), parameter :: mld_mumps_print_err_ = 41
! Size of the control vectors
integer, parameter :: mld_mumps_icntl_size=40
integer, parameter :: mld_mumps_rcntl_size=15
!
! Fields for sparse matrices ensembles stored in av()

@ -61,14 +61,25 @@ module mld_c_mumps_solver
end type mld_c_mumps_solver_type
#else
type :: mld_c_mumps_icntl_item
integer(psb_ipk_), allocatable :: item
end type mld_c_mumps_icntl_item
type :: mld_c_mumps_rcntl_item
real(psb_spk_), allocatable :: item
end type mld_c_mumps_rcntl_item
type, extends(mld_c_base_solver_type) :: mld_c_mumps_solver_type
#if defined(HAVE_MUMPS_)
type(cmumps_struc), allocatable :: id
#else
integer, allocatable :: id
#endif
integer(psb_ipk_),dimension(2) :: ipar
logical :: built=.false.
type(mld_c_mumps_icntl_item), allocatable :: icntl(:)
type(mld_c_mumps_rcntl_item), allocatable :: rcntl(:)
integer(psb_ipk_), dimension(2) :: ipar
integer(psb_ipk_), allocatable :: local_ictxt
logical :: built = .false.
contains
procedure, pass(sv) :: build => c_mumps_solver_bld
procedure, pass(sv) :: apply_a => c_mumps_solver_apply
@ -160,7 +171,7 @@ module mld_c_mumps_solver
contains
subroutine c_mumps_solver_free(sv,info)
use psb_base_mod, only : psb_exit
Implicit None
! Arguments
@ -178,7 +189,11 @@ contains
info = sv%id%infog(1)
if (info /= psb_success_) goto 9999
end if
deallocate(sv%id)
deallocate(sv%id, sv%icntl, sv%rcntl)
if (allocated(sv%local_ictxt)) then
call psb_exit(sv%local_ictxt,close=.false.)
deallocate(sv%local_ictxt)
end if
sv%built=.false.
end if
call psb_erractionrestore(err_act)
@ -279,7 +294,7 @@ contains
sv%ipar(2)=val
case('MUMPS_IPAR_ENTRY')
if(present(idx)) then
sv%ipar(idx)=val
sv%icntl(idx)%item = val
end if
#endif
case default
@ -315,6 +330,12 @@ contains
call psb_erractionsave(err_act)
select case(psb_toupper(what))
#if defined(HAVE_MUMPS_)
case('MUMPS_RPAR_ENTRY')
if(present(idx)) then
sv%rcntl(idx)%item = val
end if
#endif
case default
call sv%mld_c_base_solver_type%set(what,val,info,idx=idx)
end select
@ -355,7 +376,22 @@ contains
end if
sv%built=.false.
end if
if (.not.allocated(sv%icntl)) then
allocate(sv%icntl(mld_mumps_icntl_size),stat=info)
if (info /= psb_success_) then
info=psb_err_alloc_dealloc_
call psb_errpush(info,name,a_err='mld_cmumps_default')
goto 9999
end if
end if
if (.not.allocated(sv%rcntl)) then
allocate(sv%rcntl(mld_mumps_rcntl_size),stat=info)
if (info /= psb_success_) then
info=psb_err_alloc_dealloc_
call psb_errpush(info,name,a_err='mld_cmumps_default')
goto 9999
end if
end if
! INSTANTIATION OF sv%id needed to set parmater but mpi communicator needed
! sv%id%job = -1
! sv%id%par=1

@ -61,14 +61,25 @@ module mld_d_mumps_solver
end type mld_d_mumps_solver_type
#else
type :: mld_d_mumps_icntl_item
integer(psb_ipk_), allocatable :: item
end type mld_d_mumps_icntl_item
type :: mld_d_mumps_rcntl_item
real(psb_dpk_), allocatable :: item
end type mld_d_mumps_rcntl_item
type, extends(mld_d_base_solver_type) :: mld_d_mumps_solver_type
#if defined(HAVE_MUMPS_)
type(dmumps_struc), allocatable :: id
#else
integer, allocatable :: id
#endif
integer(psb_ipk_),dimension(2) :: ipar
logical :: built=.false.
type(mld_d_mumps_icntl_item), allocatable :: icntl(:)
type(mld_d_mumps_rcntl_item), allocatable :: rcntl(:)
integer(psb_ipk_), dimension(2) :: ipar
integer(psb_ipk_), allocatable :: local_ictxt
logical :: built = .false.
contains
procedure, pass(sv) :: build => d_mumps_solver_bld
procedure, pass(sv) :: apply_a => d_mumps_solver_apply
@ -160,7 +171,7 @@ module mld_d_mumps_solver
contains
subroutine d_mumps_solver_free(sv,info)
use psb_base_mod, only : psb_exit
Implicit None
! Arguments
@ -178,7 +189,11 @@ contains
info = sv%id%infog(1)
if (info /= psb_success_) goto 9999
end if
deallocate(sv%id)
deallocate(sv%id, sv%icntl, sv%rcntl)
if (allocated(sv%local_ictxt)) then
call psb_exit(sv%local_ictxt,close=.false.)
deallocate(sv%local_ictxt)
end if
sv%built=.false.
end if
call psb_erractionrestore(err_act)
@ -279,7 +294,7 @@ contains
sv%ipar(2)=val
case('MUMPS_IPAR_ENTRY')
if(present(idx)) then
sv%ipar(idx)=val
sv%icntl(idx)%item = val
end if
#endif
case default
@ -315,6 +330,12 @@ contains
call psb_erractionsave(err_act)
select case(psb_toupper(what))
#if defined(HAVE_MUMPS_)
case('MUMPS_RPAR_ENTRY')
if(present(idx)) then
sv%rcntl(idx)%item = val
end if
#endif
case default
call sv%mld_d_base_solver_type%set(what,val,info,idx=idx)
end select
@ -355,7 +376,22 @@ contains
end if
sv%built=.false.
end if
if (.not.allocated(sv%icntl)) then
allocate(sv%icntl(mld_mumps_icntl_size),stat=info)
if (info /= psb_success_) then
info=psb_err_alloc_dealloc_
call psb_errpush(info,name,a_err='mld_dmumps_default')
goto 9999
end if
end if
if (.not.allocated(sv%rcntl)) then
allocate(sv%rcntl(mld_mumps_rcntl_size),stat=info)
if (info /= psb_success_) then
info=psb_err_alloc_dealloc_
call psb_errpush(info,name,a_err='mld_dmumps_default')
goto 9999
end if
end if
! INSTANTIATION OF sv%id needed to set parmater but mpi communicator needed
! sv%id%job = -1
! sv%id%par=1

@ -61,14 +61,25 @@ module mld_s_mumps_solver
end type mld_s_mumps_solver_type
#else
type :: mld_s_mumps_icntl_item
integer(psb_ipk_), allocatable :: item
end type mld_s_mumps_icntl_item
type :: mld_s_mumps_rcntl_item
real(psb_spk_), allocatable :: item
end type mld_s_mumps_rcntl_item
type, extends(mld_s_base_solver_type) :: mld_s_mumps_solver_type
#if defined(HAVE_MUMPS_)
type(smumps_struc), allocatable :: id
#else
integer, allocatable :: id
#endif
integer(psb_ipk_),dimension(2) :: ipar
logical :: built=.false.
type(mld_s_mumps_icntl_item), allocatable :: icntl(:)
type(mld_s_mumps_rcntl_item), allocatable :: rcntl(:)
integer(psb_ipk_), dimension(2) :: ipar
integer(psb_ipk_), allocatable :: local_ictxt
logical :: built = .false.
contains
procedure, pass(sv) :: build => s_mumps_solver_bld
procedure, pass(sv) :: apply_a => s_mumps_solver_apply
@ -160,7 +171,7 @@ module mld_s_mumps_solver
contains
subroutine s_mumps_solver_free(sv,info)
use psb_base_mod, only : psb_exit
Implicit None
! Arguments
@ -178,7 +189,11 @@ contains
info = sv%id%infog(1)
if (info /= psb_success_) goto 9999
end if
deallocate(sv%id)
deallocate(sv%id, sv%icntl, sv%rcntl)
if (allocated(sv%local_ictxt)) then
call psb_exit(sv%local_ictxt,close=.false.)
deallocate(sv%local_ictxt)
end if
sv%built=.false.
end if
call psb_erractionrestore(err_act)
@ -279,7 +294,7 @@ contains
sv%ipar(2)=val
case('MUMPS_IPAR_ENTRY')
if(present(idx)) then
sv%ipar(idx)=val
sv%icntl(idx)%item = val
end if
#endif
case default
@ -315,6 +330,12 @@ contains
call psb_erractionsave(err_act)
select case(psb_toupper(what))
#if defined(HAVE_MUMPS_)
case('MUMPS_RPAR_ENTRY')
if(present(idx)) then
sv%rcntl(idx)%item = val
end if
#endif
case default
call sv%mld_s_base_solver_type%set(what,val,info,idx=idx)
end select
@ -355,7 +376,22 @@ contains
end if
sv%built=.false.
end if
if (.not.allocated(sv%icntl)) then
allocate(sv%icntl(mld_mumps_icntl_size),stat=info)
if (info /= psb_success_) then
info=psb_err_alloc_dealloc_
call psb_errpush(info,name,a_err='mld_smumps_default')
goto 9999
end if
end if
if (.not.allocated(sv%rcntl)) then
allocate(sv%rcntl(mld_mumps_rcntl_size),stat=info)
if (info /= psb_success_) then
info=psb_err_alloc_dealloc_
call psb_errpush(info,name,a_err='mld_smumps_default')
goto 9999
end if
end if
! INSTANTIATION OF sv%id needed to set parmater but mpi communicator needed
! sv%id%job = -1
! sv%id%par=1

@ -61,14 +61,25 @@ module mld_z_mumps_solver
end type mld_z_mumps_solver_type
#else
type :: mld_z_mumps_icntl_item
integer(psb_ipk_), allocatable :: item
end type mld_z_mumps_icntl_item
type :: mld_z_mumps_rcntl_item
real(psb_dpk_), allocatable :: item
end type mld_z_mumps_rcntl_item
type, extends(mld_z_base_solver_type) :: mld_z_mumps_solver_type
#if defined(HAVE_MUMPS_)
type(zmumps_struc), allocatable :: id
#else
integer, allocatable :: id
#endif
integer(psb_ipk_),dimension(2) :: ipar
logical :: built=.false.
type(mld_z_mumps_icntl_item), allocatable :: icntl(:)
type(mld_z_mumps_rcntl_item), allocatable :: rcntl(:)
integer(psb_ipk_), dimension(2) :: ipar
integer(psb_ipk_), allocatable :: local_ictxt
logical :: built = .false.
contains
procedure, pass(sv) :: build => z_mumps_solver_bld
procedure, pass(sv) :: apply_a => z_mumps_solver_apply
@ -160,7 +171,7 @@ module mld_z_mumps_solver
contains
subroutine z_mumps_solver_free(sv,info)
use psb_base_mod, only : psb_exit
Implicit None
! Arguments
@ -178,7 +189,11 @@ contains
info = sv%id%infog(1)
if (info /= psb_success_) goto 9999
end if
deallocate(sv%id)
deallocate(sv%id, sv%icntl, sv%rcntl)
if (allocated(sv%local_ictxt)) then
call psb_exit(sv%local_ictxt,close=.false.)
deallocate(sv%local_ictxt)
end if
sv%built=.false.
end if
call psb_erractionrestore(err_act)
@ -279,7 +294,7 @@ contains
sv%ipar(2)=val
case('MUMPS_IPAR_ENTRY')
if(present(idx)) then
sv%ipar(idx)=val
sv%icntl(idx)%item = val
end if
#endif
case default
@ -315,6 +330,12 @@ contains
call psb_erractionsave(err_act)
select case(psb_toupper(what))
#if defined(HAVE_MUMPS_)
case('MUMPS_RPAR_ENTRY')
if(present(idx)) then
sv%rcntl(idx)%item = val
end if
#endif
case default
call sv%mld_z_base_solver_type%set(what,val,info,idx=idx)
end select
@ -355,7 +376,22 @@ contains
end if
sv%built=.false.
end if
if (.not.allocated(sv%icntl)) then
allocate(sv%icntl(mld_mumps_icntl_size),stat=info)
if (info /= psb_success_) then
info=psb_err_alloc_dealloc_
call psb_errpush(info,name,a_err='mld_zmumps_default')
goto 9999
end if
end if
if (.not.allocated(sv%rcntl)) then
allocate(sv%rcntl(mld_mumps_rcntl_size),stat=info)
if (info /= psb_success_) then
info=psb_err_alloc_dealloc_
call psb_errpush(info,name,a_err='mld_zmumps_default')
goto 9999
end if
end if
! INSTANTIATION OF sv%id needed to set parmater but mpi communicator needed
! sv%id%job = -1
! sv%id%par=1

Loading…
Cancel
Save