00001 subroutine iteration_poisson_bbh_test_mpt(iter_count)
00002   use phys_constant, only :  long, nnrg, nntg, nnpg, nmpt
00003   use grid_parameter
00004   use coordinate_grav_r
00005   use coordinate_grav_phi
00006   use coordinate_grav_theta
00007   use weight_midpoint_grav
00008   use def_metric, only : psi
00009   use def_matter, only : emd, emdg
00010   use make_array_2d
00011   use make_array_3d
00012   use interface_poisson_solver
00013   use interface_update_grfield
00014   use interface_error_metric
00015   use interface_error_metric_type0
00016   use interface_interpo_fl2gr
00017   use interface_sourceterm_poisson_solver_test
00018   use interface_sourceterm_exsurf_eqm_binary
00019   use interface_poisson_solver_binary
00020   use interface_sourceterm_surface_int
00021   use interface_poisson_solver_binary_bhex_homosol
00022   use interface_copy_to_hgfn_and_gfnsf
00023   use interface_bh_boundary_test_mpt
00024   use radial_green_fn_grav_bhex_nb
00025   use radial_green_fn_grav_bhex_dh
00026   use radial_green_fn_grav_bhex_nh
00027 
00028   use interface_bh_boundary_test
00029   implicit none
00030   real(long), pointer :: sou(:,:,:), pot(:,:,:), psi_bak(:,:,:)
00031   real(long), pointer :: sou_exsurf(:,:), dsou_exsurf(:,:)
00032   real(long), pointer :: sou_bhsurf(:,:), dsou_bhsurf(:,:)
00033   real(long), pointer :: sou_outsurf(:,:), dsou_outsurf(:,:)
00034   real(long) :: error_psi, count
00035   integer    :: iter_count, flag = 0
00036   integer    :: irf, itf, ipf, irg, itg, ipg, ihy, impt, impt_ex
00037 
00038   call set_allocate_size_mpt
00039   call alloc_array3d(sou,0,nrg,0,ntg,0,npg)
00040   call alloc_array3d(pot,0,nrg,0,ntg,0,npg)
00041   call alloc_array3d(psi_bak,0,nrg,0,ntg,0,npg)
00042   call alloc_array2d(sou_exsurf,0,ntg,0,npg)
00043   call alloc_array2d(dsou_exsurf,0,ntg,0,npg)
00044   call alloc_array2d(sou_bhsurf,0,ntg,0,npg)
00045   call alloc_array2d(dsou_bhsurf,0,ntg,0,npg)
00046   call alloc_array2d(sou_outsurf,0,ntg,0,npg)
00047   call alloc_array2d(dsou_outsurf,0,ntg,0,npg)
00048 
00049   iter_count = 0
00050   do
00051     iter_count = iter_count + 1      
00052     count = dble(iter_count) 
00053 
00054     do impt = 1, nmpt
00055       call copy_grid_parameter_from_mpt(impt)
00056       conv_gra = dmin1(conv0_gra,conv_ini*count)
00057       conv_den = dmin1(conv0_den,conv_ini*count)
00058       call copy_grid_parameter_to_mpt(impt)
00059 
00060       call copy_from_mpatch_all_test(impt)
00061       call calc_vector_x_grav(0)
00062       call calc_vector_x_matter(0)
00063       call calc_vector_phi_grav(0)
00064       call calc_vector_phi_matter(0)
00065       call copy_to_mpatch_all_test(impt)
00066 
00067       if(impt.eq.1) impt_ex = 2
00068       if(impt.eq.2) impt_ex = 1
00069       call copy_from_mpatch_all_test(impt_ex)
00070       call copy_metric_and_matter_BHNS_test_from_mpt(impt_ex)
00071       call sourceterm_exsurf_eqm_binary(psi,sou_exsurf,dsou_exsurf)
00072       call copy_from_mpatch_all_test(impt)
00073       call copy_metric_and_matter_BHNS_test_from_mpt(impt)
00074 
00075       sou(0:nrg,0:ntg,0:npg) = 0.0d0
00076       call reset_bh_boundary('d') 
00077       call sourceterm_surface_int(psi,0,sou_bhsurf,dsou_bhsurf)
00078       call sourceterm_surface_int(psi,nrg,sou_outsurf,dsou_outsurf)
00079 
00080 
00081 
00082 
00083       call bh_boundary_test_mpt(impt,'dh',sou_bhsurf,dsou_bhsurf)
00084       call poisson_solver_binary_bhex_homosol('dh',sou, &
00085       &                                        sou_exsurf,dsou_exsurf, &
00086       &                                        sou_bhsurf,dsou_bhsurf, &
00087       &                                       sou_outsurf,dsou_outsurf,pot)
00088 
00089       psi_bak(0:nrg,0:ntg,0:npg) = psi(0:nrg,0:ntg,0:npg)
00090       call update_grfield(pot,psi,conv_gra)
00091       call error_metric_type0(psi,psi_bak,error_psi,flag,'bh')
00092       call printout_error_metric(iter_count,error_psi)
00093       call reset_bh_boundary('d') 
00094       call copy_to_mpatch_all_test(impt)
00095       call copy_metric_and_matter_BHNS_test_to_mpt(impt)
00096     end do
00097 
00098     if (flag == 0) exit
00099     if (iter_count >= iter_max) exit
00100     if (iter_count >= 10 .and. error_psi > 1.5d0) exit
00101     flag = 0
00102   end do
00103 
00104   deallocate(sou)
00105   deallocate(pot)
00106   deallocate(psi_bak)
00107   deallocate(sou_exsurf)
00108   deallocate(dsou_exsurf)
00109   deallocate(sou_bhsurf)
00110   deallocate(dsou_bhsurf)
00111   deallocate(sou_outsurf)
00112   deallocate(dsou_outsurf)
00113 end subroutine iteration_poisson_bbh_test_mpt