File: math.f90

package info (click to toggle)
abinit 9.10.4-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 518,712 kB
  • sloc: xml: 877,568; f90: 577,240; python: 80,760; perl: 7,019; ansic: 4,585; sh: 1,925; javascript: 601; fortran: 557; cpp: 454; objc: 323; makefile: 77; csh: 42; pascal: 31
file content (87 lines) | stat: -rw-r--r-- 2,517 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
!------------------------------------!
!---------AVERAGE ROUTINE------------!
!------------------------------------!

subroutine average(data,size_data,average_value)

! input values:  
  integer :: size_data
  real(8),dimension(size_data),intent(in) :: data
 !f2py optional , depend(data) :: size_data=len(data)
  real(8),intent(out) :: average_value
  average_value  = 0.0

  do i=1,size_data
    average_value  = average_value + data(i)
  end do

  average_value = average_value / size_data
  
end subroutine average


!------------------------------------!
!------STANDAR DEVIATION ROUTINE-----!
!------------------------------------!
subroutine standard_deviation(data,average_input,size_data,deviation)
!  input  values:    
  integer  ::  size_data
  real(8), dimension(size_data),intent(in)  ::  data
  real(8), intent(in), optional  ::  average_input  
  !f2py  optional  ,  depend(data)  ::  size_data=len(data)
  real(8),intent(out)  ::  deviation
  real(8) :: average_data = 0

  
  if (average_input/=0) then
    average_data = average_input
  else
    average_data = 0
    call  average(data,size_data,average_data)
  end if

  do  i=1,size_data
    deviation  =  deviation  +  (data(i)  -  average_data)**2
  end  do
    
  deviation  =  deviation/size_data
  deviation  =  deviation**0.5

end subroutine  standard_deviation


!------------------------------------!
!------MEAN SQUARED DISPLACEMENT-----!
!------------------------------------!
subroutine mean_square_displacement(position,indexAtom1,msd,size2,size3,nba1)
  integer :: size2,size3,nba1,nbtime
  !input  values:    
  !f2py  optional  ,  depend(position)    ::  size2=len(position[:,1,1])
  !f2py  optional  ,  depend(position)    ::  size3=len(position[1,:,1])
  !f2py  optional  ,  depend(indexAtom1)  ::  nba1=len(indexAtom1)
  integer, intent(in)  ::  indexAtom1(nba1)
  real, intent(in)  ::  position(size2,size3,3)
  !output 
  real(8),intent(out)  ::  msd((size2-1)/2)

  !local variable
  real(8), dimension(3)  ::  p1=(/1,1,1/),p2=(/1,1,1/)
  real(8) r
  integer i,k,tau

  nbtime = size2

  msd(:) = 0
  do tau=1,int((nbtime-1)/2) !loop on step
    do i=1,nbtime-tau-1 !loop on step
      do k=1,size(indexAtom1)
        p1 = position(i,indexAtom1(k),:)
        p2 = position(i+tau,indexAtom1(k),:) - p1(:)
        r = p2(1)**2+p2(2)**2+p2(3)**2
        msd(tau)= msd(tau) + r
      end do
    end do
    msd(tau)= msd(tau) / (nbtime-tau-1)
  end do
  msd(:) = msd(:)/(size(indexAtom1))
end subroutine mean_square_displacement