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