MPI-AMRVAC 3.2
The MPI - Adaptive Mesh Refinement - Versatile Advection Code (development version)
Loading...
Searching...
No Matches
mod_pfss.t
Go to the documentation of this file.
1!> module mod_pfss.t -- potential field source surface model
2!> PURPOSE : to extrapolate global potential magnetic field of the sun from
3!> synoptic magnetograms
4!> 2013.11.04 Developed by S. Moschou and C. Xia
5!> 2014.04.01 Allow to change source surface (C. Xia)
6!> PRECONDITIONS:
7!> 1. 3D spherical coordinates
8!> 2. A synoptic magnetogram in a binary file contains nphi, ntheta,
9!> theta(ntheta), phi(nphi), B_r(nphi,ntheta) succesively.
10!> 3. nphi, ntheta are long integers and other arrays are double precision.
11!> theta contains decreasing radians with increasing indice (Pi to 0)
12!> phi contains increasing radians with increasing indice (0 to 2*Pi)
13!> 4. By default, theta points are interpreted as cell centers and harmonic
14!> coefficients use cell-area quadrature in mu=cos(theta). To reproduce the
15!> old Gauss-Legendre quadrature, set
16!> pfss_theta_quadrature='gauss_legendre' before calling harm_coef.
17!> If a mapname.coef file already exists, it is reused and this setting does
18!> not take effect until that coefficient file is regenerated.
19!> USAGE:
20!> example for a magnetogram with name 'mdicr2020.dat':
21!>
22!> subroutine initglobaldata_usr
23!> ...
24!> R_0=1.d0 ! dimensionless Solar radius (default 1.0)
25!> R_s=2.5d0 ! dimensionless radius of source surface (default 2.5)
26!> lmax=120 ! use a fixed value instead of the value determined by the
27!> resolution of input magnetogram
28!> trunc=.true. ! use less spherical harmonics at larger distances
29!> call harm_coef('mdicr2020.dat')
30!> end subroutine initglobaldata_usr
31!>
32!> subroutine initonegrid_usr(ixI^L,ixO^L,w,x)
33!> ...
34!> double precision :: bpf(ixI^S,1:ndir)
35!> ...
36!> call pfss(ixI^L,ixO^L,bpf,x)
37!> w(ix^S,mag(:))=bpf(ix^S,:)
38!>
39!> end subroutine initonegrid_usr
41 use mod_fft, only: fft_raw
42 implicit none
43 private
44
45 double complex, allocatable :: flm(:,:),Alm(:,:),Blm(:,:)
46 double precision, allocatable :: Rlm(:,:), xrg(:)
47 double precision, public :: r_s=2.5d0, r_0=1.d0
48 integer, allocatable :: lmaxarray(:)
49 integer, public :: lmax=0
50 logical, public :: trunc=.false.
51 character(len=20), public :: pfss_theta_quadrature='cell_area'
52
53 public :: harm_coef
54{^ifthreed
55 public :: pfss
56}
57
58contains
59
60 subroutine harm_coef(mapname)
62 use mod_comm_lib, only: mpistop
63
64 double precision, allocatable :: b_r0(:,:)
65 double precision, allocatable :: theta(:),phi(:),cfwm(:)
66 double precision :: rsl,xrl,dxr
67 integer :: xm,ym,l,m,amode,file_handle,il,ir,nlarr,nsh
68 integer, dimension(MPI_STATUS_SIZE) :: statuss
69 logical :: aexist
70 character(len=*) :: mapname
71 character(len=80) :: fharmcoef
72
73 fharmcoef=mapname//'.coef'
74 inquire(file=fharmcoef, exist=aexist)
75 if(aexist) then
76 if(mype==0) write(*,'(2a)') &
77 'Using existing PFSS coefficient file; pfss_theta_quadrature is ignored: ',&
78 trim(fharmcoef)
79 if(mype==0) then
80 call mpi_file_open(mpi_comm_self,fharmcoef,mpi_mode_rdonly, &
81 mpi_info_null,file_handle,ierrmpi)
82 call mpi_file_read(file_handle,lmax,1,mpi_integer,statuss,ierrmpi)
83 allocate(flm(0:lmax,0:lmax))
84 call mpi_file_read(file_handle,flm,(lmax+1)*(lmax+1),&
85 mpi_double_complex,statuss,ierrmpi)
86 call mpi_file_close(file_handle,ierrmpi)
87 end if
88 call mpi_barrier(icomm,ierrmpi)
89 if(npe>0) call mpi_bcast(lmax,1,mpi_integer,0,icomm,ierrmpi)
90 if(mype/=0) allocate(flm(0:lmax,0:lmax))
91 call mpi_barrier(icomm,ierrmpi)
92 if(npe>0) call mpi_bcast(flm,(lmax+1)*(lmax+1),mpi_double_complex,0,icomm,&
93 ierrmpi)
94 else
95 if(mype==0) then
96 inquire(file=mapname,exist=aexist)
97 if(.not. aexist) then
98 if(mype==0) write(*,'(2a)') "can not find file:",mapname
99 call mpistop("no input magnetogram found")
100 end if
101 call mpi_file_open(mpi_comm_self,mapname,mpi_mode_rdonly,mpi_info_null,&
102 file_handle,ierrmpi)
103 call mpi_file_read(file_handle,xm,1,mpi_integer,statuss,ierrmpi)
104 call mpi_file_read(file_handle,ym,1,mpi_integer,statuss,ierrmpi)
105 if(lmax==0) lmax=min(2*ym/3,xm/3)
106
107 allocate(b_r0(xm,ym))
108 allocate(theta(ym))
109 allocate(phi(xm))
110 call mpi_file_read(file_handle,theta,ym,mpi_double_precision,&
111 statuss,ierrmpi)
112 call mpi_file_read(file_handle,phi,xm,mpi_double_precision,&
113 statuss,ierrmpi)
114 call mpi_file_read(file_handle,b_r0,xm*ym,mpi_double_precision,&
115 statuss,ierrmpi)
116 call mpi_file_close(file_handle,ierrmpi)
117 print*,'nphi,ntheta',xm,ym
118 print*,'theta range:',minval(theta),maxval(theta)
119 print*,'phi range:',minval(phi),maxval(phi)
120 print*,'Brmax,Brmin',maxval(b_r0),minval(b_r0)
121 allocate(cfwm(ym))
122 select case(trim(pfss_theta_quadrature))
123 case('cell_area')
124 call cfweights_cell_area(ym,theta,cfwm)
125 case('gauss_legendre')
126 call cfweights_gauss_legendre(ym,dcos(theta),cfwm)
127 case default
128 call mpistop("Unknown pfss_theta_quadrature")
129 end select
130 allocate(flm(0:lmax,0:lmax))
131 call coef(b_r0,xm,ym,dcos(theta),dsin(theta),cfwm)
132 deallocate(b_r0)
133 deallocate(theta)
134 deallocate(phi)
135 amode=ior(mpi_mode_create,mpi_mode_wronly)
136 call mpi_file_open(mpi_comm_self,fharmcoef,amode, &
137 mpi_info_null,file_handle,ierrmpi)
138 call mpi_file_write(file_handle,lmax,1,mpi_integer,statuss,ierrmpi)
139 call mpi_file_write(file_handle,flm,(lmax+1)*(lmax+1),&
140 mpi_double_complex,statuss,ierrmpi)
141 call mpi_file_close(file_handle,ierrmpi)
142 endif
143 call mpi_barrier(icomm,ierrmpi)
144 if(npe>1) call mpi_bcast(lmax,1,mpi_integer,0,icomm,ierrmpi)
145 if(mype/=0) allocate(flm(0:lmax,0:lmax))
146 call mpi_barrier(icomm,ierrmpi)
147 if(npe>1) call mpi_bcast(flm,(lmax+1)*(lmax+1),mpi_double_complex,0,&
149 end if
150 if(mype==0) print*,'lmax=',lmax,'trunc=',trunc
151 nlarr=501
152 allocate(lmaxarray(nlarr))
153 allocate(xrg(nlarr))
154 lmaxarray=lmax
155 if(trunc) then
156 dxr=(r_s-r_0)/dble(nlarr-1)
157 do ir=1,nlarr
158 xrg(ir)=dxr*dble(ir-1)+r_0
159 do il=0,lmax
160 xrl=xrg(ir)**il
161 if(xrl > 1.d6) then
162 lmaxarray(ir)=il
163 exit
164 end if
165 end do
166 end do
167 endif
168 ! calculate global Alm Blm Rlm
169 allocate(alm(0:lmax,0:lmax))
170 allocate(blm(0:lmax,0:lmax))
171 allocate(rlm(0:lmax,0:lmax))
172 alm=(0.d0,0.d0)
173 blm=(0.d0,0.d0)
174 do l=0,lmax
175 do m=0,l
176 rsl=r_s**(-(2*l+1))
177 rlm(l,m)=dsqrt(dble(l**2-m**2)/dble(4*l**2-1))
178 blm(l,m)=-flm(l,m)/(1.d0+dble(l)+dble(l)*rsl)
179 alm(l,m)=-rsl*blm(l,m)
180 end do
181 end do
182
183 end subroutine harm_coef
184
185 subroutine cfweights_cell_area(ym,theta,cfwm)
187
188 integer, intent(in) :: ym
189 double precision, intent(in) :: theta(ym)
190 double precision, intent(out) :: cfwm(ym)
191
192 double precision,dimension(ym) :: miu
193 double precision :: edge_l,edge_r
194 integer :: i
195
196 miu=dcos(theta)
197 if(miu(1)<=miu(ym)) then
198 do i=1,ym
199 if(i==1) then
200 edge_l=-1.d0
201 else
202 edge_l=0.5d0*(miu(i-1)+miu(i))
203 end if
204 if(i==ym) then
205 edge_r=1.d0
206 else
207 edge_r=0.5d0*(miu(i)+miu(i+1))
208 end if
209 cfwm(i)=dabs(edge_r-edge_l)*(2.d0*dpi)
210 end do
211 else
212 do i=1,ym
213 if(i==1) then
214 edge_l=1.d0
215 else
216 edge_l=0.5d0*(miu(i-1)+miu(i))
217 end if
218 if(i==ym) then
219 edge_r=-1.d0
220 else
221 edge_r=0.5d0*(miu(i)+miu(i+1))
222 end if
223 cfwm(i)=dabs(edge_r-edge_l)*(2.d0*dpi)
224 end do
225 end if
226
227 end subroutine cfweights_cell_area
228
229 subroutine cfweights_gauss_legendre(ym,miu,cfwm)
231
232 integer, intent(in) :: ym
233 double precision, intent(in) :: miu(ym)
234 double precision, intent(out) :: cfwm(ym)
235
236 double precision,dimension(ym) :: pl,pm2,pm1,pprime,sintheta
237 double precision :: lr
238 integer :: l
239
240 sintheta=dsqrt(1.d0-miu**2)
241
242 pm2=1.d0
243 pm1=miu
244
245 do l=2,ym-1
246 lr=1.d0/dble(l)
247 pl=(2.d0-lr)*pm1*miu-(1.d0-lr)*pm2
248 pm2=pm1
249 pm1=pl
250 end do
251
252 pprime=(dble(ym)*pl)/sintheta**2
253 cfwm=2.d0/(sintheta*pprime)**2
254 cfwm=cfwm*(2.d0*dpi)
255
256 end subroutine cfweights_gauss_legendre
257
258 subroutine coef(b_r0,xm,ym,miu,mius,cfwm)
260
261 integer, intent(in) :: xm,ym
262 double precision, intent(in) :: b_r0(xm,ym),cfwm(ym),miu(ym),mius(ym)
263
264 double complex :: bm(0:xm-1,0:ym-1)
265 double precision,dimension(xm) :: fftmr,fftmi
266 double precision,dimension(0:lmax) :: n_mm
267 double precision,dimension(ym) :: p_lm1,p_lm2,old_pmm,p_l
268 double precision :: mr,lr,c1,c2
269 integer :: l,m,i,j,stat
270
271 bm=(0.d0,0.d0)
272 do i=1,ym
273 fftmr=b_r0(:,i)/dble(xm)
274 fftmi=0.d0
275 call fft_raw(fftmr,fftmi,xm,xm,xm,-1)
276 bm(:,i-1)=(fftmr+(0.d0,1.d0)*fftmi)
277 end do
278 n_mm(0)=1.d0/dsqrt(4.d0*dpi)
279 do m=1,lmax
280 n_mm(m)=-n_mm(m-1)*dsqrt(1.d0+1.d0/dble(2*m))
281 end do
282 !first do m=0
283 p_lm2=n_mm(0)
284 p_lm1=p_lm2*miu*dsqrt(3.d0)
285 !set l=0 m=0 term
286 flm(0,0)=sum(bm(0,:)*p_lm2*cfwm)
287 !set l=1 m=0 term
288 flm(1,0)=sum(bm(0,:)*p_lm1*cfwm)
289 do l=2,lmax
290 lr=dble(l)
291 c1=dsqrt(4.d0-1.d0/lr**2)
292 c2=-(1.d0-1.d0/lr)*dsqrt((2.d0*lr+1.d0)/(2.d0*lr-3.d0))
293 p_l=c1*miu*p_lm1+c2*p_lm2
294 !set m=0 term for all other l's
295 flm(l,0)=sum(bm(0,:)*p_l*cfwm)
296 p_lm2=p_lm1
297 p_lm1=p_l
298 end do
299
300 !since only l modes from 0 to lmax are used
301 bm=2.d0*bm
302
303 !now the rest of the m's
304 old_pmm=n_mm(0)
305 do m=1,lmax
306 p_lm2=old_pmm*mius*n_mm(m)/n_mm(m-1)
307 p_lm1=p_lm2*miu*dsqrt(dble(2*m+3))
308 !ACCURATE UP TO HERE
309 old_pmm=p_lm2
310 !set l=m mode
311 flm(m,m)=sum(bm(m,:)*p_lm2*cfwm)
312 !set l=m+1 mode
313 if(m<lmax) flm(m+1,m)=sum(bm(m,:)*p_lm1*cfwm)
314 mr=dble(m)
315 do l=m+2,lmax
316 lr=dble(l)
317 c1=dsqrt((4.d0*lr**2-1.d0)/(lr**2-mr**2))
318 c2=-dsqrt(((2.d0*lr+1.d0)*((lr-1.d0)**2-mr**2))/((2.d0*lr-3.d0)*(lr**2-&
319 mr**2)))
320 p_l=c1*miu*p_lm1+c2*p_lm2
321 flm(l,m)=sum(bm(m,:)*p_l*cfwm)
322 p_lm2=p_lm1
323 p_lm1=p_l
324 end do
325 end do
326
327 end subroutine coef
328{^ifthreed
329 subroutine pfss(ixI^L,ixO^L,Bpf,x)
331
332 integer, intent(in) :: ixi^l,ixo^l
333 double precision, intent(in) :: x(ixi^s,1:ndim)
334 double precision, intent(out) :: bpf(ixi^s,1:ndir)
335
336 double complex :: bt(0:lmax,0:lmax,ixomin1:ixomax1)
337 double precision :: phase(ixi^s,1:ndir),bpfiv(ixomin3:ixomax3,ixomin2:ixomax2)
338 double precision :: miu(ixomin2:ixomax2),mius(ixomin2:ixomax2),xr
339 double precision :: tmp(ixomin2:ixomax2)
340 integer :: l,m,ix^d,j,l1,l2,ntheta,nphi,ir,qlmax
341
342 bt=(0.d0,0.d0)
343 nphi=ixomax3-ixomin3+1
344 ntheta=ixomax2-ixomin2+1
345 tmp(ixomin2:ixomax2)=x(ixomin1,ixomax2:ixomin2:-1,ixomin3,2)
346 miu(ixomin2:ixomax2)=dcos(tmp(ixomin2:ixomax2))
347 mius(ixomin2:ixomax2)=dsin(tmp(ixomin2:ixomax2))
348 do ix1=ixomin1,ixomax1
349 xr=x(ix1,ixomin2,ixomin3,1)
350 if(trunc) then
351 do ir=1,size(lmaxarray)
352 if(xrg(ir)>=xr) exit
353 end do
354 if(ir>size(lmaxarray)) ir=size(lmaxarray)
355 qlmax=lmaxarray(ir)
356 else
357 qlmax=lmax
358 endif
359 !Calculate Br
360 do l=0,lmax
361 do m=0,l
362 bt(l,m,ix1)=alm(l,m)*dble(l)*xr**(l-1)-blm(l,m)*dble(l+1)*xr**(-l-2)
363 end do
364 enddo
365 call inv_sph_transform(bt(:,:,ix1),x(ixomin1,ixomin2,&
366 ixomin3:ixomax3,3),miu,mius,nphi,ntheta,bpfiv,qlmax)
367 do ix3=ixomin3,ixomax3
368 do ix2=ixomin2,ixomax2
369 bpf(ix1,ix2,ix3,1)=bpfiv(ix3,ixomax2-ix2+ixomin2)
370 enddo
371 enddo
372 !Calculate Btheta
373 do l=0,lmax
374 do m=0,l
375 if (l==0) then
376 bt(l,m,ix1)=-rlm(l+1,m)*dble(l+2)*&
377 (alm(l+1,m)*xr**l+blm(l+1,m)*xr**(-l-3))
378 else if (l>=1 .and. l<=lmax-1) then
379 bt(l,m,ix1)=rlm(l,m)*&
380 dble(l-1)*(alm(l-1,m)*xr**(l-2)+blm(l-1,m)*&
381 xr**(-l-1))-rlm(l+1,m)*dble(l+2)*&
382 (alm(l+1,m)*xr**l+blm(l+1,m)*xr**(-l-3))
383 else
384 bt(l,m,ix1)=rlm(l,m)*&
385 dble(l-1)*(alm(l-1,m)*xr**(l-2)+blm(l-1,m)*xr**(-l-1))
386 end if
387 end do
388 enddo
389 call inv_sph_transform(bt(:,:,ix1),x(ixomin1,ixomin2,&
390 ixomin3:ixomax3,3),miu,mius,nphi,ntheta,bpfiv,qlmax)
391 do ix3=ixomin3,ixomax3
392 do ix2=ixomin2,ixomax2
393 bpf(ix1,ix2,ix3,2)=bpfiv(ix3,ixomax2-ix2+ixomin2)/mius(&
394 ixomax2-ix2+ixomin2)
395 enddo
396 enddo
397
398 !Calculate Bphi
399 do l=0,lmax
400 do m=0,l
401 bt(l,m,ix1)=(0.d0,1.d0)*m*(alm(l,m)*xr**(l-1)+blm(l,m)*xr**(-l-2))
402 end do
403 enddo
404 call inv_sph_transform(bt(:,:,ix1),x(ixomin1,ixomin2,&
405 ixomin3:ixomax3,3),miu,mius,nphi,ntheta,bpfiv,qlmax)
406 do ix3=ixomin3,ixomax3
407 do ix2=ixomin2,ixomax2
408 bpf(ix1,ix2,ix3,3)=bpfiv(ix3,ixomax2-ix2+ixomin2)/mius(&
409 ixomax2-ix2+ixomin2)
410 enddo
411 enddo
412 enddo
413 !Scalar Potential
414 ! Potlc(ix^D)=Alm(l,m)*x(ix^D,1)**l+Blm(l,m)*x(ix^D,1)**(-l-1)
415
416 !do ix3=ixOmin3,ixOmax3
417 ! do ix2=ixOmin2,ixOmax2
418 ! print*,x(ix1,ixOmax2-ix2+ixOmin2,ix3,2)
419 ! print*,'miu==',miu(ixOmax2-ix2+ixOmin2)
420 ! enddo
421 !enddo
422
423 end subroutine pfss
424
425 subroutine inv_sph_transform(Bt,phi,miu,mius,nphi,ntheta,Bpf,qlmax)
427
428 integer, intent(in) :: nphi,ntheta,qlmax
429 double complex, intent(in) :: bt(0:lmax,0:lmax)
430 double precision, intent(in) :: phi(nphi),miu(ntheta),mius(ntheta)
431 double precision, intent(out) :: bpf(nphi,ntheta)
432
433 double precision,dimension(0:lmax,0:lmax) :: cp,phase,bamp
434 double precision,dimension(ntheta) :: cp_1_0,cp_l_0,cp_lm1_0,cp_lm2_0,cp_m_m
435 double precision,dimension(ntheta) :: cp_1_m,cp_l_m,cp_lm1_m,cp_lm2_m,cp_mp1_m
436 double precision :: angpart(nphi)
437 double precision :: ld,md,c1,c2,cp_0_0
438 integer :: l,m,iph,ith
439
440 bamp=abs(bt)
441
442 phase=atan2(dimag(bt),dble(bt))
443
444 bpf=0.d0
445 !take care of modes where m=0
446 cp_0_0=dsqrt(1.d0/(4.d0*dpi))
447 !start with l=m=0 mode
448 bpf=bpf+bamp(0,0)*dcos(phase(0,0))*cp_0_0
449
450 !proceed with l=1 m=0 mode
451 cp_1_0=dsqrt(3.d0)*miu*cp_0_0
452 do iph=1,nphi
453 bpf(iph,:)=bpf(iph,:)+bamp(1,0)*dcos(phase(1,0))*cp_1_0
454 enddo
455
456 !proceed with l modes for which m=0
457 cp_lm1_0=cp_0_0
458 cp_l_0=cp_1_0
459 do l=2,qlmax
460 ld=dble(l)
461 cp_lm2_0=cp_lm1_0
462 cp_lm1_0=cp_l_0
463 c1=dsqrt(4.d0*ld**2-1.d0)/ld
464 c2=dsqrt((2.d0*ld+1.d0)/(2.d0*ld-3.d0))*(ld-1.d0)/ld
465 cp_l_0=c1*miu*cp_lm1_0-c2*cp_lm2_0
466 do iph=1,nphi
467 bpf(iph,:)=bpf(iph,:)+bamp(l,0)*dcos(phase(l,0))*cp_l_0
468 enddo
469 enddo
470
471 !loop through m's for m>0 and then loop through l's for each m
472 cp_m_m=cp_0_0
473 do m=1,qlmax
474 md=dble(m)
475 !first do l=m modes
476 cp_m_m=-dsqrt(1.d0+1.d0/(2.d0*md))*mius*cp_m_m
477 do iph=1,nphi
478 angpart(iph)=dcos(md*phi(iph)+phase(m,m))
479 end do
480 do ith=1,ntheta
481 do iph=1,nphi
482 bpf(iph,ith)=bpf(iph,ith)+bamp(m,m)*angpart(iph)*cp_m_m(ith)
483 enddo
484 enddo
485
486 !proceed with l=m+1 modes
487 if(qlmax>=m+1) then
488 cp_mp1_m=dsqrt(2.d0*md+3.d0)*miu*cp_m_m
489 angpart=dcos(md*phi+phase(m+1,m))
490 do ith=1,ntheta
491 do iph=1,nphi
492 bpf(iph,ith)=bpf(iph,ith)+bamp(m+1,m)*angpart(iph)*cp_mp1_m(ith)
493 enddo
494 enddo
495 endif
496
497 !finish with the rest l
498 if(qlmax>=m+2) then
499 cp_lm1_m=cp_m_m
500 cp_l_m=cp_mp1_m
501 do l=m+2,qlmax
502 ld=dble(l)
503 cp_lm2_m=cp_lm1_m
504 cp_lm1_m=cp_l_m
505 c1=dsqrt((4.d0*ld**2-1.d0)/(ld**2-md**2))
506 c2=dsqrt((2.d0*ld+1.d0)*((ld-1.d0)**2-md**2)/(2.d0*ld-3.d0)/(ld**2-md**2))
507 cp_l_m=c1*miu*cp_lm1_m-c2*cp_lm2_m
508 angpart=dcos(md*phi+phase(l,m))
509 do ith=1,ntheta
510 do iph=1,nphi
511 bpf(iph,ith)=bpf(iph,ith)+bamp(l,m)*angpart(iph)*cp_l_m(ith)
512 enddo
513 enddo
514 enddo
515 endif
516 enddo
517
518 end subroutine inv_sph_transform
519}
520
521end module mod_pfss
subroutine, public mpistop(message)
Exit MPI-AMRVAC with an error message.
Self-contained complex FFT utilities based on the mixed-radix Singleton transform historically embedd...
Definition mod_fft.t:3
subroutine, public fft_raw(a, b, ntot, n, nspan, isn)
Definition mod_fft.t:206
This module contains definitions of global parameters and variables and some generic functions/subrou...
integer, parameter ndim
Number of spatial dimensions for grid variables.
integer icomm
The MPI communicator.
integer mype
The rank of the current MPI task.
integer ndir
Number of spatial dimensions (components) for vector variables.
integer ierrmpi
A global MPI error return code.
double precision, dimension(:), allocatable, parameter d
integer npe
The number of MPI tasks.
module mod_pfss.t – potential field source surface model PURPOSE : to extrapolate global potential ma...
Definition mod_pfss.t:40
character(len=20), public pfss_theta_quadrature
Definition mod_pfss.t:51
double precision, public r_0
Definition mod_pfss.t:47
subroutine, public pfss(ixil, ixol, bpf, x)
Definition mod_pfss.t:330
integer, public lmax
Definition mod_pfss.t:49
subroutine, public harm_coef(mapname)
Definition mod_pfss.t:61
logical, public trunc
Definition mod_pfss.t:50
double precision, public r_s
Definition mod_pfss.t:47