00001 subroutine iteration_poisson_solver_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_interpo_fl2gr
00016   use interface_sourceterm_poisson_solver_test
00017   use interface_sourceterm_exsurf_eqm_binary
00018   use interface_poisson_solver_binary
00019   implicit none
00020   real(long), pointer :: sou(:,:,:), pot(:,:,:), psi_bak(:,:,:)
00021   real(long), pointer :: sou_exsurf(:,:), dsou_exsurf(:,:)
00022   real(long) :: error_psi, count
00023   integer    :: iter_count, flag = 0
00024   integer    :: irf, itf, ipf, irg, itg, ipg, ihy, impt, impt_ex
00025 
00026   call set_allocate_size_mpt
00027   call alloc_array3d(sou,0,nrg,0,ntg,0,npg)
00028   call alloc_array3d(pot,0,nrg,0,ntg,0,npg)
00029   call alloc_array3d(psi_bak,0,nrg,0,ntg,0,npg)
00030   call alloc_array2d(sou_exsurf,0,ntg,0,npg)
00031   call alloc_array2d(dsou_exsurf,0,ntg,0,npg)
00032 
00033   iter_count = 0
00034   do
00035     iter_count = iter_count + 1      
00036     count = dble(iter_count) 
00037 
00038     do impt = 1, nmpt
00039       call copy_grid_parameter_from_mpt(impt)
00040       conv_gra = dmin1(conv0_gra,conv_ini*count)
00041       conv_den = dmin1(conv0_den,conv_ini*count)
00042       call copy_grid_parameter_to_mpt(impt)
00043 
00044       call copy_from_mpatch_all_test(impt)
00045       call calc_vector_x_grav(0)
00046       call calc_vector_x_matter(0)
00047       call calc_vector_phi_grav(0)
00048       call calc_vector_phi_matter(0)
00049       call copy_to_mpatch_all_test(impt)
00050 
00051       if(impt.eq.1) impt_ex = 2
00052       if(impt.eq.2) impt_ex = 1
00053       call copy_from_mpatch_all_test(impt_ex)
00054       call copy_poisson_solver_test_from_mpt(impt_ex)
00055       call sourceterm_exsurf_eqm_binary(psi,sou_exsurf,dsou_exsurf)
00056 
00057       call copy_from_mpatch_all_test(impt)
00058       call copy_poisson_solver_test_from_mpt(impt)
00059       emdg = 0.0d0
00060       call interpo_fl2gr(emd, emdg)
00061       call sourceterm_poisson_solver_test(sou)
00062       call poisson_solver_binary(sou,sou_exsurf,dsou_exsurf,pot)
00063 
00064       psi_bak(0:nrg,0:ntg,0:npg) = psi(0:nrg,0:ntg,0:npg)
00065       call update_grfield(pot,psi,conv_gra)
00066       call error_metric(psi,psi_bak,error_psi,flag)
00067       call printout_error_metric(iter_count,error_psi)
00068       call copy_to_mpatch_all_test(impt)
00069       call copy_poisson_solver_test_to_mpt(impt)
00070     end do
00071 
00072     if (flag == 0) exit
00073     if (iter_count >= iter_max) exit
00074     flag = 0
00075   end do
00076 
00077   deallocate(sou)
00078   deallocate(pot)
00079   deallocate(sou_exsurf)
00080   deallocate(dsou_exsurf)
00081   deallocate(psi_bak)
00082 end subroutine iteration_poisson_solver_test_mpt