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