-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathderiv.f90
51 lines (36 loc) · 1.32 KB
/
deriv.f90
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
SUBROUTINE Deriv( Order,InArray,OutArray,Delh,ArrayLength )
IMPLICIT NONE
INCLUDE 'mpif.h'
INTEGER,PARAMETER::dp=SELECTED_REAL_KIND(15,300)
INTEGER,INTENT(IN)::Order,ArrayLength
REAL(KIND=dp),INTENT(IN)::Delh
DOUBLE COMPLEX,DIMENSION(ArrayLength),INTENT(IN)::InArray
DOUBLE COMPLEX,DIMENSION(ArrayLength),INTENT(OUT)::OutArray
INTEGER::ii
IF (Order.EQ.2) THEN
!!!!!!!!!!!!!!!!!!!!!
! SECOND DERIVATIVE !
!!!!!!!!!!!!!!!!!!!!!
ii = 1
OutArray(ii) = ( InArray(ii+2) - 2.0_dp*InArray(ii+1) + InArray(ii) ) / ( Delh**2 )
ii = ArrayLength
OutArray(ii) = ( InArray(ii) - 2.0_dp*InArray(ii-1) + InArray(ii-2) ) / ( Delh**2 )
DO ii=2,ArrayLength-1
OutArray(ii) = ( InArray(ii+1) - 2.0_dp*InArray(ii) + InArray(ii-1) ) / ( Delh**2 )
END DO
ELSE IF (Order.EQ.1) THEN
!!!!!!!!!!!!!!!!!!!!
! FIRST DERIVATIVE !
!!!!!!!!!!!!!!!!!!!!
ii = 1
OutArray(ii) = ( InArray(ii+1)-InArray(ii) ) / ( Delh )
ii = ArrayLength
OutArray(ii) = ( InArray(ii)-InArray(ii-1) ) / ( Delh )
DO ii=2,ArrayLength-1
OutArray(ii) = ( InArray(ii+1) - InArray(ii-1) ) / ( 2.0_dp*Delh )
END DO
ELSE
PRINT*,'Can only compute first or second derivatives'
CALL EXIT()
END IF
END SUBROUTINE Deriv