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