00001 subroutine poisson_solver_homogeneous_sol(surp,vpot_b)
00002 use phys_constant, only : long, nmpt
00003 use grid_parameter, only : nrf, ntf, npf, nlg
00004 use def_metric_on_SFC_CF
00005 use coordinate_grav_r
00006 use trigonometry_grav_theta, only : hcosecthg
00007 use trigonometry_grav_phi, only : sinmpg, hsinmpg, hcosmpg
00008 use def_matter
00009 use def_velocity_potential
00010 use def_matter_parameter, only : emdc, radi, ome
00011 use def_vector_phi, only : hvec_phif_surface
00012 use legendre_fn_grav, only : yplmg, hyplmg, hdtyplmg
00013 use interface_interpo_linear_surface_type0
00014 use interface_flgrad_midpoint_surface_type0
00015 use interface_flgrad_midpoint_type0_2Dsurf_sph
00016 use interface_interpo_linear_type0_2Dsurf
00017 use interface_calc_surface_normal_midpoint
00018 use interface_minv
00019 use make_array_1d
00020 use make_array_2d
00021 implicit none
00022 real(long), pointer :: surp(:,:), vpot_b(:,:,:)
00023 real(long), pointer :: sgg(:), gg(:,:)
00024
00025
00026
00027
00028 real(long) :: dxvep, dyvep, dzvep, dtrs, dprs, hrs
00029 real(long) :: rnr, rnth, rnphi, rnx, rny, rnz, flm, fllmm, surf
00030 real(long) :: erx, ery, erz, ethx, ethy, ethz, ephix, ephiy, ephiz
00031 integer :: ir, it, ip, nbou, imm, ivec, im, ill, il, ieqs
00032 real(long) :: psifc, alphfc, bvxdfc, bvydfc, bvzdfc
00033 real(long) :: rotshx, rotshy, rotshz
00034 real(long) :: emdfc, utfc, hhfc, prefc, rhofc, enefc, abin, abct
00035 real(long) :: hhut, pfinv, pf2inv, psif4
00036 integer :: ii,jj
00037
00038
00039
00040
00041
00042 nbou = (nlg/2+1)*nlg/2
00043 call alloc_array1d(sgg,1,nbou+1)
00044 call alloc_array2d(gg,1,nbou+1,1,nbou+1)
00045
00046 sgg(1:nbou+1) = 0.0d0
00047 gg(1:nbou+1,1:nbou+1) = 0.0d0
00048 alm(1:nlg,1:nlg) = 0.0d0
00049
00050
00051
00052 ir = nrf
00053 ieqs = 0
00054 do il = 1, nlg
00055 do im = 2-mod(il,2), il, 2
00056 ieqs = ieqs + 1
00057
00058 do ip = 1, npf
00059 do it = 1, ntf
00060
00061 call interpo_linear_surface_type0(emdfc,emd,ir,it,ip)
00062 call interpo_linear_surface_type0(utfc,utf,ir,it,ip)
00063 call peos_q2hprho(emdfc, hhfc, prefc, rhofc, enefc)
00064 hhut = hhfc*utfc
00065 call interpo_linear_surface_type0(psifc,psif,ir,it,ip)
00066 psif4 = psifc**4
00067
00068 call flgrad_midpoint_type0_2Dsurf_sph(rs,dtrs,dprs,it,ip)
00069
00070 call interpo_linear_type0_2Dsurf(hrs,rs,it,ip)
00071 call calc_surface_normal_midpoint(rs,rnx,rny,rnz,it,ip)
00072
00073 call interpo_linear_surface_type0(bvxdfc,bvxdf,ir,it,ip)
00074 call interpo_linear_surface_type0(bvydfc,bvydf,ir,it,ip)
00075 call interpo_linear_surface_type0(bvzdfc,bvzdf,ir,it,ip)
00076 rotshx = bvxdfc + ome*hvec_phif_surface(it,ip,1)
00077 rotshy = bvydfc + ome*hvec_phif_surface(it,ip,2)
00078 rotshz = bvzdfc + ome*hvec_phif_surface(it,ip,3)
00079
00080 flm = dble(il)*hrs**(il-1)*hyplmg(il,im,it)*hsinmpg(im,ip) - &
00081 & hrs**(il-2)*dtrs*hdtyplmg(il,im,it)*hsinmpg(im,ip) - &
00082 & hrs**(il-2)*hcosecthg(it)**2*dprs*hyplmg(il,im,it)* &
00083 & dble(im)*hcosmpg(im,ip)
00084
00085 sgg(ieqs) = sgg(ieqs) + ( - surp(it,ip) + &
00086 & hhut*psif4*(rotshx*rnx + rotshy*rny + rotshz*rnz) )*flm
00087
00088 ivec = 0
00089 do ill = 1, nlg
00090 do imm = 2-mod(ill,2), ill, 2
00091 ivec = ivec + 1
00092
00093 fllmm = &
00094 & dble(ill)*hrs**(ill-1)*hyplmg(ill,imm,it)*hsinmpg(imm,ip) - &
00095 & hrs**(ill-2)*dtrs*hdtyplmg(ill,imm,it)*hsinmpg(imm,ip) - &
00096 & hrs**(ill-2)*hcosecthg(it)**2*dprs*hyplmg(ill,imm,it)* &
00097 & dble(imm)*hcosmpg(imm,ip)
00098
00099 gg(ieqs,ivec) = gg(ieqs,ivec) + fllmm*flm
00100
00101 end do
00102 end do
00103
00104 if(ivec.ne.nbou) write(6,*) ' harmonic ivec wrong ', ivec, nbou
00105
00106 end do
00107 end do
00108
00109 end do
00110 end do
00111
00112 if(ieqs.ne.nbou) write(6,*) ' harmonic ieqs wrong ', ieqs, nbou
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124 call minv(gg,sgg,nbou,nbou+1)
00125
00126
00127
00128
00129
00130 ieqs = 0
00131 do il = 1, nlg
00132 do im = 2-mod(il,2), il, 2
00133 ieqs = ieqs + 1
00134 alm(il,im) = sgg(ieqs)
00135 end do
00136 end do
00137 if(ieqs.ne.nbou) write(6,*) ' harmonic alm wrong ', ieqs, nbou
00138
00139
00140
00141
00142 do ip = 0, npf
00143 do it = 0, ntf
00144 do ir = 0, nrf
00145
00146 surf = 0.0d0
00147 do il = 1, nlg
00148 do im = 2-mod(il,2), il, 2
00149 surf = surf + alm(il,im)*(rg(ir)*rs(it,ip))**il* &
00150 & yplmg(il,im,it)*sinmpg(im,ip)
00151 end do
00152 end do
00153
00154 vpot_b(ir,it,ip) = surf
00155
00156 end do
00157 end do
00158 end do
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168 deallocate(sgg)
00169 deallocate(gg)
00170
00171 end subroutine poisson_solver_homogeneous_sol