00001 subroutine faraday
00002   use phys_constant,  only : long
00003   use make_array_3d
00004   use grid_parameter, only : nrg, ntg, npg
00005   use def_metric,  only : alph, bvxu, bvyu, bvzu
00006   use def_emfield,  only : alva, vaxd, vayd, vazd
00007   use def_faraday_tensor,  only : fxd, fyd, fzd, fijd
00008   use def_emfield_derivatives, only : Lie_bAxd, Lie_bAyd, Lie_bAzd
00009   use interface_grgrad_midpoint
00010   use interface_interpo_linear_type0
00011   implicit none
00012   integer :: irg, itg, ipg
00013   real(long) :: alpgc, ainvh, bvxugc, bvyugc, bvzugc
00014   real(long) :: vaxdgc, vaydgc, vazdgc
00015   real(long) :: dbvxdxgc, dbvxdygc, dbvxdzgc, 
00016                dbvydxgc, dbvydygc, dbvydzgc, & 
00017                dbvzdxgc, dbvzdygc, dbvzdzgc 
00018   real(long) :: dvaxdxgc, dvaxdygc, dvaxdzgc,  
00019                dvaydxgc, dvaydygc, dvaydzgc, &
00020                dvazdxgc, dvazdygc, dvazdzgc 
00021   real(long) :: dalvadxgc, dalvadygc, dalvadzgc
00022   real(long) :: lie_bAx, lie_bAy, lie_bAz
00023   real(long), pointer :: dbvxdx(:,:,:), dbvxdy(:,:,:), dbvxdz(:,:,:)
00024   real(long), pointer :: dbvydx(:,:,:), dbvydy(:,:,:), dbvydz(:,:,:)
00025   real(long), pointer :: dbvzdx(:,:,:), dbvzdy(:,:,:), dbvzdz(:,:,:)
00026   real(long), pointer :: dvaxdx(:,:,:), dvaxdy(:,:,:), dvaxdz(:,:,:)
00027   real(long), pointer :: dvaydx(:,:,:), dvaydy(:,:,:), dvaydz(:,:,:)
00028   real(long), pointer :: dvazdx(:,:,:), dvazdy(:,:,:), dvazdz(:,:,:)
00029   real(long), pointer :: dalvadx(:,:,:), dalvady(:,:,:), dalvadz(:,:,:)
00030 
00031 
00032 
00033 
00034   call alloc_array3d(dbvxdx, 0, nrg, 0, ntg, 0, npg)
00035   call alloc_array3d(dbvxdy, 0, nrg, 0, ntg, 0, npg)
00036   call alloc_array3d(dbvxdz, 0, nrg, 0, ntg, 0, npg)
00037   call alloc_array3d(dbvydx, 0, nrg, 0, ntg, 0, npg)
00038   call alloc_array3d(dbvydy, 0, nrg, 0, ntg, 0, npg)
00039   call alloc_array3d(dbvydz, 0, nrg, 0, ntg, 0, npg)
00040   call alloc_array3d(dbvzdx, 0, nrg, 0, ntg, 0, npg)
00041   call alloc_array3d(dbvzdy, 0, nrg, 0, ntg, 0, npg)
00042   call alloc_array3d(dbvzdz, 0, nrg, 0, ntg, 0, npg)
00043   call grgrad_midpoint(bvxu,dbvxdx,dbvxdy,dbvxdz)
00044   call grgrad_midpoint(bvyu,dbvydx,dbvydy,dbvydz)
00045   call grgrad_midpoint(bvzu,dbvzdx,dbvzdy,dbvzdz)
00046 
00047   call alloc_array3d(dvaxdx, 0, nrg, 0, ntg, 0, npg)
00048   call alloc_array3d(dvaxdy, 0, nrg, 0, ntg, 0, npg)
00049   call alloc_array3d(dvaxdz, 0, nrg, 0, ntg, 0, npg)
00050   call alloc_array3d(dvaydx, 0, nrg, 0, ntg, 0, npg)
00051   call alloc_array3d(dvaydy, 0, nrg, 0, ntg, 0, npg)
00052   call alloc_array3d(dvaydz, 0, nrg, 0, ntg, 0, npg)
00053   call alloc_array3d(dvazdx, 0, nrg, 0, ntg, 0, npg)
00054   call alloc_array3d(dvazdy, 0, nrg, 0, ntg, 0, npg)
00055   call alloc_array3d(dvazdz, 0, nrg, 0, ntg, 0, npg)
00056   call grgrad_midpoint(vaxd,dvaxdx,dvaxdy,dvaxdz)
00057   call grgrad_midpoint(vayd,dvaydx,dvaydy,dvaydz)
00058   call grgrad_midpoint(vazd,dvazdx,dvazdy,dvazdz)
00059 
00060   call alloc_array3d(dalvadx, 0, nrg, 0, ntg, 0, npg)
00061   call alloc_array3d(dalvady, 0, nrg, 0, ntg, 0, npg)
00062   call alloc_array3d(dalvadz, 0, nrg, 0, ntg, 0, npg)
00063   call grgrad_midpoint(alva,dalvadx,dalvady,dalvadz)
00064 
00065   do ipg = 1, npg
00066     do itg = 1, ntg
00067       do irg = 1, nrg
00068 
00069         call interpo_linear_type0(alpgc,alph,irg,itg,ipg)
00070         ainvh = 1.0d0/alpgc    
00071         call interpo_linear_type0(bvxugc,bvxu,irg,itg,ipg)
00072         call interpo_linear_type0(bvyugc,bvyu,irg,itg,ipg)
00073         call interpo_linear_type0(bvzugc,bvzu,irg,itg,ipg)
00074         call interpo_linear_type0(vaxdgc,vaxd,irg,itg,ipg)
00075         call interpo_linear_type0(vaydgc,vayd,irg,itg,ipg)
00076         call interpo_linear_type0(vazdgc,vazd,irg,itg,ipg)
00077         dbvxdxgc = dbvxdx(irg,itg,ipg) ; dvaxdxgc = dvaxdx(irg,itg,ipg)
00078         dbvxdygc = dbvxdy(irg,itg,ipg) ; dvaxdygc = dvaxdy(irg,itg,ipg)
00079         dbvxdzgc = dbvxdz(irg,itg,ipg) ; dvaxdzgc = dvaxdz(irg,itg,ipg)
00080         dbvydxgc = dbvydx(irg,itg,ipg) ; dvaydxgc = dvaydx(irg,itg,ipg)
00081         dbvydygc = dbvydy(irg,itg,ipg) ; dvaydygc = dvaydy(irg,itg,ipg)
00082         dbvydzgc = dbvydz(irg,itg,ipg) ; dvaydzgc = dvaydz(irg,itg,ipg)
00083         dbvzdxgc = dbvzdx(irg,itg,ipg) ; dvazdxgc = dvazdx(irg,itg,ipg)
00084         dbvzdygc = dbvzdy(irg,itg,ipg) ; dvazdygc = dvazdy(irg,itg,ipg)
00085         dbvzdzgc = dbvzdz(irg,itg,ipg) ; dvazdzgc = dvazdz(irg,itg,ipg)
00086         dalvadxgc = dalvadx(irg,itg,ipg)
00087         dalvadygc = dalvady(irg,itg,ipg)
00088         dalvadzgc = dalvadz(irg,itg,ipg)
00089 
00090         lie_bAx = bvxugc*dvaxdxgc + bvyugc*dvaxdygc + bvzugc*dvaxdzgc &
00091         &       + vaxdgc*dbvxdxgc + vaydgc*dbvydxgc + vazdgc*dbvzdxgc
00092         lie_bAy = bvxugc*dvaydxgc + bvyugc*dvaydygc + bvzugc*dvaydzgc &
00093         &       + vaxdgc*dbvxdygc + vaydgc*dbvydygc + vazdgc*dbvzdygc
00094         lie_bAz = bvxugc*dvazdxgc + bvyugc*dvazdygc + bvzugc*dvazdzgc &
00095         &       + vaxdgc*dbvxdzgc + vaydgc*dbvydzgc + vazdgc*dbvzdzgc
00096 
00097         Lie_bAxd(irg,itg,ipg) = lie_bAx
00098         Lie_bAyd(irg,itg,ipg) = lie_bAy
00099         Lie_bAzd(irg,itg,ipg) = lie_bAz
00100 
00101         fxd(irg,itg,ipg) = ainvh*(lie_bAx - dalvadxgc)
00102         fyd(irg,itg,ipg) = ainvh*(lie_bAy - dalvadygc)
00103         fzd(irg,itg,ipg) = ainvh*(lie_bAz - dalvadzgc)
00104         fijd(irg,itg,ipg,1) = dvaydxgc - dvaxdygc
00105         fijd(irg,itg,ipg,2) = dvazdxgc - dvaxdzgc
00106         fijd(irg,itg,ipg,3) = dvazdygc - dvaydzgc
00107 
00108       end do
00109     end do
00110   end do
00111 
00112   deallocate(dalvadx)
00113   deallocate(dalvady)
00114   deallocate(dalvadz)
00115   deallocate(dvaxdx)
00116   deallocate(dvaxdy)
00117   deallocate(dvaxdz)
00118   deallocate(dvaydx)
00119   deallocate(dvaydy)
00120   deallocate(dvaydz)
00121   deallocate(dvazdx)
00122   deallocate(dvazdy)
00123   deallocate(dvazdz)
00124 
00125   deallocate(dbvxdx)
00126   deallocate(dbvxdy)
00127   deallocate(dbvxdz)
00128   deallocate(dbvydx)
00129   deallocate(dbvydy)
00130   deallocate(dbvydz)
00131   deallocate(dbvzdx)
00132   deallocate(dbvzdy)
00133   deallocate(dbvzdz)
00134 
00135 end subroutine faraday