00001 subroutine poisson_solver_homogeneous_sol(surp,vpot_b)
00002   use grid_parameter, only : nrf, ntf, npf
00003   use def_metric_on_SFC, only : hxxdf, hxydf, hxzdf, hyydf, hyzdf, hzzdf
00004   use trigonometry_grav_theta, only : hcosecg
00005   use trigonometry_grav_phi, only : sinmpg, hsinmpg, hcosmpg
00006   use def_matter, only : rs
00007   use def_velocity_potential, only : alm
00008   use def_vector_phi, only : hvec_phif_surface
00009   use interface_interpo_linear_surface_type0
00010   use interface_flgrad_midpoint_surface_type0
00011   use interface_flgrad_midpoint_type0_2Dsurf_sph
00012   use interface_interpo_linear_type0_2Dsurf
00013   use make_array1d
00014   use make_array2d
00015   implicit none
00016   real(long), pointer :: surp(:,:), vpot_b(:,:,:)
00017   real(long), pointer :: sgg(:), gg(:,:)
00018   real(long) :: hhxxu, hhxyu, hhxzu, hhyxu, hhyyu, hhyzu, 
00019                hhzxu, hhzyu, hhzzu
00020   real(long) :: gamxxu, gamxyu, gamxzu, gamyxu, gamyyu, gamyzu, 
00021                gamzxu, gamzyu, gamzzu
00022   real(long) :: dxvep, dyvep, dzvep, dtrs, dprs, hrs
00023   real(long) :: rnr, rnth, rnphi, rnx, rny, rnz
00024   real(long) :: erx, ery, erz, ethx, ethy, ethz, ephix, ephiy, ephiz
00025   integer    :: ir, it, ip
00026 
00027 
00028 
00029 
00030 
00031   nbou = (nlg/2+1)*nlg/2
00032   call allocate_array1d(sgg,1,nbou)
00033   call allocate_array2d(gg,1,nbou,1,nbou)
00034 
00035   sgg(1:nbou) = 0.0d0
00036    gg(1:nbou,1:nbou) = 0.0d0
00037   alm(1:nbou,1:nbou) = 0.0d0
00038 
00039 
00040 
00041   ir = nrf
00042   ieqs = 0
00043   do il = 1, nlg
00044     do im = 2-mod(il,2), il, 2
00045       ieqs = ieqs + 1
00046 
00047       do ip = 1, npf
00048         do it = 1, ntf
00049 
00050           call interpo_linear_surface_type0(emdfc,emd,ir,it,ip)
00051           call interpo_linear_surface_type0(utfc,utf,ir,it,ip)
00052           call peos_q2hprho(emdfc, hhfc, prefc, rhofc, enefc)
00053           hhut = hhfc*utfc
00054           call interpo_linear_surface_type0(psifc,psif,ir,it,ip)
00055           psif4 = psifc**4
00056           call flgrad_midpoint_type0_2Dsurf_sph(rs,dtrs,dprs,it,ip)
00057           call interpo_linear_type0_2Dsurf(hrs,rs,it,ip)
00058           call calc_surface_normal_midpoint(rs,rnx,rny,rnz,it,ip)
00059           call interpo_linear_surface_type0(bvxufc,bvxuf,ir,it,ip)
00060           call interpo_linear_surface_type0(bvyufc,bvyuf,ir,it,ip)
00061           call interpo_linear_surface_type0(bvzufc,bvzuf,ir,it,ip)
00062           rotshx = bvxufc + ome*hvec_phif_surface(it,ip,1)
00063           rotshy = bvyufc + ome*hvec_phif_surface(it,ip,2)
00064           rotshz = bvzufc + ome*hvec_phif_surface(it,ip,3)
00065 
00066           flm = dble(il)*hrs**(il-1)*hylmg(il,im,it)*hsinmpg(im,ip) - &
00067           &     hrs**(il-2)*dtrs*hdtyplmg(il,im,it)*hsinmpg(im,ip) -  &
00068           &     hrs**(il-2)*hcosecg(it)**2*dprs*hyplmg(il,im,it)*    &
00069           &     dble(im)*hcosmpg(im,ip)
00070 
00071           sgg(ieqs) = sgg(ieqs) + ( - surp(it,ip) + &
00072           &   hhut*psif4*(rotshx*rnx + rotshy*rny + rotshz*rnz) )*flm
00073 
00074           ivec = 0
00075           do ill = 1, nlg
00076             do imm = 2-mod(ill,2), ill, 2
00077               ivec = ivec + 1
00078 
00079               fllmm =
00080               & dble(ill)*hrs**(ill-1)*hyplmg(ill,imm,it)*hsinmpg(imm,ip) -
00081               & hrs**(ill-2)*dtrs*hdtyplmg(ill,imm,it)*hsinmpg(imm,ip) - 
00082               & hrs**(ill-2)*hcosecg(it)**2*dprs*hyplmg(ill,imm,it)*
00083               & dble(imm)*hcosmpg(imm,ip)
00084 
00085               gg(ieqs,ivec) = gg(ieqs,ivec) + fllmm*flm
00086 
00087             end do
00088           end do
00089 
00090           if(ivec.ne.nbou) write(6,*) ' harmonic ivec wrong ', ivec, nbou
00091 
00092         end do
00093       end do
00094 
00095     end do
00096   end do
00097 
00098   if(ieqs.ne.nbou) write(6,*) ' harmonic ieqs wrong ', ieqs, nbou
00099 
00100   call minv(gg,sgg,nbou,nbou)
00101 
00102   ieqs = 0
00103   do il = 1, nlg
00104     do im = 2-mod(il,2), il, 2
00105       ieqs = ieqs + 1
00106       alm(il,im) = sgg(ieqs)
00107     end do
00108   end do
00109   if(ieqs.ne.nbou) write(6,*) ' harmonic alm wrong ', ieqs, nbou
00110 
00111 
00112 
00113   do ip = 0, npf
00114     do it = 0, ntf
00115       do ir = 0, nrf
00116 
00117         surf = 0.0d0
00118         do il = 1, nlg
00119           do im = 2-mod(il,2), il, 2
00120             surf = surf + alm(il,im)*(r(ir)*rs(it,ip))**il* &
00121             &             yplmg(il,im,it)*sinmp(im,ip) 
00122          end do
00123         end do
00124 
00125         vpot_b(ir,it,ip) = surf
00126 
00127       end do
00128     end do
00129   end do
00130 
00131 
00132 
00133 
00134 
00135 
00136 
00137 
00138   deallocate(sgg)
00139   deallocate(gg)
00140 
00141 end subroutine poisson_solver_homogeneous_sol