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