00001 subroutine excurve
00002 use phys_constant, only : long
00003 use grid_parameter, only : nrg, ntg, npg
00004 use def_metric, only : alph, bvxd, bvyd, bvzd, tfkij, tfkijkij, trk
00005 use interface_grgrad_midpoint
00006 use interface_interpo_linear_type0
00007 use make_array_3d
00008 implicit none
00009 integer :: info
00010 integer :: ia, ib
00011 integer :: irg, itg, ipg
00012 real(long) :: fa23, diver
00013 real(long) :: alpgc, ainvh, cdivbv
00014 real(long), pointer :: dbvxdx(:,:,:), dbvxdy(:,:,:), dbvxdz(:,:,:)
00015 real(long), pointer :: dbvydx(:,:,:), dbvydy(:,:,:), dbvydz(:,:,:)
00016 real(long), pointer :: dbvzdx(:,:,:), dbvzdy(:,:,:), dbvzdz(:,:,:)
00017
00018
00019
00020
00021
00022 info = 0
00023
00024
00025 fa23 = 2.0d0/3.0d0
00026
00027 call alloc_array3d(dbvxdx, 0, nrg, 0, ntg, 0, npg)
00028 call alloc_array3d(dbvxdy, 0, nrg, 0, ntg, 0, npg)
00029 call alloc_array3d(dbvxdz, 0, nrg, 0, ntg, 0, npg)
00030 call alloc_array3d(dbvydx, 0, nrg, 0, ntg, 0, npg)
00031 call alloc_array3d(dbvydy, 0, nrg, 0, ntg, 0, npg)
00032 call alloc_array3d(dbvydz, 0, nrg, 0, ntg, 0, npg)
00033 call alloc_array3d(dbvzdx, 0, nrg, 0, ntg, 0, npg)
00034 call alloc_array3d(dbvzdy, 0, nrg, 0, ntg, 0, npg)
00035 call alloc_array3d(dbvzdz, 0, nrg, 0, ntg, 0, npg)
00036 call grgrad_midpoint(bvxd,dbvxdx,dbvxdy,dbvxdz)
00037 call grgrad_midpoint(bvyd,dbvydx,dbvydy,dbvydz)
00038 call grgrad_midpoint(bvzd,dbvzdx,dbvzdy,dbvzdz)
00039
00040 do ipg = 1, npg
00041 do itg = 1, ntg
00042 do irg = 1, nrg
00043
00044 call interpo_linear_type0(alpgc,alph,irg,itg,ipg)
00045 ainvh = 0.5d0/alpgc
00046 cdivbv = dbvxdx(irg,itg,ipg) + dbvydy(irg,itg,ipg) &
00047 + dbvzdz(irg,itg,ipg)
00048 diver = fa23*cdivbv
00049
00050 tfkij(irg,itg,ipg,1,1) = ainvh*(2.0d0*dbvxdx(irg,itg,ipg) &
00051 - diver)
00052 tfkij(irg,itg,ipg,2,2) = ainvh*(2.0d0*dbvydy(irg,itg,ipg) &
00053 - diver)
00054 tfkij(irg,itg,ipg,3,3) = ainvh*(2.0d0*dbvzdz(irg,itg,ipg) &
00055 - diver)
00056 tfkij(irg,itg,ipg,1,2) = ainvh*(dbvydx(irg,itg,ipg) &
00057 + dbvxdy(irg,itg,ipg))
00058 tfkij(irg,itg,ipg,1,3) = ainvh*(dbvzdx(irg,itg,ipg) &
00059 + dbvxdz(irg,itg,ipg))
00060 tfkij(irg,itg,ipg,2,3) = ainvh*(dbvzdy(irg,itg,ipg) &
00061 + dbvydz(irg,itg,ipg))
00062 tfkij(irg,itg,ipg,2,1) = tfkij(irg,itg,ipg,1,2)
00063 tfkij(irg,itg,ipg,3,1) = tfkij(irg,itg,ipg,1,3)
00064 tfkij(irg,itg,ipg,3,2) = tfkij(irg,itg,ipg,2,3)
00065
00066 tfkijkij(irg,itg,ipg) = 0.0d0
00067 trk(irg,itg,ipg) = 0.0d0
00068 do ib = 1, 3
00069 do ia = 1, 3
00070 tfkijkij(irg,itg,ipg) = tfkijkij(irg,itg,ipg) &
00071 + tfkij(irg,itg,ipg,ia,ib)*tfkij(irg,itg,ipg,ia,ib)
00072 end do
00073 end do
00074
00075 if (tfkijkij(irg,itg,ipg) /= 0.0d0) info = 1
00076
00077 end do
00078 end do
00079 end do
00080
00081 if (info /= 1) write(6,*) ' ### Warning K_ij = 0 *** '
00082 deallocate(dbvxdx)
00083 deallocate(dbvxdy)
00084 deallocate(dbvxdz)
00085 deallocate(dbvydx)
00086 deallocate(dbvydy)
00087 deallocate(dbvydz)
00088 deallocate(dbvzdx)
00089 deallocate(dbvzdy)
00090 deallocate(dbvzdz)
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101 end subroutine excurve
00102
00103
00104