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