00001 subroutine gauge
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             dhxxdx, dhxxdy, dhxxdz, dhxydx, dhxydy, dhxydz, &
00018             dhxzdx, dhxzdy, dhxzdz, &
00019             dhyxdx, dhyxdy, dhyxdz, dhyydx, dhyydy, dhyydz, &
00020             dhyzdx, dhyzdy, dhyzdz, &
00021             dhzxdx, dhzxdy, dhzxdz, dhzydx, dhzydy, dhzydz, &
00022             dhzzdx, dhzzdy, dhzzdz, &
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(hxxd,dhxxdx,dhxxdy,dhxxdz,irg,itg,ipg)
00045         call grgrad_midpoint_type0(hxyd,dhxydx,dhxydy,dhxydz,irg,itg,ipg)
00046         call grgrad_midpoint_type0(hxzd,dhxzdx,dhxzdy,dhxzdz,irg,itg,ipg)
00047         call grgrad_midpoint_type0(hyyd,dhyydx,dhyydy,dhyydz,irg,itg,ipg)
00048         call grgrad_midpoint_type0(hyzd,dhyzdx,dhyzdy,dhyzdz,irg,itg,ipg)
00049         call grgrad_midpoint_type0(hzzd,dhzzdx,dhzzdy,dhzzdz,irg,itg,ipg)
00050         hxidiv = dhxxdx + dhxydy + dhxzdz
00051         hyidiv = dhxydx + dhyydy + dhyzdz
00052         hzidiv = dhxzdx + dhyzdy + dhzzdz
00053 
00054 
00055 
00056 
00057 
00058 
00059 
00060 
00061 
00062 
00063 
00064 
00065 
00066 
00067 
00068 
00069 
00070 
00071 
00072 
00073 
00074 
00075 
00076         sougx(irg,itg,ipg) = hxidiv
00077         sougy(irg,itg,ipg) = hyidiv
00078         sougz(irg,itg,ipg) = hzidiv
00079 
00080       end do
00081     end do
00082   end do
00083 
00084   call poisson_solver(sougx,gx)
00085   call poisson_solver(sougy,gy)
00086   call poisson_solver(sougz,gz)
00087 
00088   do ipg = 1, npg
00089     do itg = 1, ntg
00090       do irg = 1, nrg
00091         call grgrad_midpoint_type0(gx,dgxdx,dgxdy,dgxdz,irg,itg,ipg)
00092         call grgrad_midpoint_type0(gy,dgydx,dgydy,dgydz,irg,itg,ipg)
00093         call grgrad_midpoint_type0(gz,dgzdx,dgzdy,dgzdz,irg,itg,ipg)
00094         divg(irg,itg,ipg) = dgxdx + dgydy + dgzdz
00095 
00096 
00097 
00098 
00099 
00100 
00101       end do
00102     end do
00103   end do
00104 
00105   call poisson_solver(divg,bfn)
00106 
00107 
00108 
00109 
00110 
00111 
00112 
00113 
00114 
00115 
00116 
00117 
00118 
00119   do ipg = 0, npg
00120     do itg = 0, ntg
00121       do irg = 0, nrg
00122         call grgrad_4th_gridpoint(bfn,dbdx,dbdy,dbdz,irg,itg,ipg)
00123         gx(irg,itg,ipg) = gx(irg,itg,ipg) -0.25d0*dbdx
00124         gy(irg,itg,ipg) = gy(irg,itg,ipg) -0.25d0*dbdy
00125         gz(irg,itg,ipg) = gz(irg,itg,ipg) -0.25d0*dbdz
00126 
00127 
00128 
00129       end do
00130     end do
00131   end do
00132 
00133   fac23 = 2.0d0/3.0d0
00134   do ipg = 0, npg
00135     do itg = 0, ntg
00136       do irg = 0, nrg
00137 
00138         call grgrad_4th_gridpoint(gx,dgxdx,dgxdy,dgxdz,irg,itg,ipg)
00139         call grgrad_4th_gridpoint(gy,dgydx,dgydy,dgydz,irg,itg,ipg)
00140         call grgrad_4th_gridpoint(gz,dgzdx,dgzdy,dgzdz,irg,itg,ipg)
00141 
00142         divgg  = dgxdx + dgydy + dgzdz
00143         dlgxdx = dgxdx + dgxdx - fac23*divgg
00144         dlgxdy = dgxdy + dgydx
00145         dlgxdz = dgxdz + dgzdx
00146         dlgydy = dgydy + dgydy - fac23*divgg
00147         dlgydz = dgydz + dgzdy
00148         dlgzdz = dgzdz + dgzdz - fac23*divgg
00149 
00150         hxxd(irg,itg,ipg) = hxxd(irg,itg,ipg) - dlgxdx
00151         hxyd(irg,itg,ipg) = hxyd(irg,itg,ipg) - dlgxdy
00152         hxzd(irg,itg,ipg) = hxzd(irg,itg,ipg) - dlgxdz
00153         hyyd(irg,itg,ipg) = hyyd(irg,itg,ipg) - dlgydy
00154         hyzd(irg,itg,ipg) = hyzd(irg,itg,ipg) - dlgydz
00155         hzzd(irg,itg,ipg) = hzzd(irg,itg,ipg) - dlgzdz
00156 
00157       end do
00158     end do
00159   end do
00160 
00161   deallocate(gx)
00162   deallocate(gy)
00163   deallocate(gz)
00164   deallocate(divg)
00165   deallocate(sougx)
00166   deallocate(sougy)
00167   deallocate(sougz)
00168   deallocate(bfn)
00169 end subroutine gauge