00001 subroutine excurve_WL_midpoint
00002 use phys_constant, only : nnrg, nntg, nnpg, pi
00003 use grid_parameter, only : nrg, ntg, npg
00004 use def_matter_parameter, only : ome, ber, radi
00005 use def_metric, only : alph, tfkij, tfkijkij, &
00006 & bvxd, bvyd, bvzd, bvxu, bvyu, bvzu
00007 use coordinate_grav_r, only : rg
00008
00009 use def_cristoffel, only : cri
00010 use def_Lie_derivatives, only : elpxx, elpxy, elpxz, elpyy, elpyz, elpzz, &
00011 & rlbxx, rlbxy, rlbxz, rlbyy, rlbyz, rlbzz
00012 use def_shift_derivatives, only : cdbvxd, cdbvyd, cdbvzd, cdivbv, &
00013 & pdbvxd, pdbvyd, pdbvzd
00014 use def_metric_hij, only : hxxd, hxyd, hxzd, hyyd, hyzd, hzzd, &
00015 & hxxu, hxyu, hxzu, hyyu, hyzu, hzzu
00016 use def_cutsw, only : cutfac
00017 use def_formulation, only : chgra
00018
00019 use interface_interpo_linear_type0
00020 use interface_grgrad_midpoint
00021 use make_array_3d
00022 use make_array_4d
00023 implicit none
00024
00025 real(8), pointer :: dbvxu(:,:,:,:), dbvyu(:,:,:,:), dbvzu(:,:,:,:)
00026 real(8), pointer :: dfdx(:,:,:), dfdy(:,:,:), dfdz(:,:,:)
00027 real(8) :: gamu(3,3)
00028 real(8) :: ainvh, bvxha, bvyha, bvzha, cutoff, diver, fa23,
00029 dbvxdx, dbvxdy, dbvxdz, &
00030 dbvydx, dbvydy, dbvydz, &
00031 dbvzdx, dbvzdy, dbvzdz, &
00032 gmxxd, gmxyd, gmxzd, gmxxu, gmxyu, gmxzu, &
00033 gmyxd, gmyyd, gmyzd, gmyxu, gmyyu, gmyzu, &
00034 gmzxd, gmzyd, gmzzd, gmzxu, gmzyu, gmzzu, &
00035 oelpxx, oelpxy, oelpxz, &
00036 oelpyy, oelpyz, oelpzz, &
00037 pdbvxdx, pdbvxdy, pdbvxdz, &
00038 pdbvydx, pdbvydy, pdbvydz, &
00039 pdbvzdx, pdbvzdy, pdbvzdz
00040 integer :: ia, ib, ic, id, info, ipg, irg, itg
00041
00042 call alloc_array3d(dfdx,1,nrg,1,ntg,1,npg)
00043 call alloc_array3d(dfdy,1,nrg,1,ntg,1,npg)
00044 call alloc_array3d(dfdz,1,nrg,1,ntg,1,npg)
00045 call alloc_array4d(dbvxu,1,nrg,1,ntg,1,npg,1,3)
00046 call alloc_array4d(dbvyu,1,nrg,1,ntg,1,npg,1,3)
00047 call alloc_array4d(dbvzu,1,nrg,1,ntg,1,npg,1,3)
00048
00049
00050
00051
00052
00053 info = 0
00054
00055
00056 fa23 = 2.0d0/3.0d0
00057
00058 call grgrad_midpoint(bvxd,dfdx,dfdy,dfdz)
00059 pdbvxd(1:nrg,1:ntg,1:npg,1) = dfdx(1:nrg,1:ntg,1:npg)
00060 pdbvxd(1:nrg,1:ntg,1:npg,2) = dfdy(1:nrg,1:ntg,1:npg)
00061 pdbvxd(1:nrg,1:ntg,1:npg,3) = dfdz(1:nrg,1:ntg,1:npg)
00062
00063 call grgrad_midpoint(bvyd,dfdx,dfdy,dfdz)
00064 pdbvyd(1:nrg,1:ntg,1:npg,1) = dfdx(1:nrg,1:ntg,1:npg)
00065 pdbvyd(1:nrg,1:ntg,1:npg,2) = dfdy(1:nrg,1:ntg,1:npg)
00066 pdbvyd(1:nrg,1:ntg,1:npg,3) = dfdz(1:nrg,1:ntg,1:npg)
00067
00068 call grgrad_midpoint(bvzd,dfdx,dfdy,dfdz)
00069 pdbvzd(1:nrg,1:ntg,1:npg,1) = dfdx(1:nrg,1:ntg,1:npg)
00070 pdbvzd(1:nrg,1:ntg,1:npg,2) = dfdy(1:nrg,1:ntg,1:npg)
00071 pdbvzd(1:nrg,1:ntg,1:npg,3) = dfdz(1:nrg,1:ntg,1:npg)
00072
00073 call grgrad_midpoint(bvxu,dfdx,dfdy,dfdz)
00074 dbvxu(1:nrg,1:ntg,1:npg,1) = dfdx(1:nrg,1:ntg,1:npg)
00075 dbvxu(1:nrg,1:ntg,1:npg,2) = dfdy(1:nrg,1:ntg,1:npg)
00076 dbvxu(1:nrg,1:ntg,1:npg,3) = dfdz(1:nrg,1:ntg,1:npg)
00077
00078 call grgrad_midpoint(bvyu,dfdx,dfdy,dfdz)
00079 dbvyu(1:nrg,1:ntg,1:npg,1) = dfdx(1:nrg,1:ntg,1:npg)
00080 dbvyu(1:nrg,1:ntg,1:npg,2) = dfdy(1:nrg,1:ntg,1:npg)
00081 dbvyu(1:nrg,1:ntg,1:npg,3) = dfdz(1:nrg,1:ntg,1:npg)
00082
00083 call grgrad_midpoint(bvzu,dfdx,dfdy,dfdz)
00084 dbvzu(1:nrg,1:ntg,1:npg,1) = dfdx(1:nrg,1:ntg,1:npg)
00085 dbvzu(1:nrg,1:ntg,1:npg,2) = dfdy(1:nrg,1:ntg,1:npg)
00086 dbvzu(1:nrg,1:ntg,1:npg,3) = dfdz(1:nrg,1:ntg,1:npg)
00087
00088 do ipg = 1, npg
00089 do itg = 1, ntg
00090 do irg = 1, nrg
00091
00092 cutoff = 1.0d0
00093 if (chgra == 'c'.or.chgra == 'C'.or.chgra == 'W') then
00094 if (rg(irg) > cutfac*pi/ome) cutoff = 0.0d0
00095 end if
00096
00097 call interpo_linear_type0(bvxha,bvxd,irg,itg,ipg)
00098 call interpo_linear_type0(bvyha,bvyd,irg,itg,ipg)
00099 call interpo_linear_type0(bvzha,bvzd,irg,itg,ipg)
00100 call interpo_linear_type0(ainvh,alph,irg,itg,ipg)
00101 ainvh = 0.5d0/ainvh
00102
00103 pdbvxdx = dbvxu(irg,itg,ipg,1)
00104 pdbvxdy = dbvxu(irg,itg,ipg,2)
00105 pdbvxdz = dbvxu(irg,itg,ipg,3)
00106 pdbvydx = dbvyu(irg,itg,ipg,1)
00107 pdbvydy = dbvyu(irg,itg,ipg,2)
00108 pdbvydz = dbvyu(irg,itg,ipg,3)
00109 pdbvzdx = dbvzu(irg,itg,ipg,1)
00110 pdbvzdy = dbvzu(irg,itg,ipg,2)
00111 pdbvzdz = dbvzu(irg,itg,ipg,3)
00112
00113 cdbvxd(irg,itg,ipg,1) = pdbvxd(irg,itg,ipg,1) &
00114 & - cri(irg,itg,ipg,1,1)*bvxha &
00115 & - cri(irg,itg,ipg,2,1)*bvyha &
00116 & - cri(irg,itg,ipg,3,1)*bvzha
00117 cdbvyd(irg,itg,ipg,1) = pdbvyd(irg,itg,ipg,1) &
00118 & - cri(irg,itg,ipg,1,2)*bvxha &
00119 & - cri(irg,itg,ipg,2,2)*bvyha &
00120 & - cri(irg,itg,ipg,3,2)*bvzha
00121 cdbvzd(irg,itg,ipg,1) = pdbvzd(irg,itg,ipg,1) &
00122 & - cri(irg,itg,ipg,1,3)*bvxha &
00123 & - cri(irg,itg,ipg,2,3)*bvyha &
00124 & - cri(irg,itg,ipg,3,3)*bvzha
00125
00126 cdbvxd(irg,itg,ipg,2) = pdbvxd(irg,itg,ipg,2) &
00127 & - cri(irg,itg,ipg,1,2)*bvxha &
00128 & - cri(irg,itg,ipg,2,2)*bvyha &
00129 & - cri(irg,itg,ipg,3,2)*bvzha
00130 cdbvyd(irg,itg,ipg,2) = pdbvyd(irg,itg,ipg,2) &
00131 & - cri(irg,itg,ipg,1,4)*bvxha &
00132 & - cri(irg,itg,ipg,2,4)*bvyha &
00133 & - cri(irg,itg,ipg,3,4)*bvzha
00134 cdbvzd(irg,itg,ipg,2) = pdbvzd(irg,itg,ipg,2) &
00135 & - cri(irg,itg,ipg,1,5)*bvxha &
00136 & - cri(irg,itg,ipg,2,5)*bvyha &
00137 & - cri(irg,itg,ipg,3,5)*bvzha
00138
00139 cdbvxd(irg,itg,ipg,3) = pdbvxd(irg,itg,ipg,3) &
00140 & - cri(irg,itg,ipg,1,3)*bvxha &
00141 & - cri(irg,itg,ipg,2,3)*bvyha &
00142 & - cri(irg,itg,ipg,3,3)*bvzha
00143 cdbvyd(irg,itg,ipg,3) = pdbvyd(irg,itg,ipg,3) &
00144 & - cri(irg,itg,ipg,1,5)*bvxha &
00145 & - cri(irg,itg,ipg,2,5)*bvyha &
00146 & - cri(irg,itg,ipg,3,5)*bvzha
00147 cdbvzd(irg,itg,ipg,3) = pdbvzd(irg,itg,ipg,3) &
00148 & - cri(irg,itg,ipg,1,6)*bvxha &
00149 & - cri(irg,itg,ipg,2,6)*bvyha &
00150 & - cri(irg,itg,ipg,3,6)*bvzha
00151
00152 dbvxdx = cdbvxd(irg,itg,ipg,1)
00153 dbvydx = cdbvyd(irg,itg,ipg,1)
00154 dbvzdx = cdbvzd(irg,itg,ipg,1)
00155
00156 dbvxdy = cdbvxd(irg,itg,ipg,2)
00157 dbvydy = cdbvyd(irg,itg,ipg,2)
00158 dbvzdy = cdbvzd(irg,itg,ipg,2)
00159
00160 dbvxdz = cdbvxd(irg,itg,ipg,3)
00161 dbvydz = cdbvyd(irg,itg,ipg,3)
00162 dbvzdz = cdbvzd(irg,itg,ipg,3)
00163
00164 call interpo_linear_type0(gmxxd,hxxd,irg,itg,ipg)
00165 call interpo_linear_type0(gmxyd,hxyd,irg,itg,ipg)
00166 call interpo_linear_type0(gmxzd,hxzd,irg,itg,ipg)
00167 call interpo_linear_type0(gmyyd,hyyd,irg,itg,ipg)
00168 call interpo_linear_type0(gmyzd,hyzd,irg,itg,ipg)
00169 call interpo_linear_type0(gmzzd,hzzd,irg,itg,ipg)
00170 gmxxd = gmxxd + 1.0d0
00171 gmyyd = gmyyd + 1.0d0
00172 gmzzd = gmzzd + 1.0d0
00173 gmyxd = gmxyd
00174 gmzxd = gmxzd
00175 gmzyd = gmyzd
00176 call interpo_linear_type0(gmxxu,hxxu,irg,itg,ipg)
00177 call interpo_linear_type0(gmxyu,hxyu,irg,itg,ipg)
00178 call interpo_linear_type0(gmxzu,hxzu,irg,itg,ipg)
00179 call interpo_linear_type0(gmyyu,hyyu,irg,itg,ipg)
00180 call interpo_linear_type0(gmyzu,hyzu,irg,itg,ipg)
00181 call interpo_linear_type0(gmzzu,hzzu,irg,itg,ipg)
00182 gmyyu = gmyyu + 1.0d0
00183 gmxxu = gmxxu + 1.0d0
00184 gmzzu = gmzzu + 1.0d0
00185 gmyxu = gmxyu
00186 gmzxu = gmxzu
00187 gmzyu = gmyzu
00188
00189
00190
00191
00192 cdivbv(irg,itg,ipg) = pdbvxdx + pdbvydy + pdbvzdz
00193 diver = fa23*cdivbv(irg,itg,ipg)
00194
00195
00196
00197 oelpxx = 0.0d0
00198 oelpxy = 0.0d0
00199 oelpxz = 0.0d0
00200 oelpyy = 0.0d0
00201 oelpyz = 0.0d0
00202 oelpzz = 0.0d0
00203 if (chgra == 'h'.or.chgra == 'c'.or.chgra == 'C' &
00204 &.or.chgra == 'H'.or.chgra == 'W') then
00205 oelpxx = ainvh*ome*elpxx(irg,itg,ipg)*cutoff
00206 oelpxy = ainvh*ome*elpxy(irg,itg,ipg)*cutoff
00207 oelpxz = ainvh*ome*elpxz(irg,itg,ipg)*cutoff
00208 oelpyy = ainvh*ome*elpyy(irg,itg,ipg)*cutoff
00209 oelpyz = ainvh*ome*elpyz(irg,itg,ipg)*cutoff
00210 oelpzz = ainvh*ome*elpzz(irg,itg,ipg)*cutoff
00211 end if
00212
00213 tfkij(irg,itg,ipg,1,1) = ainvh*(2.0d0*dbvxdx-gmxxd*diver) +oelpxx
00214 tfkij(irg,itg,ipg,2,2) = ainvh*(2.0d0*dbvydy-gmyyd*diver) +oelpyy
00215 tfkij(irg,itg,ipg,3,3) = ainvh*(2.0d0*dbvzdz-gmzzd*diver) +oelpzz
00216 tfkij(irg,itg,ipg,1,2) = ainvh*(dbvydx+dbvxdy-gmxyd*diver)+oelpxy
00217 tfkij(irg,itg,ipg,1,3) = ainvh*(dbvzdx+dbvxdz-gmxzd*diver)+oelpxz
00218 tfkij(irg,itg,ipg,2,3) = ainvh*(dbvzdy+dbvydz-gmyzd*diver)+oelpyz
00219 tfkij(irg,itg,ipg,2,1) = tfkij(irg,itg,ipg,1,2)
00220 tfkij(irg,itg,ipg,3,1) = tfkij(irg,itg,ipg,1,3)
00221 tfkij(irg,itg,ipg,3,2) = tfkij(irg,itg,ipg,2,3)
00222
00223 gamu(1,1) = gmxxu
00224 gamu(1,2) = gmxyu
00225 gamu(1,3) = gmxzu
00226 gamu(2,1) = gmyxu
00227 gamu(2,2) = gmyyu
00228 gamu(2,3) = gmyzu
00229 gamu(3,1) = gmzxu
00230 gamu(3,2) = gmzyu
00231 gamu(3,3) = gmzzu
00232
00233 tfkijkij(irg,itg,ipg) = 0.0d0
00234 do id = 1, 3
00235 do ic = 1, 3
00236 do ib = 1, 3
00237 do ia = 1, 3
00238 tfkijkij(irg,itg,ipg) = tfkijkij(irg,itg,ipg) &
00239 & + gamu(ia,ic)*gamu(ib,id) &
00240 & *tfkij(irg,itg,ipg,ia,ib)*tfkij(irg,itg,ipg,ic,id)
00241 end do
00242 end do
00243 end do
00244 end do
00245
00246 if (tfkijkij(irg,itg,ipg) /= 0.) info = 1
00247
00248
00249
00250 rlbxx(irg,itg,ipg) = 2.0d0*dbvxdx
00251 rlbxy(irg,itg,ipg) = dbvydx + dbvxdy
00252 rlbxz(irg,itg,ipg) = dbvzdx + dbvxdz
00253 rlbyy(irg,itg,ipg) = 2.0d0*dbvydy
00254 rlbyz(irg,itg,ipg) = dbvzdy + dbvydz
00255 rlbzz(irg,itg,ipg) = 2.0d0*dbvzdz
00256
00257 end do
00258 end do
00259 end do
00260 if (info /= 1) write(6,*) ' ### Warning K_ij = 0 *** '
00261
00262 deallocate(dbvxu)
00263 deallocate(dbvyu)
00264 deallocate(dbvzu)
00265 deallocate(dfdx)
00266 deallocate(dfdy)
00267 deallocate(dfdz)
00268
00269 end subroutine excurve_WL_midpoint