Commit 27d3b84d60230bacdb38e98a757dab3815f5ff2a

Authored by daniau
1 parent 93f1019c07

git-svn-id: https://lxsd.femto-st.fr/svn/fvn@36 b657c933-2333-4658-acf2-d3c7c2708721

Showing 15 changed files with 591 additions and 0 deletions Inline Diff

File was created 1
2 include $(BTREE)/Make.inc
3
4 programs = test_fac test_matinv test_specfunc \
5 test_det test_matcon test_matev test_sparse test_inter1d \
6 test_inter2d test_inter3d test_akima test_lsp test_muller \
7 test_integ
8
9 prog:$(programs)
10
11 clean:
12 rm -f {*.o,*.oo,*.ipo,*.a,*.mod}
13 rm -f $(programs)
14
fvn_test/init_random_seed.f90
File was created 1 ! As the norm stated for random_seed "If no argument is present, the processor assigns a
2 ! processor-dependent value to the seed."
3 ! It seems that there are different possible interpretations for this :
4 ! In gfortran a call to random_seed without arguments will initialize to a default value
5 ! which will always be the same.
6 ! In Portland fortran, a call to random_seed without arguments will initialize with something
7 ! machine and time dependant
8 ! Unfortunately as the underlying algorithm are (or at least can be) different in each
9 ! compiler, we cannot generalize the use of this initialization provided in gfortran
10 ! documentation
11 SUBROUTINE init_random_seed()
12 INTEGER :: i, n, clock
13 INTEGER, DIMENSION(:), ALLOCATABLE :: seed
14 logical :: gfortran=.false.
15 !
16 ! Set gfortran to .true. if using gfortran to obtain the desired behaviour
17 !
18 if (gfortran) then
19 CALL RANDOM_SEED(size = n)
20 ALLOCATE(seed(n))
21
22 CALL SYSTEM_CLOCK(COUNT=clock)
23
24 seed = clock + 37 * (/ (i - 1, i = 1, n) /)
25 CALL RANDOM_SEED(PUT = seed)
26
27 DEALLOCATE(seed)
28 else
fvn_test/test_akima.f90
File was created 1 program akima
2 use fvn
3 implicit none
4 integer :: nbpoints,nppoints,i
5 real(8),dimension(:),allocatable :: x_d,y_d,breakpoints_d
6 real(8),dimension(:,:),allocatable :: coeff_fvn_d
7 real(8) :: xstep_d,xp_d,ty_d,fvn_y_d
8 open(2,file='fvn_akima_double.dat')
9 open(3,file='fvn_akima_breakpoints_double.dat')
10 nbpoints=30
11 allocate(x_d(nbpoints))
12 allocate(y_d(nbpoints))
13 allocate(breakpoints_d(nbpoints))
14 allocate(coeff_fvn_d(4,nbpoints))
15 xstep_d=20./dfloat(nbpoints)
16 do i=1,nbpoints
17 x_d(i)=-10.+dfloat(i)*xstep_d
18 y_d(i)=dsin(x_d(i))
19 write(3,44) x_d(i),y_d(i)
20 end do
21 close(3)
22 call fvn_akima(nbpoints,x_d,y_d,breakpoints_d,coeff_fvn_d)
23 nppoints=1000
24 xstep_d=22./dfloat(nppoints)
25 do i=1,nppoints
26 xp_d=-11.+dfloat(i)*xstep_d
27 ty_d=dsin(xp_d)
28 fvn_y_d=fvn_spline_eval(xp_d,nbpoints-1,breakpoints_d,coeff_fvn_d)
29 write(2,44) xp_d,ty_d,fvn_y_d
30 end do
31 close(2)
32 deallocate(coeff_fvn_d,breakpoints_d,y_d,x_d)
33 write(*,*) "All done, plot results with gnuplot using command :"
34 write(*,*) "pl 'fvn_akima_double.dat' u 1:2 w l,'fvn_akima_breakpoints_double.dat' w p"
35
36 44 FORMAT(4(1X,1PE22.14))
fvn_test/test_det.f90
File was created 1 program test_det
2 use fvn
3 implicit none
4 real(8),dimension(3,3) :: a
5 real(8) :: deta
6 integer :: status,i
7
8 call init_random_seed()
9 call random_number(a)
10 a=a*100
11 deta=fvn_det(3,a,status)
12 do i=1,3
13 write (*,'(3(f15.5))') a(i,:)
14 end do
15 write (*,*)
16 write (*,*) "Det = ",deta,"Status = ",status
fvn_test/test_integ.f90
File was created 1 program integ
2 use fvn
3 implicit none
4 real(8), external :: f1,f2,g,h
5 real(8) :: a,b,epsabs,epsrel,abserr,res
6 integer :: key,ier
7 a=0.
8 b=1.
9 epsabs=1d-8
10 epsrel=1d-8
11 key=2
12 call fvn_integ_1_gk(f1,a,b,epsabs,epsrel,key,res,abserr,ier)
13 write(*,*) "Integration of x*x between 0 and 1 : "
14 write(*,*) res
15 call fvn_integ_2_gk(f2,a,b,g,h,epsabs,epsrel,key,res,abserr,ier)
16 write(*,*) "Integration of x*y between 0 and 1 on both x and y : "
17 write(*,*) res
18
19 end program
20 function f1(x)
21 implicit none
22 real(8) :: x,f1
23 f1=x*x
24 end function
25 function f2(x,y)
26 implicit none
27 real(8) :: x,y,f2
28 f2=x*y
29 end function
30 function g(x)
31 implicit none
32 real(8) :: x,g
33 g=0.
34 end function
35 function h(x)
36 implicit none
37 real(8) :: x,h
38 h=1.
fvn_test/test_inter1d.f90
File was created 1 program inter1d
2 use fvn
3 implicit none
4 integer(kind=4),parameter :: ndata=33
5 integer(kind=4) :: i,nout
6 real(kind=8) :: f,fdata(ndata),h,pi,q,sin,x,xdata(ndata)
7 real(kind=8) ::tv
8 intrinsic sin
9 f(x)=sin(x)
10 xdata(1)=0.
11 fdata(1)=f(xdata(1))
12 h=1./32.
13 do i=2,ndata
14 xdata(i)=xdata(i-1)+h
15 fdata(i)=f(xdata(i))
16 end do
17 call init_random_seed()
18 call random_number(x)
19 q=fvn_quad_interpol(x,ndata,xdata,fdata)
20 tv=f(x)
21 write(*,'("x y z ",1(f8.5))') x
22 write(*,'("Calculated (real) value :",f8.5)') tv
23 write(*,'("fvn interpolation : ",f8.5)') q
24 write(*,'("Relative fvn error :",e12.5)') abs((q-tv)/tv)
25 end program
fvn_test/test_inter2d.f90
File was created 1 program inter2d
2 use fvn
3 implicit none
4 integer(kind=4),parameter :: nx=21,ny=42
5 integer(kind=4) :: i,j
6 real(kind=8) :: f,fdata(nx,ny),dble,pi,q,sin,x,xdata(nx),y,ydata(ny)
7 real(kind=8) :: tv
8 intrinsic dble,sin
9 f(x,y)=sin(x+2.*y)
10 do i=1,nx
11 xdata(i)=dble(i-1)/dble(nx-1)
12 end do
13 do i=1,ny
14 ydata(i)=dble(i-1)/dble(ny-1)
15 end do
16 do i=1,nx
17 do j=1,ny
18 fdata(i,j)=f(xdata(i),ydata(j))
19 end do
20 end do
21 call init_random_seed()
22 call random_number(x)
23 call random_number(y)
24 q=fvn_quad_2d_interpol(x,y,nx,xdata,ny,ydata,fdata)
25 tv=f(x,y)
26 write(*,'("x y z ",2(f8.5))') x,y
27 write(*,'("Calculated (real) value :",f8.5)') tv
28 write(*,'("fvn interpolation : ",f8.5)') q
29 write(*,'("Relative fvn error :",e12.5)') abs((q-tv)/tv)
30 end program
fvn_test/test_inter3d.f90
File was created 1 program test_inter3d
2 use fvn
3 implicit none
4 integer(kind=4),parameter :: nx=21,ny=42,nz=18
5 integer(kind=4) :: i,j,k
6 real(kind=8) :: f,fdata(nx,ny,nz),dble,pi,q,sin,x,xdata(nx),y,ydata(ny),z,zdata(nz)
7 real(kind=8) :: tv
8 intrinsic dble,sin
9 f(x,y,z)=sin(x+2.*y+3.*z)
10 do i=1,nx
11 xdata(i)=2.*(dble(i-1)/dble(nx-1))
12 end do
13 do i=1,ny
14 ydata(i)=2.*(dble(i-1)/dble(ny-1))
15 end do
16 do i=1,nz
17 zdata(i)=2.*(dble(i-1)/dble(nz-1))
18 end do
19 do i=1,nx
20 do j=1,ny
21 do k=1,nz
22 fdata(i,j,k)=f(xdata(i),ydata(j),zdata(k))
23 end do
24 end do
25 end do
26 call init_random_seed()
27 call random_number(x)
28 call random_number(y)
29 call random_number(z)
30 q=fvn_quad_3d_interpol(x,y,z,nx,xdata,ny,ydata,nz,zdata,fdata)
31 tv=f(x,y,z)
32 write(*,'("x y z ",3(f8.5))') x,y,z
33 write(*,'("Calculated (real) value :",f8.5)') tv
34 write(*,'("fvn interpolation : ",f8.5)') q
35 write(*,'("Relative fvn error :",e12.5)') abs((q-tv)/tv)
36 end program
fvn_test/test_lsp.f90
File was created 1 program lsp
2 use fvn
3 implicit none
4 integer,parameter :: npoints=13,deg=3
5 integer :: status,i
6 real(kind=8) :: xm(npoints),ym(npoints),xstep,xc,yc
7 real(kind=8) :: coeff(deg+1)
8 xm = (/ -3.8,-2.7,-2.2,-1.9,-1.1,-0.7,0.5,1.7,2.,2.8,3.2,3.8,4. /)
9 ym = (/ -3.1,-2.,-0.9,0.8,1.8,0.4,2.1,1.8,3.2,2.8,3.9,5.2,7.5 /)
10 open(2,file='fvn_lsp_double_mesure.dat')
11 open(3,file='fvn_lsp_double_poly.dat')
12 do i=1,npoints
13 write(2,44) xm(i),ym(i)
14 end do
15 close(2)
16 call fvn_lspoly(npoints,xm,ym,deg,coeff,status)
17 xstep=(xm(npoints)-xm(1))/1000.
18 do i=1,1000
19 xc=xm(1)+(i-1)*xstep
20 yc=poly(xc,coeff)
21 write(3,44) xc,yc
22 end do
23 close(3)
24 write(*,*) "All done, plot results with gnuplot using command :"
25 write(*,*) "pl 'fvn_lsp_double_mesure.dat' u 1:2 w p,'fvn_lsp_double_poly.dat' u 1:2 w l"
26 44 FORMAT(4(1X,1PE22.14))
27 contains
28 function poly(x,coeff)
29 implicit none
30 real(8) :: x
31 real(8) :: coeff(deg+1)
32 real(8) :: poly
33 integer :: i
34 poly=0.
35 do i=1,deg+1
36 poly=poly+coeff(i)*x**(i-1)
37 end do
38 end function
39 end program
fvn_test/test_matcon.f90
File was created 1 program test_matcon
2 use fvn
3 implicit none
4 real(8),dimension(3,3) :: a
5 real(8) :: rcond
6 integer :: status,i
7 call init_random_seed()
8 call random_number(a)
9 a=a*100
10 call fvn_matcon(3,a,rcond,status)
11 write(*,*) "Reasonnably conditionned matrix"
12 do i=1,3
13 write (*,'(3(e12.5))') a(i,:)
14 end do
15 write (*,*)
16 write (*,*) "Cond = ",rcond
17 write (*,*)
18 write (*,*)
19 a(1,1)=a(1,1)*1d9
20 write(*,*) "Badly conditionned matrix"
21 do i=1,3
22 write (*,'(3(e12.5))') a(i,:)
23 end do
24 call fvn_matcon(3,a,rcond,status)
25 write (*,*)
26 write (*,*) "Cond = ",rcond
27
fvn_test/test_matev.f90
File was created 1 program test_matev
2 use fvn
3 implicit none
4 real(8),dimension(3,3) :: a
5 complex(8),dimension(3) :: evala
6 complex(8),dimension(3,3) :: eveca
7 integer :: status,i,j
8 call init_random_seed()
9 call random_number(a)
10 a=a*100
11 call fvn_matev(3,a,evala,eveca,status)
12
13 write(*,*) "The matrix :"
14 write (*,'(3(e12.5))') a
15 write (*,*)
16 do i=1,3
17 write(*,'("Eigenvalue ",I3," : (",e12.5,",",e12.5,") ")') i,evala(i)
18 write(*,*) "Associated Eigenvector :"
19 do j=1,3
20 write(*,'("(",e12.5,",",e12.5,") ")') eveca(j,i)
21 end do
22 write(*,*)
23 end do
fvn_test/test_matinv.f90
File was created 1 program test_matinv
2 use fvn
3 implicit none
4 integer(4), parameter :: n=3
5 integer(4) :: status,i
6 complex(8),dimension(n,n) :: m,im,prod
7 real(8),dimension(n,n) :: rtmp,itmp
8 character(len=80) :: fmreal,fmcmplx
9
10 fmcmplx='(3("(",f8.5,",",f8.5,") "))'
11
12 ! initialize pseudo random generator
13 call init_random_seed()
14 ! fill real and imaginary part
15 call random_number(rtmp)
16 call random_number(itmp)
17 ! create the complex matrix (fvn_i is defined in the fvn module)
18 m=rtmp+fvn_i*itmp
19 write(*,*) "Matrix M"
20 do i=1,n
21 write(*,fmcmplx) m(i,:)
22 end do
23
24 ! Invertion
25 call fvn_matinv(n,m,im)
26 write(*,*) "Inverse of M"
27 do i=1,n
28 write(*,fmcmplx) im(i,:)
29 end do
30
31 ! Result should be identity matrix
32 write(*,*) "Product of M and inverse of M :"
33 prod=matmul(m,im)
fvn_test/test_muller.f90
File was created 1 program muller
2 use fvn
3 implicit none
4 integer :: i,info
5 complex(8),dimension(10) :: roots
6 integer,dimension(10) :: infer
7 complex(8), external :: f
8
9 real(8) :: eps1
10 eps1=1.d-10
11 call fvn_muller(f,1.d-12,1.d-10,0,0,10,roots,200,infer,info)
12 write(*,*) "Error code :",info
13 do i=1,10
14 write(*,*) roots(i),infer(i)
15 enddo
16 end program
17
18 function f(x)
19 complex(8) :: x,f
fvn_test/test_sparse.f90
File was created 1 program test_sparse
2 use fvn
3 implicit none
4 integer(4), parameter :: nz=12
5 integer(4), parameter :: n=5
6 real(8),dimension(nz) :: A
7 real(8),dimension(n,n) :: As
8 integer(4),dimension(nz) :: Ti,Tj
9 real(8),dimension(n) :: B,x
10 integer(4) :: status,i
11 ! Description of the matrix in triplet form
12 A = (/ 2.,3.,3.,-1.,4.,4.,-3.,1.,2.,2.,6.,1. /)
13 B = (/ 8., 45., -3., 3., 19./)
14 Ti = (/ 1,2,1,3,5,2,3,4,5,3,2,5 /)
15 Tj = (/ 1,1,2,2,2,3,3,3,3,4,5,5 /)
16
17 ! Reconstruction of the matrix in standard form
18 ! just needed for printing the matrix here
19 As=0.
20 do i=1,nz
21 As(Ti(i),Tj(i))=A(i)
22 end do
23 write(*,*) "Matrix in standard representation :"
24 do i=1,5
25 write(*,'(5f8.4)') As(i,:)
26 end do
27 write(*,*)
28 write(*,'("Right hand side :",5f8.4)') B
29
30 !specific routine that will be used here
31 !call fvn_di_sparse_solve(n,nz,A,Ti,Tj,B,x,status)
32 call fvn_sparse_solve(n,nz,A,Ti,Tj,B,x,status)
33 write(*,'("Solution :",5f8.4)') x
fvn_test/test_specfunc.f90
File was created 1 program test_specfunc
2 use fvn_fnlib
3 implicit none
4 integer,parameter :: npoints=200
5 integer :: i
6 real(8), dimension(npoints) :: j0
7 real(8) :: xmin,xmax,xstep,x,y
8
9 ! bsj0
10 xmin=-20.
11 xmax=20.
12 xstep=(xmax-xmin)/dble(npoints)
13 open(2,file='bsj0.dat')
14 do i=1,npoints
15 x=xmin+i*xstep
16 y=bsj0(x)
17 write(2,'(2e22.14)') x,y
18 end do
19 close(2)
20
21 ! bsj1
22 xmin=-20.
23 xmax=20.
24 xstep=(xmax-xmin)/dble(npoints)
25 open(2,file='bsj1.dat')
26 do i=1,npoints
27 x=xmin+i*xstep
28 y=bsj1(x)
29 write(2,'(2e22.14)') x,y
30 end do
31 close(2)
32
33 !bsi0
34 xmin=-4.
35 xmax=4.
36 xstep=(xmax-xmin)/dble(npoints)
37 open(2,file='bsi0.dat')
38 do i=1,npoints
39 x=xmin+i*xstep
40 y=bsi0(x)
41 write(2,'(2e22.14)') x,y
42 end do
43 close(2)
44
45 !bsi1
46 xmin=-4.
47 xmax=4.
48 xstep=(xmax-xmin)/dble(npoints)
49 open(2,file='bsi1.dat')
50 do i=1,npoints
51 x=xmin+i*xstep
52 y=bsi1(x)
53 write(2,'(2e22.14)') x,y
54 end do
55 close(2)
56
57 !bsy0
58 xmin=0.
59 xmax=20.
60 xstep=(xmax-xmin)/dble(npoints)
61 open(2,file='bsy0.dat')
62 do i=1,npoints
63 x=xmin+i*xstep
64 y=bsy0(x)
65 write(2,'(2e22.14)') x,y
66 end do
67 close(2)
68
69 !bsy1
70 xmin=0.
71 xmax=20.
72 xstep=(xmax-xmin)/dble(npoints)
73 open(2,file='bsy1.dat')
74 do i=1,npoints
75 x=xmin+i*xstep
76 y=bsy1(x)
77 write(2,'(2e22.14)') x,y
78 end do
79 close(2)
80
81 !bsk0
82 xmin=0.
83 xmax=4.
84 xstep=(xmax-xmin)/dble(npoints)
85 open(2,file='bsk0.dat')
86 do i=1,npoints
87 x=xmin+i*xstep
88 y=bsk0(x)
89 write(2,'(2e22.14)') x,y
90 end do
91 close(2)
92
93 !bsk1
94 xmin=0.
95 xmax=4.
96 xstep=(xmax-xmin)/dble(npoints)
97 open(2,file='bsk1.dat')
98 do i=1,npoints
99 x=xmin+i*xstep
100 y=bsk1(x)
101 write(2,'(2e22.14)') x,y
102 end do
103 close(2)
104
105 !erf
106 xmin=-4.
107 xmax=4.
108 xstep=(xmax-xmin)/dble(npoints)
109 open(2,file='erf.dat')
110 do i=1,npoints
111 x=xmin+i*xstep
112 y=erf(x)
113 write(2,'(2e22.14)') x,y
114 end do
115 close(2)
116
117 ! gamma
118 xmin=-3.
119 xmax=7.
120 xstep=(xmax-xmin)/2000.
121 open(2,file='gamma.dat')
122 do i=1,2000
123 x=xmin+i*xstep
124 if ((abs(x-nint(x)) >= 1d-6) .or. x>0. )then
125 y=gamma(x)
126 write(2,'(2e22.14)') x,y
127 end if
128 end do
129 close(2)
130
131 ! 1/gamma
132 xmin=-3.
133 xmax=7.
134 xstep=(xmax-xmin)/dble(npoints)
135 open(2,file='gamr.dat')
136 do i=1,npoints
137 x=xmin+i*xstep
138 y=gamr(x)
139 write(2,'(2e22.14)') x,y
140 end do
141 close(2)
142
143 ! ei
144 xmin=0.
145 xmax=1.
146 xstep=(xmax-xmin)/dble(npoints)
147 open(2,file='ei.dat')
148 do i=1,npoints
149 x=xmin+i*xstep
150 y=ei(x)
151 write(2,'(2e22.14)') x,y
152 end do
153 close(2)