conv_index_NR.f90
Go to the documentation of this file.00001 program conv_index_NR
00002 implicit none
00003 integer :: i, k, n = 6, iter, iter_max = 100, ndata = 5
00004 real(8) :: xi(5),yi(5), yin(5,6)
00005 real(8) :: dd, od(6), dd_old, delta_dd
00006 real(8) :: fx, delta_fx, logfx, delta_logfx, error
00007
00008 open(1,file='data.dat',status='old')
00009 do i = 1, ndata
00010 read(1,*) xi(i), (yin(i,k), k = 1, n)
00011 end do
00012 close(1)
00013
00014 do k = 1, n
00015 yi(:) = yin(:,k)
00016
00017 dd = 2.0d0
00018 do iter = 1, iter_max
00019
00020 fx = (yi(3)-yi(4))*xi(5)**dd &
00021 & + (yi(5)-yi(3))*xi(4)**dd &
00022 & + (yi(4)-yi(5))*xi(3)**dd
00023 delta_fx = (yi(3)-yi(4))*xi(5)**dd*dlog(xi(5)) &
00024 & + (yi(5)-yi(3))*xi(4)**dd*dlog(xi(4)) &
00025 & + (yi(4)-yi(5))*xi(3)**dd*dlog(xi(3))
00026 logfx = dlog(fx)
00027 delta_logfx = delta_fx/fx
00028
00029 delta_dd = - fx/delta_fx
00030
00031 dd_old = dd
00032 dd = dd + delta_dd
00033 error = dabs((dd_old - dd)/dd)
00034 write(6,*) 'error = ', error
00035 if (error.le.1.0d-10) then
00036 write(6,*) 'iteration=', iter ; exit
00037 end if
00038
00039 end do
00040 if (iter.eq.iter_max) stop 'iteration not converged'
00041
00042 od(k) = dd
00043 end do
00044
00045 write(6,*) (od(k), k = 1, n)
00046 open(1,file='output_index.dat',status='unknown')
00047 write(1,'(1p,9e18.10)') (od(k), k = 1, n)
00048 close(1)
00049
00050 end program conv_index_NR