00001 subroutine iteration_BBH_CF_3mpt(iter_count)
00002 use phys_constant, only : long, nmpt
00003 use grid_parameter
00004 use grid_parameter_interpo, only : nrg_itp, ntg_itp, npg_itp
00005 use def_metric, only : psi, alph, alps, bvxd, bvyd, bvzd
00006 use def_bh_parameter, only : bh_bctype, bh_soltype, ome_bh
00007 use copy_array_4dto3d_mpt
00008 use make_array_2d
00009 use make_array_3d
00010 use make_array_4d
00011 use interface_compute_alps2alph
00012 use interface_sourceterm_HaC_CF
00013 use interface_sourceterm_trG_CF
00014 use interface_sourceterm_MoC_CF_with_divshift
00015 use interface_sourceterm_surface_int
00016 use interface_sourceterm_exsurf_binary_COCP
00017 use interface_sourceterm_outsurf_COCP_from_ARCP
00018 use interface_sourceterm_insurf_ARCP_from_COCP
00019 use interface_bh_boundary_CF
00020 use interface_outer_boundary_d_BBH_CF
00021 use interface_outer_boundary_d_psi
00022 use interface_outer_boundary_d_alps
00023 use interface_outer_boundary_d_bvxd
00024 use interface_outer_boundary_d_bvyd
00025 use interface_outer_boundary_d_bvzd
00026 use interface_poisson_solver_binary_bhex_homosol
00027 use interface_poisson_solver_asymptotic_patch_homosol
00028 use interface_interpolation_fillup_binary_COCP
00029 use interface_update_grfield
00030 use interface_error_metric
00031 use interface_error_metric_type0
00032 use interface_error_metric_type2
00033 implicit none
00034 real(long), pointer :: sou(:,:,:), pot(:,:,:)
00035 real(long), pointer :: potx(:,:,:), poty(:,:,:), potz(:,:,:)
00036 real(long), pointer :: pot_bak(:,:,:), work(:,:,:)
00037 real(long), pointer :: potx_bak(:,:,:), poty_bak(:,:,:), potz_bak(:,:,:)
00038 real(long), pointer :: souvec(:,:,:,:)
00039 real(long), pointer :: sou_exsurf(:,:), dsou_exsurf(:,:)
00040 real(long), pointer :: sou_bhsurf(:,:), dsou_bhsurf(:,:)
00041 real(long), pointer :: sou_insurf(:,:), dsou_insurf(:,:)
00042 real(long), pointer :: sou_outsurf(:,:), dsou_outsurf(:,:)
00043 real(long), pointer :: fnc_itp(:,:,:)
00044
00045 real(long) :: count
00046 real(long) :: error_psi = 0.0d0, error_alph = 0.0d0, error_tmp = 0.0d0,
00047 error_bvxd = 0.0d0, error_bvyd = 0.0d0, error_bvzd = 0.0d0, &
00048 error_ome = 2.0d0
00049 real(long) :: pari, ome_bh_new
00050 integer :: iter_count, iter_omega = -1,
00051 flag_tmp = 0, flag_omega = 99, &
00052 flag_psi = 0, flag_alph = 0, &
00053 flag_bvxd = 0, flag_bvyd = 0, flag_bvzd = 0
00054 integer :: irg, itg, ipg, ii
00055 integer :: impt, impt_ex, impt_bin
00056 character(len=2) :: chgreen, chpa, chpB
00057 character(len=4) :: chbe
00058
00059 call set_allocate_size_mpt
00060 call alloc_array4d(souvec,0,nrg,0,ntg,0,npg,1,3)
00061 call alloc_array3d(sou,0,nrg,0,ntg,0,npg)
00062 call alloc_array3d(pot,0,nrg,0,ntg,0,npg)
00063 call alloc_array3d(potx,0,nrg,0,ntg,0,npg)
00064 call alloc_array3d(poty,0,nrg,0,ntg,0,npg)
00065 call alloc_array3d(potz,0,nrg,0,ntg,0,npg)
00066 call alloc_array3d(pot_bak,0,nrg,0,ntg,0,npg)
00067 call alloc_array3d(potx_bak,0,nrg,0,ntg,0,npg)
00068 call alloc_array3d(poty_bak,0,nrg,0,ntg,0,npg)
00069 call alloc_array3d(potz_bak,0,nrg,0,ntg,0,npg)
00070 call alloc_array3d(work,0,nrg,0,ntg,0,npg)
00071 call alloc_array3d(fnc_itp,0,nrg,0,ntg,0,npg)
00072 call alloc_array2d(sou_exsurf,0,ntg,0,npg)
00073 call alloc_array2d(dsou_exsurf,0,ntg,0,npg)
00074 call alloc_array2d(sou_bhsurf,0,ntg,0,npg)
00075 call alloc_array2d(dsou_bhsurf,0,ntg,0,npg)
00076 call alloc_array2d(sou_insurf,0,ntg,0,npg)
00077 call alloc_array2d(dsou_insurf,0,ntg,0,npg)
00078 call alloc_array2d(sou_outsurf,0,ntg,0,npg)
00079 call alloc_array2d(dsou_outsurf,0,ntg,0,npg)
00080
00081 iter_count = 0
00082 flag_omega = 99
00083
00084 do
00085 iter_count = iter_count + 1
00086 count = dble(iter_count)
00087
00088 do impt = 1, nmpt
00089 write(6,'(a10,i2)')" Patch # =", impt
00090 call copy_grid_parameter_from_mpt(impt)
00091 conv_gra = dmin1(conv0_gra,conv_ini*count)
00092 conv_den = dmin1(conv0_den,conv_ini*count)
00093 call copy_grid_parameter_to_mpt(impt)
00094
00095 call copy_from_mpatch_all_BBH_CF(impt)
00096 call copy_def_metric_from_mpt(impt)
00097 call calc_vector_x_grav(2)
00098 call calc_vector_phi_grav(2)
00099 call calc_vector_bh(2)
00100 call excurve
00101 call excurve_CF_gridpoint_bhex
00102 if (impt.eq.nmpt) call calc_mass_asympto('bh')
00103 call copy_to_mpatch_all_BBH_CF(impt)
00104
00105
00106 sou(0:nrg,0:ntg,0:npg) = 0.0d0
00107 sou_exsurf(0:ntg,0:npg) = 0.0d0 ; dsou_exsurf(0:ntg,0:npg) = 0.0d0
00108 sou_bhsurf(0:ntg,0:npg) = 0.0d0 ; dsou_bhsurf(0:ntg,0:npg) = 0.0d0
00109 sou_outsurf(0:ntg,0:npg)= 0.0d0 ; dsou_outsurf(0:ntg,0:npg)= 0.0d0
00110 call sourceterm_surface_int(psi,0,sou_bhsurf,dsou_bhsurf)
00111 call sourceterm_surface_int(psi,nrg,sou_outsurf,dsou_outsurf)
00112 call sourceterm_HaC_CF(sou)
00113
00114 if (impt.ne.nmpt) then
00115 call sourceterm_exsurf_binary_COCP(impt,'psi ','ev',sou_exsurf, &
00116 & dsou_exsurf)
00117 call sourceterm_outsurf_COCP_from_ARCP(impt,'psi ','ev',sou_outsurf, &
00118 & dsou_outsurf)
00119 call bh_boundary_CF(sou_bhsurf,dsou_bhsurf,'psi ')
00120 if (bh_bctype.eq.'TU') chgreen = 'dd'
00121 if (bh_bctype.eq.'AH'.or.bh_bctype.eq.'PG') chgreen = 'nd'
00122 call poisson_solver_binary_bhex_homosol(chgreen,sou, &
00123 & sou_exsurf,dsou_exsurf, &
00124 & sou_bhsurf,dsou_bhsurf, &
00125 & sou_outsurf,dsou_outsurf,pot)
00126 else if (impt.eq.nmpt) then
00127 call sourceterm_insurf_ARCP_from_COCP(impt,'psi ','ev',sou_insurf, &
00128 & dsou_insurf)
00129
00130
00131
00132 call outer_boundary_d_BBH_CF(sou_outsurf,'psi ')
00133 call poisson_solver_asymptotic_patch_homosol('dd',sou, &
00134 & sou_insurf,dsou_insurf, &
00135 & sou_outsurf,dsou_outsurf,pot)
00136 end if
00137
00138 pot_bak(0:nrg,0:ntg,0:npg) = psi(0:nrg,0:ntg,0:npg)
00139 call update_grfield(pot,psi,conv_gra)
00140 call reset_outer_boundary_BBH_CF('psi ')
00141
00142 if (impt.ne.nmpt) call interpolation_fillup_binary_COCP &
00143 & (impt,'psi ','ev',psi)
00144 call error_metric_type0(psi,pot_bak,error_tmp,flag_tmp,'bh')
00145 flag_psi = max ( flag_psi, flag_tmp)
00146 error_psi = dmax1(error_psi,error_tmp)
00147 call printout_error_metric(iter_count,error_psi)
00148
00149 call copy_to_mpatch_all_BBH_CF(impt)
00150 call copy_def_metric_to_mpt(impt)
00151
00152
00153 sou(0:nrg,0:ntg,0:npg) = 0.0d0
00154 sou_exsurf(0:ntg,0:npg) = 0.0d0 ; dsou_exsurf(0:ntg,0:npg) = 0.0d0
00155 sou_bhsurf(0:ntg,0:npg) = 0.0d0 ; dsou_bhsurf(0:ntg,0:npg) = 0.0d0
00156 sou_outsurf(0:ntg,0:npg)= 0.0d0 ; dsou_outsurf(0:ntg,0:npg)= 0.0d0
00157 alps(0:nrg,0:ntg,0:npg) = alph(0:nrg,0:ntg,0:npg)*psi(0:nrg,0:ntg,0:npg)
00158 call sourceterm_surface_int(alps,0,sou_bhsurf,dsou_bhsurf)
00159 call sourceterm_surface_int(alps,nrg,sou_outsurf,dsou_outsurf)
00160 call sourceterm_trG_CF(sou)
00161
00162 if (impt.ne.nmpt) then
00163 call sourceterm_exsurf_binary_COCP(impt,'alps','ev',sou_exsurf, &
00164 & dsou_exsurf)
00165 call sourceterm_outsurf_COCP_from_ARCP(impt,'alps','ev',sou_outsurf, &
00166 & dsou_outsurf)
00167 call bh_boundary_CF(sou_bhsurf,dsou_bhsurf,'alps')
00168 call poisson_solver_binary_bhex_homosol('dd',sou, &
00169 & sou_exsurf,dsou_exsurf, &
00170 & sou_bhsurf,dsou_bhsurf, &
00171 & sou_outsurf,dsou_outsurf,pot)
00172 else if (impt.eq.nmpt) then
00173 call sourceterm_insurf_ARCP_from_COCP(impt,'alps','ev',sou_insurf, &
00174 & dsou_insurf)
00175
00176 call outer_boundary_d_BBH_CF(sou_outsurf,'alps')
00177 call poisson_solver_asymptotic_patch_homosol('dd',sou, &
00178 & sou_insurf,dsou_insurf, &
00179 & sou_outsurf,dsou_outsurf,pot)
00180 end if
00181
00182 call compute_alps2alph(pot,psi)
00183 pot_bak(0:nrg,0:ntg,0:npg) = alph(0:nrg,0:ntg,0:npg)
00184 call update_grfield(pot,alph,conv_gra)
00185 call reset_outer_boundary_BBH_CF('alph')
00186 if (impt.ne.nmpt) call interpolation_fillup_binary_COCP &
00187 & (impt,'alph','ev',alph)
00188 call error_metric_type0(alph,pot_bak,error_tmp,flag_tmp,'bh')
00189 flag_alph = max ( flag_alph, flag_tmp)
00190 error_alph = dmax1(error_alph,error_tmp)
00191 call printout_error_metric(iter_count,error_alph)
00192
00193 alps(0:nrg,0:ntg,0:npg) = alph(0:nrg,0:ntg,0:npg)*psi(0:nrg,0:ntg,0:npg)
00194 call copy_to_mpatch_all_BBH_CF(impt)
00195 call copy_def_metric_to_mpt(impt)
00196
00197
00198 souvec(0:nrg,0:ntg,0:npg,1:3) = 0.0d0
00199 call sourceterm_MoC_CF_with_divshift(souvec)
00200
00201 do ii = 1, 3
00202 sou_exsurf(0:ntg,0:npg) = 0.0d0 ; dsou_exsurf(0:ntg,0:npg) = 0.0d0
00203 sou_bhsurf(0:ntg,0:npg) = 0.0d0 ; dsou_bhsurf(0:ntg,0:npg) = 0.0d0
00204 sou_outsurf(0:ntg,0:npg)= 0.0d0 ; dsou_outsurf(0:ntg,0:npg)= 0.0d0
00205 sou(0:nrg,0:ntg,0:npg) = souvec(0:nrg,0:ntg,0:npg,ii)
00206 if (ii.eq.1) work(0:nrg,0:ntg,0:npg) = bvxd(0:nrg,0:ntg,0:npg)
00207 if (ii.eq.2) work(0:nrg,0:ntg,0:npg) = bvyd(0:nrg,0:ntg,0:npg)
00208 if (ii.eq.3) work(0:nrg,0:ntg,0:npg) = bvzd(0:nrg,0:ntg,0:npg)
00209 call sourceterm_surface_int(work,0,sou_bhsurf,dsou_bhsurf)
00210 call sourceterm_surface_int(work,nrg,sou_outsurf,dsou_outsurf)
00211 if (ii.eq.1) then; chbe = 'bvxd'; chpa = 'od'; end if
00212 if (ii.eq.2) then; chbe = 'bvyd'; chpa = 'od'; end if
00213 if (ii.eq.3) then; chbe = 'bvzd'; chpa = 'ev'; end if
00214
00215 if (impt.ne.nmpt) then
00216 chpB = 'ev'
00217 if (impt.eq.2.and.ii.eq.1) chpB = 'od'
00218 if (impt.eq.2.and.ii.eq.2) chpB = 'od'
00219 call sourceterm_exsurf_binary_COCP(impt,chbe,chpa,sou_exsurf, &
00220 & dsou_exsurf)
00221 call sourceterm_outsurf_COCP_from_ARCP(impt,chbe,chpB,sou_outsurf,&
00222 & dsou_outsurf)
00223 call bh_boundary_CF(sou_bhsurf,dsou_bhsurf,chbe)
00224 call poisson_solver_binary_bhex_homosol('dd',sou, &
00225 & sou_exsurf,dsou_exsurf, &
00226 & sou_bhsurf,dsou_bhsurf, &
00227 & sou_outsurf,dsou_outsurf,pot)
00228 else if (impt.eq.nmpt) then
00229 call sourceterm_insurf_ARCP_from_COCP(impt,chbe,chpa,sou_insurf, &
00230 & dsou_insurf)
00231
00232
00233
00234 if (ii.eq.1) call outer_boundary_d_BBH_CF(sou_outsurf,'bvxd')
00235 if (ii.eq.2) call outer_boundary_d_BBH_CF(sou_outsurf,'bvyd')
00236 if (ii.eq.3) call outer_boundary_d_BBH_CF(sou_outsurf,'bvzd')
00237
00238
00239 call poisson_solver_asymptotic_patch_homosol('dd',sou, &
00240 & sou_insurf,dsou_insurf, &
00241 & sou_outsurf,dsou_outsurf,pot)
00242 end if
00243 if (ii.eq.1) potx(0:nrg,0:ntg,0:npg) = pot(0:nrg,0:ntg,0:npg)
00244 if (ii.eq.2) poty(0:nrg,0:ntg,0:npg) = pot(0:nrg,0:ntg,0:npg)
00245 if (ii.eq.3) potz(0:nrg,0:ntg,0:npg) = pot(0:nrg,0:ntg,0:npg)
00246 end do
00247
00248 potx_bak(0:nrg,0:ntg,0:npg) = bvxd(0:nrg,0:ntg,0:npg)
00249 poty_bak(0:nrg,0:ntg,0:npg) = bvyd(0:nrg,0:ntg,0:npg)
00250 potz_bak(0:nrg,0:ntg,0:npg) = bvzd(0:nrg,0:ntg,0:npg)
00251 call update_grfield(potx,bvxd,conv_gra)
00252 call update_grfield(poty,bvyd,conv_gra)
00253 call update_grfield(potz,bvzd,conv_gra)
00254
00255 if (impt.ne.nmpt) then
00256 call interpolation_fillup_binary_COCP(impt,'bvxd','od',bvxd)
00257 call interpolation_fillup_binary_COCP(impt,'bvyd','od',bvyd)
00258 call interpolation_fillup_binary_COCP(impt,'bvzd','ev',bvzd)
00259 end if
00260
00261
00262 call error_metric_type2(bvxd,potx_bak,error_tmp,flag_tmp,'bh')
00263 flag_bvxd = max ( flag_bvxd, flag_tmp)
00264 error_bvxd = dmax1(error_bvxd,error_tmp)
00265 call error_metric_type2(bvyd,poty_bak,error_tmp,flag_tmp,'bh')
00266 flag_bvyd = max ( flag_bvyd, flag_tmp)
00267 error_bvyd = dmax1(error_bvyd,error_tmp)
00268 call error_metric_type2(bvzd,potz_bak,error_tmp,flag_tmp,'bh')
00269 flag_bvzd = max ( flag_bvzd, flag_tmp)
00270 error_bvzd = dmax1(error_bvzd,error_tmp)
00271 call printout_error_metric(iter_count,error_bvxd)
00272 call printout_error_metric(iter_count,error_bvyd)
00273 call printout_error_metric(iter_count,error_bvzd)
00274
00275 call copy_to_mpatch_all_BBH_CF(impt)
00276 call copy_def_metric_to_mpt(impt)
00277
00278
00279 end do
00280
00281
00282 error_tmp = dmax1(error_psi,error_alph,error_bvxd, &
00283 & error_bvyd,error_bvzd)
00284 if ((bh_soltype.eq.'CI'.or.bh_soltype.eq.'SQ').and. &
00285 error_tmp.le.1.0d-02) then
00286
00287
00288 iter_omega = mod(iter_omega+1,2)
00289 if (iter_omega.eq.0) then
00290 impt = nmpt
00291 call copy_from_mpatch_all_BBH_CF(impt)
00292 call copy_def_metric_from_mpt(impt)
00293 call calc_vector_x_grav(2)
00294 call calc_vector_phi_grav(2)
00295 call calc_vector_bh(2)
00296
00297 call calc_mass_asympto('bh')
00298 call copy_def_quantities_to_mpt(nmpt)
00299 call adjust_omega_BBH(flag_omega,error_ome)
00300
00301 ome_bh_new = ome_bh
00302 do impt = 1, nmpt
00303 call copy_def_bh_parameter_from_mpt(impt)
00304 ome_bh = ome_bh_new
00305 call copy_def_bh_parameter_to_mpt(impt)
00306 end do
00307 end if
00308 end if
00309
00310
00311
00312 if ((flag_omega==0).and.(flag_psi==0).and.(flag_alph==0).and. &
00313 & (flag_bvxd==0).and.(flag_bvyd==0).and.(flag_bvzd==0)) exit
00314 if (iter_count >= iter_max) exit
00315
00316
00317
00318 flag_psi = 0
00319 flag_alph = 0
00320 flag_bvxd = 0
00321 flag_bvyd = 0
00322 flag_bvzd = 0
00323 error_psi = 0.0d0
00324 error_alph = 0.0d0
00325 error_bvxd = 0.0d0
00326 error_bvyd = 0.0d0
00327 error_bvzd = 0.0d0
00328 end do
00329
00330 deallocate(souvec)
00331 deallocate(sou)
00332 deallocate(pot)
00333 deallocate(potx)
00334 deallocate(poty)
00335 deallocate(potz)
00336 deallocate(pot_bak)
00337 deallocate(potx_bak)
00338 deallocate(poty_bak)
00339 deallocate(potz_bak)
00340 deallocate(work)
00341 deallocate(fnc_itp)
00342 deallocate(sou_exsurf)
00343 deallocate(dsou_exsurf)
00344 deallocate(sou_bhsurf)
00345 deallocate(dsou_bhsurf)
00346 deallocate(sou_insurf)
00347 deallocate(dsou_insurf)
00348 deallocate(sou_outsurf)
00349 deallocate(dsou_outsurf)
00350 end subroutine iteration_BBH_CF_3mpt