Reputation: 11
In Fortran, to do the Monte Carlo integration, I want to times an extra factor which contains a Dirac Delta function like delta(1-x), how do I express delta function in Fortran? Is there anything like log(x)? or do I have to define a function? how?
Upvotes: 0
Views: 633
Reputation: 1416
This should do the job:
program test_dirac
use iso_fortran_env
implicit none
integer :: i
real(real64) :: x
do i=-10,10
x = real(i,real64)
print *, 'x=',x,' dirac=',dirac(x)
end do
contains
elemental real(real64) function dirac(x)
real(real64), intent(in) :: x
real(real64) :: absx
absx = abs(x)
dirac = merge(1.0_real64/absx,0.0_real64,absx<epsilon(x))
end function dirac
end program test_dirac
On gfortran-10, it returns:
x= -10.000000000000000 dirac= 0.0000000000000000
x= -9.0000000000000000 dirac= 0.0000000000000000
x= -8.0000000000000000 dirac= 0.0000000000000000
x= -7.0000000000000000 dirac= 0.0000000000000000
x= -6.0000000000000000 dirac= 0.0000000000000000
x= -5.0000000000000000 dirac= 0.0000000000000000
x= -4.0000000000000000 dirac= 0.0000000000000000
x= -3.0000000000000000 dirac= 0.0000000000000000
x= -2.0000000000000000 dirac= 0.0000000000000000
x= -1.0000000000000000 dirac= 0.0000000000000000
x= 0.0000000000000000 dirac= Infinity
x= 1.0000000000000000 dirac= 0.0000000000000000
x= 2.0000000000000000 dirac= 0.0000000000000000
x= 3.0000000000000000 dirac= 0.0000000000000000
x= 4.0000000000000000 dirac= 0.0000000000000000
x= 5.0000000000000000 dirac= 0.0000000000000000
x= 6.0000000000000000 dirac= 0.0000000000000000
x= 7.0000000000000000 dirac= 0.0000000000000000
x= 8.0000000000000000 dirac= 0.0000000000000000
x= 9.0000000000000000 dirac= 0.0000000000000000
x= 10.000000000000000 dirac= 0.0000000000000000
Upvotes: 1