00001 subroutine gauge_hiju
00002 use grid_parameter, only : nrg, ntg, npg
00003 use def_metric_hij, only : hxxd, hxyd, hxzd, hyyd, hyzd, hzzd, &
00004 & hxxu, hxyu, hxzu, hyyu, hyzu, hzzu
00005 use interface_poisson_solver
00006 use make_array_3d
00007 use interface_grgrad_4th_gridpoint
00008 use interface_grgrad_midpoint_type0
00009 implicit none
00010
00011 real(8), pointer :: gx(:,:,:), gy(:,:,:), gz(:,:,:)
00012 real(8), pointer :: divg(:,:,:),
00013 sougx(:,:,:), sougy(:,:,:), sougz(:,:,:), &
00014 bfn(:,:,:)
00015 real(8) :: dgxdx, dgxdy, dgxdz, dgydx, dgydy, dgydz,
00016 dgzdx, dgzdy, dgzdz, &
00017 dhxxux, dhxxuy, dhxxuz, dhxyux, dhxyuy, dhxyuz, &
00018 dhxzux, dhxzuy, dhxzuz, &
00019 dhyxux, dhyxuy, dhyxuz, dhyyux, dhyyuy, dhyyuz, &
00020 dhyzux, dhyzuy, dhyzuz, &
00021 dhzxux, dhzxuy, dhzxuz, dhzyux, dhzyuy, dhzyuz, &
00022 dhzzux, dhzzuy, dhzzuz, &
00023 divgg, dlgxdx, dlgxdy, dlgxdz, dlgydy, dlgydz, dlgzdz, &
00024 fac23, hdhx, hdhy, hdhz, hxidiv, hxxuc, hxyuc, hxzuc, &
00025 hyidiv, hyxuc, hyyuc, hyzuc, hzidiv, hzxuc, hzyuc, hzzuc
00026 real(8) :: dbdx, dbdy, dbdz
00027 integer :: ipg, irg, itg
00028
00029 call alloc_array3d(gx,0,nrg,0,ntg,0,npg)
00030 call alloc_array3d(gy,0,nrg,0,ntg,0,npg)
00031 call alloc_array3d(gz,0,nrg,0,ntg,0,npg)
00032 call alloc_array3d(divg,0,nrg,0,ntg,0,npg)
00033 call alloc_array3d(sougx,0,nrg,0,ntg,0,npg)
00034 call alloc_array3d(sougy,0,nrg,0,ntg,0,npg)
00035 call alloc_array3d(sougz,0,nrg,0,ntg,0,npg)
00036 call alloc_array3d(bfn,0,nrg,0,ntg,0,npg)
00037
00038
00039
00040 do ipg = 1, npg
00041 do itg = 1, ntg
00042 do irg = 1, nrg
00043
00044 call grgrad_midpoint_type0(hxxu,dhxxux,dhxxuy,dhxxuz,irg,itg,ipg)
00045 call grgrad_midpoint_type0(hxyu,dhxyux,dhxyuy,dhxyuz,irg,itg,ipg)
00046 call grgrad_midpoint_type0(hxzu,dhxzux,dhxzuy,dhxzuz,irg,itg,ipg)
00047 call grgrad_midpoint_type0(hyyu,dhyyux,dhyyuy,dhyyuz,irg,itg,ipg)
00048 call grgrad_midpoint_type0(hyzu,dhyzux,dhyzuy,dhyzuz,irg,itg,ipg)
00049 call grgrad_midpoint_type0(hzzu,dhzzux,dhzzuy,dhzzuz,irg,itg,ipg)
00050 hxidiv = dhxxux + dhxyuy + dhxzuz
00051 hyidiv = dhxyux + dhyyuy + dhyzuz
00052 hzidiv = dhxzux + dhyzuy + dhzzuz
00053
00054
00055 sougx(irg,itg,ipg) = hxidiv
00056 sougy(irg,itg,ipg) = hyidiv
00057 sougz(irg,itg,ipg) = hzidiv
00058
00059 end do
00060 end do
00061 end do
00062
00063 call poisson_solver(sougx,gx)
00064 call poisson_solver(sougy,gy)
00065 call poisson_solver(sougz,gz)
00066
00067 do ipg = 1, npg
00068 do itg = 1, ntg
00069 do irg = 1, nrg
00070 call grgrad_midpoint_type0(gx,dgxdx,dgxdy,dgxdz,irg,itg,ipg)
00071 call grgrad_midpoint_type0(gy,dgydx,dgydy,dgydz,irg,itg,ipg)
00072 call grgrad_midpoint_type0(gz,dgzdx,dgzdy,dgzdz,irg,itg,ipg)
00073 divg(irg,itg,ipg) = dgxdx + dgydy + dgzdz
00074
00075
00076
00077
00078
00079
00080 end do
00081 end do
00082 end do
00083
00084 call poisson_solver(divg,bfn)
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098 do ipg = 0, npg
00099 do itg = 0, ntg
00100 do irg = 0, nrg
00101 call grgrad_4th_gridpoint(bfn,dbdx,dbdy,dbdz,irg,itg,ipg)
00102 gx(irg,itg,ipg) = gx(irg,itg,ipg) -0.25d0*dbdx
00103 gy(irg,itg,ipg) = gy(irg,itg,ipg) -0.25d0*dbdy
00104 gz(irg,itg,ipg) = gz(irg,itg,ipg) -0.25d0*dbdz
00105
00106
00107
00108 end do
00109 end do
00110 end do
00111
00112 fac23 = 2.0d0/3.0d0
00113 do ipg = 0, npg
00114 do itg = 0, ntg
00115 do irg = 0, nrg
00116
00117 call grgrad_4th_gridpoint(gx,dgxdx,dgxdy,dgxdz,irg,itg,ipg)
00118 call grgrad_4th_gridpoint(gy,dgydx,dgydy,dgydz,irg,itg,ipg)
00119 call grgrad_4th_gridpoint(gz,dgzdx,dgzdy,dgzdz,irg,itg,ipg)
00120
00121 divgg = dgxdx + dgydy + dgzdz
00122 dlgxdx = dgxdx + dgxdx - fac23*divgg
00123 dlgxdy = dgxdy + dgydx
00124 dlgxdz = dgxdz + dgzdx
00125 dlgydy = dgydy + dgydy - fac23*divgg
00126 dlgydz = dgydz + dgzdy
00127 dlgzdz = dgzdz + dgzdz - fac23*divgg
00128
00129 hxxu(irg,itg,ipg) = hxxu(irg,itg,ipg) - dlgxdx
00130 hxyu(irg,itg,ipg) = hxyu(irg,itg,ipg) - dlgxdy
00131 hxzu(irg,itg,ipg) = hxzu(irg,itg,ipg) - dlgxdz
00132 hyyu(irg,itg,ipg) = hyyu(irg,itg,ipg) - dlgydy
00133 hyzu(irg,itg,ipg) = hyzu(irg,itg,ipg) - dlgydz
00134 hzzu(irg,itg,ipg) = hzzu(irg,itg,ipg) - dlgzdz
00135
00136 end do
00137 end do
00138 end do
00139
00140 deallocate(gx)
00141 deallocate(gy)
00142 deallocate(gz)
00143 deallocate(divg)
00144 deallocate(sougx)
00145 deallocate(sougy)
00146 deallocate(sougz)
00147 deallocate(bfn)
00148 end subroutine gauge_hiju