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