diff --git a/mlprec/impl/mld_cmlprec_bld.f90 b/mlprec/impl/mld_cmlprec_bld.f90 index 6ccadf6d..b3d6430a 100644 --- a/mlprec/impl/mld_cmlprec_bld.f90 +++ b/mlprec/impl/mld_cmlprec_bld.f90 @@ -162,182 +162,182 @@ subroutine mld_cmlprec_bld(a,desc_a,p,info,amold,vmold) endif - if (iszv > 1) then + if (iszv > 1) then - ! - ! Build the matrix and the transfer operators corresponding - ! to the remaining levels - ! + ! + ! Build the matrix and the transfer operators corresponding + ! to the remaining levels + ! + ! + ! Check on the iprcparm contents: they should be the same + ! on all processes. + ! + call psb_bcast(ictxt,p%precv(1)%parms) + ! + ! Finest level first; remember to fix base_a and base_desc + ! + p%precv(1)%base_a => a + p%precv(1)%base_desc => desc_a + + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='Base level precbuild.') + goto 9999 + end if + + + do i=2, iszv ! ! Check on the iprcparm contents: they should be the same ! on all processes. ! - call psb_bcast(ictxt,p%precv(1)%parms) - ! - ! Finest level first; remember to fix base_a and base_desc - ! - p%precv(1)%base_a => a - p%precv(1)%base_desc => desc_a - - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='Base level precbuild.') - goto 9999 - end if - - - do i=2, iszv - ! - ! Check on the iprcparm contents: they should be the same - ! on all processes. - ! - call psb_bcast(ictxt,p%precv(1)%parms) + call psb_bcast(ictxt,p%precv(i)%parms) + ! + ! Sanity checks on the parameters + ! + if (i= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & 'Calling mlprcbld at level ',i - ! - ! Build the mapping between levels i-1 and i and the matrix - ! at level i - ! - if (info == psb_success_) call mld_coarse_bld(p%precv(i-1)%base_a,& - & p%precv(i-1)%base_desc, p%precv(i),info) - - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,& - & a_err='Init upper level preconditioner') - goto 9999 - endif - - if (debug_level >= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & 'Return from ',i,' call to mlprcbld ',info - - if (i>2) then - if (all(p%precv(i)%map%naggr == p%precv(i-1)%map%naggr)) then - newsz=i-1 - end if - call psb_bcast(ictxt,newsz) - if (newsz > 0) exit - end if - end do - - if (newsz > 0) then - if (me == 0) then - write(debug_unit,*) trim(name),& - &': Warning: aggregates from level ',& - & newsz - write(debug_unit,*) trim(name),& - &': to level ',& - & iszv,' coincide.' - write(debug_unit,*) trim(name),& - &': Number of levels actually used :',newsz - write(debug_unit,*) - end if - allocate(t_prec%precv(newsz),stat=info) - if (info /= psb_success_) then - call psb_errpush(psb_err_from_subroutine_,name,& - & a_err='prec reallocation') - goto 9999 - endif - do i=1,newsz-1 - call mld_move_alloc(p%precv(i),t_prec%precv(i),info) - end do - call mld_move_alloc(p%precv(iszv),t_prec%precv(newsz),info) - do i=newsz+1, iszv - call p%precv(i)%free(info) - end do - call mld_move_alloc(t_prec,p,info) - ! Ignore errors from transfer - info = psb_success_ - ! - ! Restart - iszv = newsz - ! Fix the pointers, but the level 1 should - ! be already OK - do i=2, iszv - 1 - p%precv(i)%base_a => p%precv(i)%ac - p%precv(i)%base_desc => p%precv(i)%desc_ac - p%precv(i)%map%p_desc_X => p%precv(i-1)%base_desc - p%precv(i)%map%p_desc_Y => p%precv(i)%base_desc - end do - - - i = iszv - call check_coarse_lev(p%precv(i)) - if (info == psb_success_) call mld_coarse_bld(p%precv(i-1)%base_a,& - & p%precv(i-1)%base_desc, p%precv(i),info) - if (info /= psb_success_) then - call psb_errpush(psb_err_from_subroutine_,name,a_err='coarse rebuild') - goto 9999 - endif end if - end if - do i=1, iszv - ! - ! build the base preconditioner at level i - ! if (debug_level >= psb_debug_outer_) & & write(debug_unit,*) me,' ',trim(name),& & 'Calling mlprcbld at level ',i - call mld_check_def(p%precv(i)%parms%sweeps,& - & 'Jacobi sweeps',1,is_legal_jac_sweeps) - call mld_check_def(p%precv(i)%parms%sweeps_pre,& - & 'Jacobi sweeps',1,is_legal_jac_sweeps) - call mld_check_def(p%precv(i)%parms%sweeps_post,& - & 'Jacobi sweeps',1,is_legal_jac_sweeps) - - if (.not.allocated(p%precv(i)%sm)) then - !! Error: should have called mld_dprecinit - info=3111 - call psb_errpush(info,name) - goto 9999 - end if - if (.not.allocated(p%precv(i)%sm%sv)) then - !! Error: should have called mld_dprecinit - info=3111 - call psb_errpush(info,name) - goto 9999 - end if - - ! - ! Test version for beginning of OO stuff. + ! Build the mapping between levels i-1 and i and the matrix + ! at level i ! - call p%precv(i)%sm%build(p%precv(i)%base_a,p%precv(i)%base_desc,& - & 'F',info,amold=amold,vmold=vmold) + if (info == psb_success_) call mld_coarse_bld(p%precv(i-1)%base_a,& + & p%precv(i-1)%base_desc, p%precv(i),info) - if ((info == psb_success_).and.(i>1).and.(present(amold))) then - call psb_map_cscnv(p%precv(i)%map,info,mold=amold) - call p%precv(i)%ac%cscnv(info,mold=amold) - end if if (info /= psb_success_) then call psb_errpush(psb_err_internal_error_,name,& - & a_err='One level preconditioner build.') + & a_err='Init upper level preconditioner') goto 9999 endif if (debug_level >= psb_debug_outer_) & & write(debug_unit,*) me,' ',trim(name),& & 'Return from ',i,' call to mlprcbld ',info + + if (i>2) then + if (all(p%precv(i)%map%naggr == p%precv(i-1)%map%naggr)) then + newsz=i-1 + end if + call psb_bcast(ictxt,newsz) + if (newsz > 0) exit + end if end do + if (newsz > 0) then + if (me == 0) then + write(debug_unit,*) trim(name),& + &': Warning: aggregates from level ',& + & newsz + write(debug_unit,*) trim(name),& + &': to level ',& + & iszv,' coincide.' + write(debug_unit,*) trim(name),& + &': Number of levels actually used :',newsz + write(debug_unit,*) + end if + allocate(t_prec%precv(newsz),stat=info) + if (info /= psb_success_) then + call psb_errpush(psb_err_from_subroutine_,name,& + & a_err='prec reallocation') + goto 9999 + endif + do i=1,newsz-1 + call mld_move_alloc(p%precv(i),t_prec%precv(i),info) + end do + call mld_move_alloc(p%precv(iszv),t_prec%precv(newsz),info) + do i=newsz+1, iszv + call p%precv(i)%free(info) + end do + call mld_move_alloc(t_prec,p,info) + ! Ignore errors from transfer + info = psb_success_ + ! + ! Restart + iszv = newsz + ! Fix the pointers, but the level 1 should + ! be already OK + do i=2, iszv - 1 + p%precv(i)%base_a => p%precv(i)%ac + p%precv(i)%base_desc => p%precv(i)%desc_ac + p%precv(i)%map%p_desc_X => p%precv(i-1)%base_desc + p%precv(i)%map%p_desc_Y => p%precv(i)%base_desc + end do + + + i = iszv + call check_coarse_lev(p%precv(i)) + if (info == psb_success_) call mld_coarse_bld(p%precv(i-1)%base_a,& + & p%precv(i-1)%base_desc, p%precv(i),info) + if (info /= psb_success_) then + call psb_errpush(psb_err_from_subroutine_,name,a_err='coarse rebuild') + goto 9999 + endif + end if + end if + + do i=1, iszv + ! + ! build the base preconditioner at level i + ! + if (debug_level >= psb_debug_outer_) & + & write(debug_unit,*) me,' ',trim(name),& + & 'Calling mlprcbld at level ',i + call mld_check_def(p%precv(i)%parms%sweeps,& + & 'Jacobi sweeps',1,is_legal_jac_sweeps) + call mld_check_def(p%precv(i)%parms%sweeps_pre,& + & 'Jacobi sweeps',1,is_legal_jac_sweeps) + call mld_check_def(p%precv(i)%parms%sweeps_post,& + & 'Jacobi sweeps',1,is_legal_jac_sweeps) + + if (.not.allocated(p%precv(i)%sm)) then + !! Error: should have called mld_dprecinit + info=3111 + call psb_errpush(info,name) + goto 9999 + end if + if (.not.allocated(p%precv(i)%sm%sv)) then + !! Error: should have called mld_dprecinit + info=3111 + call psb_errpush(info,name) + goto 9999 + end if + + + ! + ! Test version for beginning of OO stuff. + ! + call p%precv(i)%sm%build(p%precv(i)%base_a,p%precv(i)%base_desc,& + & 'F',info,amold=amold,vmold=vmold) + + if ((info == psb_success_).and.(i>1).and.(present(amold))) then + call psb_map_cscnv(p%precv(i)%map,info,mold=amold) + call p%precv(i)%ac%cscnv(info,mold=amold) + end if + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,& + & a_err='One level preconditioner build.') + goto 9999 + endif + + if (debug_level >= psb_debug_outer_) & + & write(debug_unit,*) me,' ',trim(name),& + & 'Return from ',i,' call to mlprcbld ',info + end do + call psb_erractionrestore(err_act) return diff --git a/mlprec/impl/mld_daggrmap_bld.f90 b/mlprec/impl/mld_daggrmap_bld.f90 index dc049b6e..086bd6f9 100644 --- a/mlprec/impl/mld_daggrmap_bld.f90 +++ b/mlprec/impl/mld_daggrmap_bld.f90 @@ -133,7 +133,7 @@ subroutine mld_daggrmap_bld(aggr_type,theta,a,desc_a,ilaggr,nlaggr,info) call atmp%set_ncols(nr) if (info == psb_success_) call atrans%free() if (info == psb_success_) call atmp%cscnv(info,type='CSR') - if (info == psb_success_) call mld_dec_map_bld(theta,atmp,desc_a,nlaggr,ilaggr,info) + if (info == psb_success_) call mld_dec_map_bld(theta,atmp,desc_a,nlaggr,ilaggr,info) if (info == psb_success_) call atmp%free() case default diff --git a/mlprec/impl/mld_dmlprec_bld.f90 b/mlprec/impl/mld_dmlprec_bld.f90 index 18189e4b..0051fe69 100644 --- a/mlprec/impl/mld_dmlprec_bld.f90 +++ b/mlprec/impl/mld_dmlprec_bld.f90 @@ -162,182 +162,182 @@ subroutine mld_dmlprec_bld(a,desc_a,p,info,amold,vmold) endif - if (iszv > 1) then + if (iszv > 1) then - ! - ! Build the matrix and the transfer operators corresponding - ! to the remaining levels - ! + ! + ! Build the matrix and the transfer operators corresponding + ! to the remaining levels + ! + ! + ! Check on the iprcparm contents: they should be the same + ! on all processes. + ! + call psb_bcast(ictxt,p%precv(1)%parms) + ! + ! Finest level first; remember to fix base_a and base_desc + ! + p%precv(1)%base_a => a + p%precv(1)%base_desc => desc_a + + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='Base level precbuild.') + goto 9999 + end if + + + do i=2, iszv ! ! Check on the iprcparm contents: they should be the same ! on all processes. ! - call psb_bcast(ictxt,p%precv(1)%parms) - ! - ! Finest level first; remember to fix base_a and base_desc - ! - p%precv(1)%base_a => a - p%precv(1)%base_desc => desc_a - - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='Base level precbuild.') - goto 9999 - end if - - - do i=2, iszv - ! - ! Check on the iprcparm contents: they should be the same - ! on all processes. - ! - call psb_bcast(ictxt,p%precv(1)%parms) + call psb_bcast(ictxt,p%precv(i)%parms) + ! + ! Sanity checks on the parameters + ! + if (i= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & 'Calling mlprcbld at level ',i - ! - ! Build the mapping between levels i-1 and i and the matrix - ! at level i - ! - if (info == psb_success_) call mld_coarse_bld(p%precv(i-1)%base_a,& - & p%precv(i-1)%base_desc, p%precv(i),info) - - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,& - & a_err='Init upper level preconditioner') - goto 9999 - endif - - if (debug_level >= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & 'Return from ',i,' call to mlprcbld ',info - - if (i>2) then - if (all(p%precv(i)%map%naggr == p%precv(i-1)%map%naggr)) then - newsz=i-1 - end if - call psb_bcast(ictxt,newsz) - if (newsz > 0) exit - end if - end do - - if (newsz > 0) then - if (me == 0) then - write(debug_unit,*) trim(name),& - &': Warning: aggregates from level ',& - & newsz - write(debug_unit,*) trim(name),& - &': to level ',& - & iszv,' coincide.' - write(debug_unit,*) trim(name),& - &': Number of levels actually used :',newsz - write(debug_unit,*) - end if - allocate(t_prec%precv(newsz),stat=info) - if (info /= psb_success_) then - call psb_errpush(psb_err_from_subroutine_,name,& - & a_err='prec reallocation') - goto 9999 - endif - do i=1,newsz-1 - call mld_move_alloc(p%precv(i),t_prec%precv(i),info) - end do - call mld_move_alloc(p%precv(iszv),t_prec%precv(newsz),info) - do i=newsz+1, iszv - call p%precv(i)%free(info) - end do - call mld_move_alloc(t_prec,p,info) - ! Ignore errors from transfer - info = psb_success_ - ! - ! Restart - iszv = newsz - ! Fix the pointers, but the level 1 should - ! be already OK - do i=2, iszv - 1 - p%precv(i)%base_a => p%precv(i)%ac - p%precv(i)%base_desc => p%precv(i)%desc_ac - p%precv(i)%map%p_desc_X => p%precv(i-1)%base_desc - p%precv(i)%map%p_desc_Y => p%precv(i)%base_desc - end do - - - i = iszv - call check_coarse_lev(p%precv(i)) - if (info == psb_success_) call mld_coarse_bld(p%precv(i-1)%base_a,& - & p%precv(i-1)%base_desc, p%precv(i),info) - if (info /= psb_success_) then - call psb_errpush(psb_err_from_subroutine_,name,a_err='coarse rebuild') - goto 9999 - endif end if - end if - do i=1, iszv - ! - ! build the base preconditioner at level i - ! if (debug_level >= psb_debug_outer_) & & write(debug_unit,*) me,' ',trim(name),& & 'Calling mlprcbld at level ',i - call mld_check_def(p%precv(i)%parms%sweeps,& - & 'Jacobi sweeps',1,is_legal_jac_sweeps) - call mld_check_def(p%precv(i)%parms%sweeps_pre,& - & 'Jacobi sweeps',1,is_legal_jac_sweeps) - call mld_check_def(p%precv(i)%parms%sweeps_post,& - & 'Jacobi sweeps',1,is_legal_jac_sweeps) - - if (.not.allocated(p%precv(i)%sm)) then - !! Error: should have called mld_dprecinit - info=3111 - call psb_errpush(info,name) - goto 9999 - end if - if (.not.allocated(p%precv(i)%sm%sv)) then - !! Error: should have called mld_dprecinit - info=3111 - call psb_errpush(info,name) - goto 9999 - end if - - ! - ! Test version for beginning of OO stuff. + ! Build the mapping between levels i-1 and i and the matrix + ! at level i ! - call p%precv(i)%sm%build(p%precv(i)%base_a,p%precv(i)%base_desc,& - & 'F',info,amold=amold,vmold=vmold) + if (info == psb_success_) call mld_coarse_bld(p%precv(i-1)%base_a,& + & p%precv(i-1)%base_desc, p%precv(i),info) - if ((info == psb_success_).and.(i>1).and.(present(amold))) then - call psb_map_cscnv(p%precv(i)%map,info,mold=amold) - call p%precv(i)%ac%cscnv(info,mold=amold) - end if if (info /= psb_success_) then call psb_errpush(psb_err_internal_error_,name,& - & a_err='One level preconditioner build.') + & a_err='Init upper level preconditioner') goto 9999 endif if (debug_level >= psb_debug_outer_) & & write(debug_unit,*) me,' ',trim(name),& & 'Return from ',i,' call to mlprcbld ',info + + if (i>2) then + if (all(p%precv(i)%map%naggr == p%precv(i-1)%map%naggr)) then + newsz=i-1 + end if + call psb_bcast(ictxt,newsz) + if (newsz > 0) exit + end if end do + if (newsz > 0) then + if (me == 0) then + write(debug_unit,*) trim(name),& + &': Warning: aggregates from level ',& + & newsz + write(debug_unit,*) trim(name),& + &': to level ',& + & iszv,' coincide.' + write(debug_unit,*) trim(name),& + &': Number of levels actually used :',newsz + write(debug_unit,*) + end if + allocate(t_prec%precv(newsz),stat=info) + if (info /= psb_success_) then + call psb_errpush(psb_err_from_subroutine_,name,& + & a_err='prec reallocation') + goto 9999 + endif + do i=1,newsz-1 + call mld_move_alloc(p%precv(i),t_prec%precv(i),info) + end do + call mld_move_alloc(p%precv(iszv),t_prec%precv(newsz),info) + do i=newsz+1, iszv + call p%precv(i)%free(info) + end do + call mld_move_alloc(t_prec,p,info) + ! Ignore errors from transfer + info = psb_success_ + ! + ! Restart + iszv = newsz + ! Fix the pointers, but the level 1 should + ! be already OK + do i=2, iszv - 1 + p%precv(i)%base_a => p%precv(i)%ac + p%precv(i)%base_desc => p%precv(i)%desc_ac + p%precv(i)%map%p_desc_X => p%precv(i-1)%base_desc + p%precv(i)%map%p_desc_Y => p%precv(i)%base_desc + end do + + + i = iszv + call check_coarse_lev(p%precv(i)) + if (info == psb_success_) call mld_coarse_bld(p%precv(i-1)%base_a,& + & p%precv(i-1)%base_desc, p%precv(i),info) + if (info /= psb_success_) then + call psb_errpush(psb_err_from_subroutine_,name,a_err='coarse rebuild') + goto 9999 + endif + end if + end if + + do i=1, iszv + ! + ! build the base preconditioner at level i + ! + if (debug_level >= psb_debug_outer_) & + & write(debug_unit,*) me,' ',trim(name),& + & 'Calling mlprcbld at level ',i + call mld_check_def(p%precv(i)%parms%sweeps,& + & 'Jacobi sweeps',1,is_legal_jac_sweeps) + call mld_check_def(p%precv(i)%parms%sweeps_pre,& + & 'Jacobi sweeps',1,is_legal_jac_sweeps) + call mld_check_def(p%precv(i)%parms%sweeps_post,& + & 'Jacobi sweeps',1,is_legal_jac_sweeps) + + if (.not.allocated(p%precv(i)%sm)) then + !! Error: should have called mld_dprecinit + info=3111 + call psb_errpush(info,name) + goto 9999 + end if + if (.not.allocated(p%precv(i)%sm%sv)) then + !! Error: should have called mld_dprecinit + info=3111 + call psb_errpush(info,name) + goto 9999 + end if + + + ! + ! Test version for beginning of OO stuff. + ! + call p%precv(i)%sm%build(p%precv(i)%base_a,p%precv(i)%base_desc,& + & 'F',info,amold=amold,vmold=vmold) + + if ((info == psb_success_).and.(i>1).and.(present(amold))) then + call psb_map_cscnv(p%precv(i)%map,info,mold=amold) + call p%precv(i)%ac%cscnv(info,mold=amold) + end if + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,& + & a_err='One level preconditioner build.') + goto 9999 + endif + + if (debug_level >= psb_debug_outer_) & + & write(debug_unit,*) me,' ',trim(name),& + & 'Return from ',i,' call to mlprcbld ',info + end do + call psb_erractionrestore(err_act) return diff --git a/mlprec/impl/mld_smlprec_bld.f90 b/mlprec/impl/mld_smlprec_bld.f90 index d9d5e9bd..d49576d6 100644 --- a/mlprec/impl/mld_smlprec_bld.f90 +++ b/mlprec/impl/mld_smlprec_bld.f90 @@ -162,182 +162,182 @@ subroutine mld_smlprec_bld(a,desc_a,p,info,amold,vmold) endif - if (iszv > 1) then + if (iszv > 1) then - ! - ! Build the matrix and the transfer operators corresponding - ! to the remaining levels - ! + ! + ! Build the matrix and the transfer operators corresponding + ! to the remaining levels + ! + ! + ! Check on the iprcparm contents: they should be the same + ! on all processes. + ! + call psb_bcast(ictxt,p%precv(1)%parms) + ! + ! Finest level first; remember to fix base_a and base_desc + ! + p%precv(1)%base_a => a + p%precv(1)%base_desc => desc_a + + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='Base level precbuild.') + goto 9999 + end if + + + do i=2, iszv ! ! Check on the iprcparm contents: they should be the same ! on all processes. ! - call psb_bcast(ictxt,p%precv(1)%parms) - ! - ! Finest level first; remember to fix base_a and base_desc - ! - p%precv(1)%base_a => a - p%precv(1)%base_desc => desc_a - - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='Base level precbuild.') - goto 9999 - end if - - - do i=2, iszv - ! - ! Check on the iprcparm contents: they should be the same - ! on all processes. - ! - call psb_bcast(ictxt,p%precv(1)%parms) + call psb_bcast(ictxt,p%precv(i)%parms) + ! + ! Sanity checks on the parameters + ! + if (i= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & 'Calling mlprcbld at level ',i - ! - ! Build the mapping between levels i-1 and i and the matrix - ! at level i - ! - if (info == psb_success_) call mld_coarse_bld(p%precv(i-1)%base_a,& - & p%precv(i-1)%base_desc, p%precv(i),info) - - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,& - & a_err='Init upper level preconditioner') - goto 9999 - endif - - if (debug_level >= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & 'Return from ',i,' call to mlprcbld ',info - - if (i>2) then - if (all(p%precv(i)%map%naggr == p%precv(i-1)%map%naggr)) then - newsz=i-1 - end if - call psb_bcast(ictxt,newsz) - if (newsz > 0) exit - end if - end do - - if (newsz > 0) then - if (me == 0) then - write(debug_unit,*) trim(name),& - &': Warning: aggregates from level ',& - & newsz - write(debug_unit,*) trim(name),& - &': to level ',& - & iszv,' coincide.' - write(debug_unit,*) trim(name),& - &': Number of levels actually used :',newsz - write(debug_unit,*) - end if - allocate(t_prec%precv(newsz),stat=info) - if (info /= psb_success_) then - call psb_errpush(psb_err_from_subroutine_,name,& - & a_err='prec reallocation') - goto 9999 - endif - do i=1,newsz-1 - call mld_move_alloc(p%precv(i),t_prec%precv(i),info) - end do - call mld_move_alloc(p%precv(iszv),t_prec%precv(newsz),info) - do i=newsz+1, iszv - call p%precv(i)%free(info) - end do - call mld_move_alloc(t_prec,p,info) - ! Ignore errors from transfer - info = psb_success_ - ! - ! Restart - iszv = newsz - ! Fix the pointers, but the level 1 should - ! be already OK - do i=2, iszv - 1 - p%precv(i)%base_a => p%precv(i)%ac - p%precv(i)%base_desc => p%precv(i)%desc_ac - p%precv(i)%map%p_desc_X => p%precv(i-1)%base_desc - p%precv(i)%map%p_desc_Y => p%precv(i)%base_desc - end do - - - i = iszv - call check_coarse_lev(p%precv(i)) - if (info == psb_success_) call mld_coarse_bld(p%precv(i-1)%base_a,& - & p%precv(i-1)%base_desc, p%precv(i),info) - if (info /= psb_success_) then - call psb_errpush(psb_err_from_subroutine_,name,a_err='coarse rebuild') - goto 9999 - endif end if - end if - do i=1, iszv - ! - ! build the base preconditioner at level i - ! if (debug_level >= psb_debug_outer_) & & write(debug_unit,*) me,' ',trim(name),& & 'Calling mlprcbld at level ',i - call mld_check_def(p%precv(i)%parms%sweeps,& - & 'Jacobi sweeps',1,is_legal_jac_sweeps) - call mld_check_def(p%precv(i)%parms%sweeps_pre,& - & 'Jacobi sweeps',1,is_legal_jac_sweeps) - call mld_check_def(p%precv(i)%parms%sweeps_post,& - & 'Jacobi sweeps',1,is_legal_jac_sweeps) - - if (.not.allocated(p%precv(i)%sm)) then - !! Error: should have called mld_dprecinit - info=3111 - call psb_errpush(info,name) - goto 9999 - end if - if (.not.allocated(p%precv(i)%sm%sv)) then - !! Error: should have called mld_dprecinit - info=3111 - call psb_errpush(info,name) - goto 9999 - end if - - ! - ! Test version for beginning of OO stuff. + ! Build the mapping between levels i-1 and i and the matrix + ! at level i ! - call p%precv(i)%sm%build(p%precv(i)%base_a,p%precv(i)%base_desc,& - & 'F',info,amold=amold,vmold=vmold) + if (info == psb_success_) call mld_coarse_bld(p%precv(i-1)%base_a,& + & p%precv(i-1)%base_desc, p%precv(i),info) - if ((info == psb_success_).and.(i>1).and.(present(amold))) then - call psb_map_cscnv(p%precv(i)%map,info,mold=amold) - call p%precv(i)%ac%cscnv(info,mold=amold) - end if if (info /= psb_success_) then call psb_errpush(psb_err_internal_error_,name,& - & a_err='One level preconditioner build.') + & a_err='Init upper level preconditioner') goto 9999 endif if (debug_level >= psb_debug_outer_) & & write(debug_unit,*) me,' ',trim(name),& & 'Return from ',i,' call to mlprcbld ',info + + if (i>2) then + if (all(p%precv(i)%map%naggr == p%precv(i-1)%map%naggr)) then + newsz=i-1 + end if + call psb_bcast(ictxt,newsz) + if (newsz > 0) exit + end if end do + if (newsz > 0) then + if (me == 0) then + write(debug_unit,*) trim(name),& + &': Warning: aggregates from level ',& + & newsz + write(debug_unit,*) trim(name),& + &': to level ',& + & iszv,' coincide.' + write(debug_unit,*) trim(name),& + &': Number of levels actually used :',newsz + write(debug_unit,*) + end if + allocate(t_prec%precv(newsz),stat=info) + if (info /= psb_success_) then + call psb_errpush(psb_err_from_subroutine_,name,& + & a_err='prec reallocation') + goto 9999 + endif + do i=1,newsz-1 + call mld_move_alloc(p%precv(i),t_prec%precv(i),info) + end do + call mld_move_alloc(p%precv(iszv),t_prec%precv(newsz),info) + do i=newsz+1, iszv + call p%precv(i)%free(info) + end do + call mld_move_alloc(t_prec,p,info) + ! Ignore errors from transfer + info = psb_success_ + ! + ! Restart + iszv = newsz + ! Fix the pointers, but the level 1 should + ! be already OK + do i=2, iszv - 1 + p%precv(i)%base_a => p%precv(i)%ac + p%precv(i)%base_desc => p%precv(i)%desc_ac + p%precv(i)%map%p_desc_X => p%precv(i-1)%base_desc + p%precv(i)%map%p_desc_Y => p%precv(i)%base_desc + end do + + + i = iszv + call check_coarse_lev(p%precv(i)) + if (info == psb_success_) call mld_coarse_bld(p%precv(i-1)%base_a,& + & p%precv(i-1)%base_desc, p%precv(i),info) + if (info /= psb_success_) then + call psb_errpush(psb_err_from_subroutine_,name,a_err='coarse rebuild') + goto 9999 + endif + end if + end if + + do i=1, iszv + ! + ! build the base preconditioner at level i + ! + if (debug_level >= psb_debug_outer_) & + & write(debug_unit,*) me,' ',trim(name),& + & 'Calling mlprcbld at level ',i + call mld_check_def(p%precv(i)%parms%sweeps,& + & 'Jacobi sweeps',1,is_legal_jac_sweeps) + call mld_check_def(p%precv(i)%parms%sweeps_pre,& + & 'Jacobi sweeps',1,is_legal_jac_sweeps) + call mld_check_def(p%precv(i)%parms%sweeps_post,& + & 'Jacobi sweeps',1,is_legal_jac_sweeps) + + if (.not.allocated(p%precv(i)%sm)) then + !! Error: should have called mld_dprecinit + info=3111 + call psb_errpush(info,name) + goto 9999 + end if + if (.not.allocated(p%precv(i)%sm%sv)) then + !! Error: should have called mld_dprecinit + info=3111 + call psb_errpush(info,name) + goto 9999 + end if + + + ! + ! Test version for beginning of OO stuff. + ! + call p%precv(i)%sm%build(p%precv(i)%base_a,p%precv(i)%base_desc,& + & 'F',info,amold=amold,vmold=vmold) + + if ((info == psb_success_).and.(i>1).and.(present(amold))) then + call psb_map_cscnv(p%precv(i)%map,info,mold=amold) + call p%precv(i)%ac%cscnv(info,mold=amold) + end if + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,& + & a_err='One level preconditioner build.') + goto 9999 + endif + + if (debug_level >= psb_debug_outer_) & + & write(debug_unit,*) me,' ',trim(name),& + & 'Return from ',i,' call to mlprcbld ',info + end do + call psb_erractionrestore(err_act) return diff --git a/mlprec/impl/mld_zmlprec_bld.f90 b/mlprec/impl/mld_zmlprec_bld.f90 index 86e5d77b..8f1a949a 100644 --- a/mlprec/impl/mld_zmlprec_bld.f90 +++ b/mlprec/impl/mld_zmlprec_bld.f90 @@ -162,182 +162,182 @@ subroutine mld_zmlprec_bld(a,desc_a,p,info,amold,vmold) endif - if (iszv > 1) then + if (iszv > 1) then - ! - ! Build the matrix and the transfer operators corresponding - ! to the remaining levels - ! + ! + ! Build the matrix and the transfer operators corresponding + ! to the remaining levels + ! + ! + ! Check on the iprcparm contents: they should be the same + ! on all processes. + ! + call psb_bcast(ictxt,p%precv(1)%parms) + ! + ! Finest level first; remember to fix base_a and base_desc + ! + p%precv(1)%base_a => a + p%precv(1)%base_desc => desc_a + + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='Base level precbuild.') + goto 9999 + end if + + + do i=2, iszv ! ! Check on the iprcparm contents: they should be the same ! on all processes. ! - call psb_bcast(ictxt,p%precv(1)%parms) - ! - ! Finest level first; remember to fix base_a and base_desc - ! - p%precv(1)%base_a => a - p%precv(1)%base_desc => desc_a - - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='Base level precbuild.') - goto 9999 - end if - - - do i=2, iszv - ! - ! Check on the iprcparm contents: they should be the same - ! on all processes. - ! - call psb_bcast(ictxt,p%precv(1)%parms) + call psb_bcast(ictxt,p%precv(i)%parms) + ! + ! Sanity checks on the parameters + ! + if (i= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & 'Calling mlprcbld at level ',i - ! - ! Build the mapping between levels i-1 and i and the matrix - ! at level i - ! - if (info == psb_success_) call mld_coarse_bld(p%precv(i-1)%base_a,& - & p%precv(i-1)%base_desc, p%precv(i),info) - - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,& - & a_err='Init upper level preconditioner') - goto 9999 - endif - - if (debug_level >= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & 'Return from ',i,' call to mlprcbld ',info - - if (i>2) then - if (all(p%precv(i)%map%naggr == p%precv(i-1)%map%naggr)) then - newsz=i-1 - end if - call psb_bcast(ictxt,newsz) - if (newsz > 0) exit - end if - end do - - if (newsz > 0) then - if (me == 0) then - write(debug_unit,*) trim(name),& - &': Warning: aggregates from level ',& - & newsz - write(debug_unit,*) trim(name),& - &': to level ',& - & iszv,' coincide.' - write(debug_unit,*) trim(name),& - &': Number of levels actually used :',newsz - write(debug_unit,*) - end if - allocate(t_prec%precv(newsz),stat=info) - if (info /= psb_success_) then - call psb_errpush(psb_err_from_subroutine_,name,& - & a_err='prec reallocation') - goto 9999 - endif - do i=1,newsz-1 - call mld_move_alloc(p%precv(i),t_prec%precv(i),info) - end do - call mld_move_alloc(p%precv(iszv),t_prec%precv(newsz),info) - do i=newsz+1, iszv - call p%precv(i)%free(info) - end do - call mld_move_alloc(t_prec,p,info) - ! Ignore errors from transfer - info = psb_success_ - ! - ! Restart - iszv = newsz - ! Fix the pointers, but the level 1 should - ! be already OK - do i=2, iszv - 1 - p%precv(i)%base_a => p%precv(i)%ac - p%precv(i)%base_desc => p%precv(i)%desc_ac - p%precv(i)%map%p_desc_X => p%precv(i-1)%base_desc - p%precv(i)%map%p_desc_Y => p%precv(i)%base_desc - end do - - - i = iszv - call check_coarse_lev(p%precv(i)) - if (info == psb_success_) call mld_coarse_bld(p%precv(i-1)%base_a,& - & p%precv(i-1)%base_desc, p%precv(i),info) - if (info /= psb_success_) then - call psb_errpush(psb_err_from_subroutine_,name,a_err='coarse rebuild') - goto 9999 - endif end if - end if - do i=1, iszv - ! - ! build the base preconditioner at level i - ! if (debug_level >= psb_debug_outer_) & & write(debug_unit,*) me,' ',trim(name),& & 'Calling mlprcbld at level ',i - call mld_check_def(p%precv(i)%parms%sweeps,& - & 'Jacobi sweeps',1,is_legal_jac_sweeps) - call mld_check_def(p%precv(i)%parms%sweeps_pre,& - & 'Jacobi sweeps',1,is_legal_jac_sweeps) - call mld_check_def(p%precv(i)%parms%sweeps_post,& - & 'Jacobi sweeps',1,is_legal_jac_sweeps) - - if (.not.allocated(p%precv(i)%sm)) then - !! Error: should have called mld_dprecinit - info=3111 - call psb_errpush(info,name) - goto 9999 - end if - if (.not.allocated(p%precv(i)%sm%sv)) then - !! Error: should have called mld_dprecinit - info=3111 - call psb_errpush(info,name) - goto 9999 - end if - - ! - ! Test version for beginning of OO stuff. + ! Build the mapping between levels i-1 and i and the matrix + ! at level i ! - call p%precv(i)%sm%build(p%precv(i)%base_a,p%precv(i)%base_desc,& - & 'F',info,amold=amold,vmold=vmold) + if (info == psb_success_) call mld_coarse_bld(p%precv(i-1)%base_a,& + & p%precv(i-1)%base_desc, p%precv(i),info) - if ((info == psb_success_).and.(i>1).and.(present(amold))) then - call psb_map_cscnv(p%precv(i)%map,info,mold=amold) - call p%precv(i)%ac%cscnv(info,mold=amold) - end if if (info /= psb_success_) then call psb_errpush(psb_err_internal_error_,name,& - & a_err='One level preconditioner build.') + & a_err='Init upper level preconditioner') goto 9999 endif if (debug_level >= psb_debug_outer_) & & write(debug_unit,*) me,' ',trim(name),& & 'Return from ',i,' call to mlprcbld ',info + + if (i>2) then + if (all(p%precv(i)%map%naggr == p%precv(i-1)%map%naggr)) then + newsz=i-1 + end if + call psb_bcast(ictxt,newsz) + if (newsz > 0) exit + end if end do + if (newsz > 0) then + if (me == 0) then + write(debug_unit,*) trim(name),& + &': Warning: aggregates from level ',& + & newsz + write(debug_unit,*) trim(name),& + &': to level ',& + & iszv,' coincide.' + write(debug_unit,*) trim(name),& + &': Number of levels actually used :',newsz + write(debug_unit,*) + end if + allocate(t_prec%precv(newsz),stat=info) + if (info /= psb_success_) then + call psb_errpush(psb_err_from_subroutine_,name,& + & a_err='prec reallocation') + goto 9999 + endif + do i=1,newsz-1 + call mld_move_alloc(p%precv(i),t_prec%precv(i),info) + end do + call mld_move_alloc(p%precv(iszv),t_prec%precv(newsz),info) + do i=newsz+1, iszv + call p%precv(i)%free(info) + end do + call mld_move_alloc(t_prec,p,info) + ! Ignore errors from transfer + info = psb_success_ + ! + ! Restart + iszv = newsz + ! Fix the pointers, but the level 1 should + ! be already OK + do i=2, iszv - 1 + p%precv(i)%base_a => p%precv(i)%ac + p%precv(i)%base_desc => p%precv(i)%desc_ac + p%precv(i)%map%p_desc_X => p%precv(i-1)%base_desc + p%precv(i)%map%p_desc_Y => p%precv(i)%base_desc + end do + + + i = iszv + call check_coarse_lev(p%precv(i)) + if (info == psb_success_) call mld_coarse_bld(p%precv(i-1)%base_a,& + & p%precv(i-1)%base_desc, p%precv(i),info) + if (info /= psb_success_) then + call psb_errpush(psb_err_from_subroutine_,name,a_err='coarse rebuild') + goto 9999 + endif + end if + end if + + do i=1, iszv + ! + ! build the base preconditioner at level i + ! + if (debug_level >= psb_debug_outer_) & + & write(debug_unit,*) me,' ',trim(name),& + & 'Calling mlprcbld at level ',i + call mld_check_def(p%precv(i)%parms%sweeps,& + & 'Jacobi sweeps',1,is_legal_jac_sweeps) + call mld_check_def(p%precv(i)%parms%sweeps_pre,& + & 'Jacobi sweeps',1,is_legal_jac_sweeps) + call mld_check_def(p%precv(i)%parms%sweeps_post,& + & 'Jacobi sweeps',1,is_legal_jac_sweeps) + + if (.not.allocated(p%precv(i)%sm)) then + !! Error: should have called mld_dprecinit + info=3111 + call psb_errpush(info,name) + goto 9999 + end if + if (.not.allocated(p%precv(i)%sm%sv)) then + !! Error: should have called mld_dprecinit + info=3111 + call psb_errpush(info,name) + goto 9999 + end if + + + ! + ! Test version for beginning of OO stuff. + ! + call p%precv(i)%sm%build(p%precv(i)%base_a,p%precv(i)%base_desc,& + & 'F',info,amold=amold,vmold=vmold) + + if ((info == psb_success_).and.(i>1).and.(present(amold))) then + call psb_map_cscnv(p%precv(i)%map,info,mold=amold) + call p%precv(i)%ac%cscnv(info,mold=amold) + end if + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,& + & a_err='One level preconditioner build.') + goto 9999 + endif + + if (debug_level >= psb_debug_outer_) & + & write(debug_unit,*) me,' ',trim(name),& + & 'Return from ',i,' call to mlprcbld ',info + end do + call psb_erractionrestore(err_act) return