00001 subroutine poisson_solver_homogeneous_sol_lecc(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, velx
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
00077 rotshx = bvxdfc + ome*hvec_phif_surface(it,ip,1) + velx
00078 rotshy = bvydfc + ome*hvec_phif_surface(it,ip,2)
00079 rotshz = bvzdfc + ome*hvec_phif_surface(it,ip,3)
00080
00081 flm = dble(il)*hrs**(il-1)*hyplmg(il,im,it)*hsinmpg(im,ip) - &
00082 & hrs**(il-2)*dtrs*hdtyplmg(il,im,it)*hsinmpg(im,ip) - &
00083 & hrs**(il-2)*hcosecthg(it)**2*dprs*hyplmg(il,im,it)* &
00084 & dble(im)*hcosmpg(im,ip)
00085
00086 sgg(ieqs) = sgg(ieqs) + ( - surp(it,ip) + &
00087 & hhut*psif4*(rotshx*rnx + rotshy*rny + rotshz*rnz) )*flm
00088
00089 ivec = 0
00090 do ill = 1, nlg
00091 do imm = 2-mod(ill,2), ill, 2
00092 ivec = ivec + 1
00093
00094 fllmm = &
00095 & dble(ill)*hrs**(ill-1)*hyplmg(ill,imm,it)*hsinmpg(imm,ip) - &
00096 & hrs**(ill-2)*dtrs*hdtyplmg(ill,imm,it)*hsinmpg(imm,ip) - &
00097 & hrs**(ill-2)*hcosecthg(it)**2*dprs*hyplmg(ill,imm,it)* &
00098 & dble(imm)*hcosmpg(imm,ip)
00099
00100 gg(ieqs,ivec) = gg(ieqs,ivec) + fllmm*flm
00101
00102 end do
00103 end do
00104
00105 if(ivec.ne.nbou) write(6,*) ' harmonic ivec wrong ', ivec, nbou
00106
00107 end do
00108 end do
00109
00110 end do
00111 end do
00112
00113 if(ieqs.ne.nbou) write(6,*) ' harmonic ieqs wrong ', ieqs, nbou
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125 call minv(gg,sgg,nbou,nbou+1)
00126
00127
00128
00129
00130
00131 ieqs = 0
00132 do il = 1, nlg
00133 do im = 2-mod(il,2), il, 2
00134 ieqs = ieqs + 1
00135 alm(il,im) = sgg(ieqs)
00136 end do
00137 end do
00138 if(ieqs.ne.nbou) write(6,*) ' harmonic alm wrong ', ieqs, nbou
00139
00140
00141
00142
00143 do ip = 0, npf
00144 do it = 0, ntf
00145 do ir = 0, nrf
00146
00147 surf = 0.0d0
00148 do il = 1, nlg
00149 do im = 2-mod(il,2), il, 2
00150 surf = surf + alm(il,im)*(rg(ir)*rs(it,ip))**il* &
00151 & yplmg(il,im,it)*sinmpg(im,ip)
00152 end do
00153 end do
00154
00155 vpot_b(ir,it,ip) = surf
00156
00157 end do
00158 end do
00159 end do
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169 deallocate(sgg)
00170 deallocate(gg)
00171
00172 end subroutine poisson_solver_homogeneous_sol_lecc