00001 subroutine calc_surface_normal_tangent_midpoint(rs,nv,tv,it,ip)
00002 use phys_constant, only : long, nmpt
00003 use trigonometry_grav_theta, only : hsinthg, hcosthg, hcosecthg
00004 use trigonometry_grav_phi, only : hsinphig, hcosphig
00005 use interface_flgrad_midpoint_type0_2Dsurf_sph
00006 use interface_interpo_linear_type0_2Dsurf
00007 implicit none
00008 real(long), pointer :: rs(:,:), nv(:), tv(:)
00009
00010 real(long) :: rnr, rnth, rnphi, dtrs, dprs, hrs, hrsinv, nvnorm, tvnorm
00011 real(long) :: erx, ery, erz, ethx, ethy, ethz, ephix, ephiy, ephiz
00012 integer :: ir, it, ip
00013
00014 call flgrad_midpoint_type0_2Dsurf_sph(rs,dtrs,dprs,it,ip)
00015 call interpo_linear_type0_2Dsurf(hrs,rs,it,ip)
00016 hrsinv = 1.0d0/hrs
00017
00018 rnr = 1.0d0
00019 rnth = - hrsinv*dtrs
00020 rnphi = - hrsinv*hcosecthg(it)*dprs
00021
00022 nvnorm = sqrt(rnr*rnr + rnth*rnth + rnphi*rnphi)
00023
00024 erx = hsinthg(it)*hcosphig(ip)
00025 ery = hsinthg(it)*hsinphig(ip)
00026 erz = hcosthg(it)
00027 ethx = hcosthg(it)*hcosphig(ip)
00028 ethy = hcosthg(it)*hsinphig(ip)
00029 ethz = - hsinthg(it)
00030 ephix = - hsinphig(ip)
00031 ephiy = hcosphig(ip)
00032 ephiz = 0.0d0
00033 nv(1) = (rnr*erx + rnth*ethx + rnphi*ephix)/nvnorm
00034 nv(2) = (rnr*ery + rnth*ethy + rnphi*ephiy)/nvnorm
00035 nv(3) = (rnr*erz + rnth*ethz + rnphi*ephiz)/nvnorm
00036
00037
00038 rnr = dprs
00039 rnth = 0.0d0
00040 rnphi = hrs*hsinthg(it)
00041
00042
00043 tvnorm = 1.0d0
00044
00045 tv(1) = (rnr*erx + rnth*ethx + rnphi*ephix)/tvnorm
00046 tv(2) = (rnr*ery + rnth*ethy + rnphi*ephiy)/tvnorm
00047 tv(3) = (rnr*erz + rnth*ethz + rnphi*ephiz)/tvnorm
00048
00049 end subroutine calc_surface_normal_tangent_midpoint