00001 subroutine sourceterm_HaC_WL(sou)
00002   use def_metric, only : psi
00003   use grid_parameter, only : nrg, ntg, npg
00004   use def_gamma_crist, only : gmcrix, gmcriy, gmcriz
00005   use def_ricci_tensor, only : rab
00006   use def_metric_hij, only : hxxu, hxyu, hxzu, hyyu, hyzu, hzzu
00007   use make_array_4d
00008   use make_array_3d
00009   use interface_interpo_linear_type0
00010   use interface_grgrad_midpoint
00011   use interface_dadbscalar_type0
00012   implicit none
00013 
00014   real(8), pointer :: sou(:,:,:)
00015   real(8), pointer :: grad(:,:,:,:), dfdx(:,:,:), dfdy(:,:,:), dfdz(:,:,:)
00016   real(8) :: dabfnc(3,3)
00017   real(8) :: gcdp, hd2p, hhgc, 
00018             psigc, rics, &
00019             rxx, rxy, rxz, ryx, ryy, ryz, rzx, rzy, rzz, &
00020             utgc, zfac, &
00021             gmxxu, gmxyu, gmxzu, gmyyu, gmyzu, gmzzu, gmyxu, gmzxu, gmzyu, &
00022             hhxxu, hhxyu, hhxzu, hhyyu, hhyzu, hhzzu, hhyxu, hhzxu, hhzyu
00023   integer :: ipg, irg, itg
00024 
00025   call alloc_array4d(grad,1,nrg,1,ntg,1,npg,1,3)
00026   call alloc_array3d(dfdx,1,nrg,1,ntg,1,npg)
00027   call alloc_array3d(dfdy,1,nrg,1,ntg,1,npg)
00028   call alloc_array3d(dfdz,1,nrg,1,ntg,1,npg)
00029 
00030 
00031 
00032   call grgrad_midpoint(psi,dfdx,dfdy,dfdz)
00033   grad(1:nrg,1:ntg,1:npg,1) = dfdx(1:nrg,1:ntg,1:npg)
00034   grad(1:nrg,1:ntg,1:npg,2) = dfdy(1:nrg,1:ntg,1:npg)
00035   grad(1:nrg,1:ntg,1:npg,3) = dfdz(1:nrg,1:ntg,1:npg)
00036 
00037   do ipg = 1, npg
00038     do itg = 1, ntg
00039       do irg = 1, nrg
00040 
00041         call interpo_linear_type0(psigc, psi,irg,itg,ipg)
00042 
00043         call interpo_linear_type0(hhxxu,hxxu,irg,itg,ipg)
00044         call interpo_linear_type0(hhxyu,hxyu,irg,itg,ipg)
00045         call interpo_linear_type0(hhxzu,hxzu,irg,itg,ipg)
00046         call interpo_linear_type0(hhyyu,hyyu,irg,itg,ipg)
00047         call interpo_linear_type0(hhyzu,hyzu,irg,itg,ipg)
00048         call interpo_linear_type0(hhzzu,hzzu,irg,itg,ipg)
00049         gmxxu = hhxxu + 1.0d0
00050         gmyyu = hhyyu + 1.0d0
00051         gmzzu = hhzzu + 1.0d0
00052         gmyxu = hhxyu
00053         gmzxu = hhxzu
00054         gmzyu = hhyzu
00055 
00056         rxx = rab(irg,itg,ipg,1)
00057         rxy = rab(irg,itg,ipg,2)
00058         rxz = rab(irg,itg,ipg,3)
00059         ryy = rab(irg,itg,ipg,4)
00060         ryz = rab(irg,itg,ipg,5)
00061         rzz = rab(irg,itg,ipg,6)
00062         ryx = rxy 
00063         rzx = rxz
00064         rzy = ryz
00065 
00066 
00067         rics = 0.0d0
00068         gcdp = 0.0d0
00069         hd2p = 0.0d0
00070 
00071         rics = gmxxu*rxx + gmxyu*rxy + gmxzu*rxz &
00072        &     + gmyxu*ryx + gmyyu*ryy + gmyzu*ryz &
00073        &     + gmzxu*rzx + gmzyu*rzy + gmzzu*rzz 
00074 
00075         gcdp = gmcrix(irg,itg,ipg)*grad(irg,itg,ipg,1) &
00076        &     + gmcriy(irg,itg,ipg)*grad(irg,itg,ipg,2) &
00077        &     + gmcriz(irg,itg,ipg)*grad(irg,itg,ipg,3)
00078 
00079         call dadbscalar_type0(psi,dabfnc,irg,itg,ipg)
00080         hd2p = hhxxu* dabfnc(1,1) &
00081        &     + hhxyu*(dabfnc(1,2) + dabfnc(2,1)) &
00082        &     + hhxzu*(dabfnc(1,3) + dabfnc(3,1)) &
00083        &     + hhyyu* dabfnc(2,2) &
00084        &     + hhyzu*(dabfnc(2,3) + dabfnc(3,2)) &
00085        &     + hhzzu* dabfnc(3,3)
00086 
00087         sou(irg,itg,ipg) = - hd2p + gcdp + 0.125d0*psigc*rics
00088 
00089       end do
00090     end do
00091   end do
00092 
00093   deallocate(grad)
00094   deallocate(dfdx)
00095   deallocate(dfdy)
00096   deallocate(dfdz)
00097 
00098 end subroutine sourceterm_HaC_WL