00001 subroutine bh_boundary_CF(sou_surf,dsou_surf,char_mp)
00002   use phys_constant, only  : long
00003   use grid_parameter, only : nrg, ntg, npg, rgin
00004   use def_binary_parameter, only : dis
00005   use def_metric, only : psi
00006   use def_bh_parameter, only : ome_bh, spin_bh, alph_bh, psi_bh, bh_bctype
00007   use def_binary_parameter,    only : sepa
00008   use def_metric_excurve_grid, only : tfkij_grid
00009   use def_vector_bh, only : hvec_bh_cbh_xg,hvec_bh_cm_phig,hvec_bh_cbh_spin
00010   use make_array_2d
00011   use interface_grdr_gridpoint_type0_nosym
00012   use interface_interpo_linear_type0_2Dsurf
00013   implicit none
00014   real(long), pointer :: sou_surf(:,:), dsou_surf(:,:)
00015   real(long), pointer :: psi_bhsurf(:,:), dpsi_bhsurf(:,:)
00016   real(long) :: work(2,2), deriv, dpsidr
00017   real(long) :: Aij_surf, Aij_sisj, si, sj
00018   real(long) :: psigc, psigc3, psigcinv2
00019   real(long) :: vphi_cm, vphi_cbh
00020   integer    :: itg, ipg, ii, jj
00021   character(len=4), intent(in) :: char_mp
00022 
00023 
00024 
00025   if (bh_bctype.eq.'TU') then 
00026     if (char_mp.eq.'psi ') then
00027       sou_surf(1:ntg,1:npg) = psi_bh
00028       dsou_surf(1:ntg,1:npg)= 0.0d0
00029     end if
00030     if (char_mp.eq.'alps') then
00031         sou_surf(1:ntg,1:npg) = alph_bh*psi_bh
00032         dsou_surf(1:ntg,1:npg)= 0.0d0
00033     end if
00034     if (char_mp.eq.'bvxd'.or.char_mp.eq.'bvyd'.or.char_mp.eq.'bvzd') then  
00035       if (char_mp.eq.'bvxd') ii = 1
00036       if (char_mp.eq.'bvyd') ii = 2
00037       if (char_mp.eq.'bvzd') ii = 3
00038       do ipg = 1, npg
00039         do itg = 1, ntg
00040           vphi_cm  = hvec_bh_cm_phig(itg,ipg,ii)
00041           vphi_cbh = hvec_bh_cbh_spin(itg,ipg,ii)
00042           sou_surf(itg,ipg) = - ome_bh*vphi_cm - spin_bh*vphi_cbh
00043           dsou_surf(itg,ipg) = 0.0d0
00044         end do
00045       end do
00046     end if
00047   end if
00048 
00049 
00050 
00051 if (bh_bctype.eq.'AH'.or.bh_bctype.eq.'PG') then 
00052 
00053   call alloc_array2d(psi_bhsurf, 0, ntg, 0, npg)
00054   call alloc_array2d(dpsi_bhsurf, 0, ntg, 0, npg)
00055 
00056   psi_bhsurf(0:ntg,0:npg) = psi(0,0:ntg,0:npg)
00057 
00058   if (char_mp.eq.'psi '.or.char_mp.eq.'alps') then
00059     do ipg = 0, npg
00060       do itg = 0, ntg
00061         call grdr_gridpoint_type0_nosym(psi,deriv,0,itg,ipg)
00062         dpsi_bhsurf(itg,ipg) = deriv
00063       end do
00064     end do
00065 
00066     do ipg = 1, npg
00067       do itg = 1, ntg
00068         call interpo_linear_type0_2Dsurf(dpsidr,dpsi_bhsurf,itg,ipg)
00069         call interpo_linear_type0_2Dsurf(psigc,psi_bhsurf,itg,ipg)
00070         psigc3 = psigc**3
00071         Aij_sisj = 0.0d0
00072         do ii = 1, 3
00073           do jj = 1, 3
00074             work(1:2,1:2) = tfkij_grid(0,itg-1:itg,ipg-1:ipg,ii,jj)
00075             call interpo_linear1p_type0_2Dsurf(Aij_surf,work)
00076             si = hvec_bh_cbh_xg(itg,ipg,ii)/rgin
00077             sj = hvec_bh_cbh_xg(itg,ipg,jj)/rgin
00078             Aij_sisj = Aij_sisj + Aij_surf*si*sj
00079           end do
00080         end do
00081         sou_surf(itg,ipg) = 2.0d0*rgin*(-dpsidr - 0.25d0*psigc3*Aij_sisj)
00082         dsou_surf(itg,ipg)= - 0.5d0*psigc/rgin  - 0.25d0*psigc3*Aij_sisj
00083       end do
00084     end do
00085     if (char_mp.eq.'alps') then
00086 
00087       sou_surf(1:ntg,1:npg) = alph_bh*psigc
00088       dsou_surf(1:ntg,1:npg)= alph_bh*dsou_surf(1:ntg,1:npg)
00089     end if
00090   end if
00091 
00092   if (char_mp.eq.'bvxd'.or.char_mp.eq.'bvyd'.or.char_mp.eq.'bvzd') then  
00093     if (char_mp.eq.'bvxd') ii = 1
00094     if (char_mp.eq.'bvyd') ii = 2
00095     if (char_mp.eq.'bvzd') ii = 3
00096 
00097     do ipg = 1, npg
00098       do itg = 1, ntg
00099         call interpo_linear_type0_2Dsurf(psigc,psi_bhsurf,itg,ipg)
00100         psigcinv2 = 1.0d0/psigc**2
00101         si = hvec_bh_cbh_xg(itg,ipg,ii)/rgin
00102         vphi_cm  = hvec_bh_cm_phig(itg,ipg,ii)
00103         vphi_cbh = hvec_bh_cbh_spin(itg,ipg,ii)
00104         if (bh_bctype.eq.'PG') then 
00105           vphi_cm = 0.0d0
00106           if (char_mp.eq.'bvyd') vphi_cm = - dis
00107         end if
00108         sou_surf(itg,ipg) = alph_bh*psigcinv2*si &
00109         &                 - ome_bh*vphi_cm - spin_bh*vphi_cbh
00110       end do
00111     end do
00112   end if
00113 
00114   deallocate(psi_bhsurf)
00115   deallocate(dpsi_bhsurf)
00116 
00117 end if
00118 
00119 end subroutine bh_boundary_CF