aboutsummaryrefslogtreecommitdiff
path: root/src/derivs.F90
blob: 59730ecea735cfc6ca92c3420613b0d918f4181d (plain)
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
! $Header$

#ifndef TGR_INCLUDED

#include "cctk.h"
#include "cctk_Parameters.h"

module derivs
  implicit none
  private
  public get_derivs
  public get_derivs2
  public get_derivs3
contains
#endif
  subroutine get_derivs (a, f, pos, off, dx, order)
    CCTK_REAL, intent(in)            :: a(*)
    CCTK_REAL, intent(out)           :: f(3)
    integer,   intent(in)            :: pos, off(3)
    CCTK_REAL, intent(in)            :: dx(3)
    integer,   intent(in),  optional :: order
    integer :: order1
    integer :: i
    order1 = 2
    if (present(order)) order1 = order
    select case (order1)
    case (2)
       do i=1,3
          f(i) = (a(pos+off(i)) - a(pos-off(i))) / (2*dx(i))
       end do
    case (4)
       do i=1,3
          f(i) = (- a(pos+2*off(i)) + 8*a(pos+off(i)) - 8*a(pos-off(i)) + a(pos-2*off(i))) / (12*dx(i))
       end do
    case default
       call CCTK_WARN (0, "Unsupported finite differencing order")
    end select
  end subroutine get_derivs
  subroutine get_derivs2 (a, f, pos, off, dx, order)
    CCTK_REAL, intent(in)            :: a(*)
    CCTK_REAL, intent(out)           :: f(3,3)
    integer,   intent(in)            :: pos, off(3)
    CCTK_REAL, intent(in)            :: dx(3)
    integer,   intent(in),  optional :: order
    integer :: order1
    integer :: i
    order1 = 2
    if (present(order)) order1 = order
    select case (order1)
    case (2)
       do i=1,3
          f(i,i) = (a(pos+off(i)) - 2*a(pos) + a(pos-off(i))) / dx(i)**2
       end do
       f(1,2) = (  a(pos-off(1)-off(2)) - a(pos+off(1)-off(2)) &
            &    - a(pos-off(1)+off(2)) + a(pos+off(1)+off(2))) / (4*dx(1)*dx(2))
       f(2,1) = f(1,2)
       f(1,3) = (  a(pos-off(1)-off(3)) - a(pos+off(1)-off(3)) &
            &    - a(pos-off(1)+off(3)) + a(pos+off(1)+off(3))) / (4*dx(1)*dx(3))
       f(3,1) = f(1,3)
       f(2,3) = (  a(pos-off(2)-off(3)) - a(pos+off(2)-off(3)) &
            &    - a(pos-off(2)+off(3)) + a(pos+off(2)+off(3))) / (4*dx(2)*dx(3))
       f(3,2) = f(2,3)
    case (4)
       do i=1,3
          f(i,i) = (- a(pos-2*off(i)) + 16*a(pos-off(i)) - 30*a(pos) + 16*a(pos+off(i)) - a(pos+2*off(i))) / (12*dx(i)**2)
       end do
       f(1,2) = (    a(pos+2*off(1)+2*off(2)) -  8*a(pos+off(1)+2*off(2)) +  8*a(pos-off(1)+2*off(2)) -   a(pos-2*off(1)+2*off(2)) &
            &    - 8*a(pos+2*off(1)+  off(2)) + 64*a(pos+off(1)+  off(2)) - 64*a(pos-off(1)+  off(2)) + 8*a(pos-2*off(1)+  off(2)) &
            &    + 8*a(pos+2*off(1)-  off(2)) - 64*a(pos+off(1)-  off(2)) + 64*a(pos-off(1)-  off(2)) - 8*a(pos-2*off(1)-  off(2)) &
            &    -   a(pos+2*off(1)-2*off(2)) +  8*a(pos+off(1)-2*off(2)) -  8*a(pos-off(1)-2*off(2)) +   a(pos-2*off(1)-2*off(2))) / (144*dx(1)*dx(2))
       f(2,1) = f(1,2)
       f(1,3) = (    a(pos+2*off(1)+2*off(3)) -  8*a(pos+off(1)+2*off(3)) +  8*a(pos-off(1)+2*off(3)) -   a(pos-2*off(1)+2*off(3)) &
            &    - 8*a(pos+2*off(1)+  off(3)) + 64*a(pos+off(1)+  off(3)) - 64*a(pos-off(1)+  off(3)) + 8*a(pos-2*off(1)+  off(3)) &
            &    + 8*a(pos+2*off(1)-  off(3)) - 64*a(pos+off(1)-  off(3)) + 64*a(pos-off(1)-  off(3)) - 8*a(pos-2*off(1)-  off(3)) &
            &    -   a(pos+2*off(1)-2*off(3)) +  8*a(pos+off(1)-2*off(3)) -  8*a(pos-off(1)-2*off(3)) +   a(pos-2*off(1)-2*off(3))) / (144*dx(1)*dx(3))
       f(3,1) = f(1,3)
       f(2,3) = (    a(pos+2*off(2)+2*off(3)) -  8*a(pos+off(2)+2*off(3)) +  8*a(pos-off(2)+2*off(3)) -   a(pos-2*off(2)+2*off(3)) &
            &    - 8*a(pos+2*off(2)+  off(3)) + 64*a(pos+off(2)+  off(3)) - 64*a(pos-off(2)+  off(3)) + 8*a(pos-2*off(2)+  off(3)) &
            &    + 8*a(pos+2*off(2)-  off(3)) - 64*a(pos+off(2)-  off(3)) + 64*a(pos-off(2)-  off(3)) - 8*a(pos-2*off(2)-  off(3)) &
            &    -   a(pos+2*off(2)-2*off(3)) +  8*a(pos+off(2)-2*off(3)) -  8*a(pos-off(2)-2*off(3)) +   a(pos-2*off(2)-2*off(3))) / (144*dx(2)*dx(3))
       f(3,2) = f(2,3)
    case default
       call CCTK_WARN (0, "Unsupported finite differencing order")
    end select
  end subroutine get_derivs2
  subroutine get_derivs3 (a, f, pos, off, dx, order)
    CCTK_REAL, intent(in)            :: a(*)
    CCTK_REAL, intent(out)           :: f(3,3,3)
    integer,   intent(in)            :: pos, off(3)
    CCTK_REAL, intent(in)            :: dx(3)
    integer,   intent(in),  optional :: order
    integer :: order1
    order1 = 2
    if (present(order)) order1 = order
    select case (order1)
    case (2)
       f(1,1,1) = (a(pos+2*off(1)) - 2*a(pos+off(1)) + 2*a(pos-off(1)) - a(pos-2*off(1))) / (2*dx(1)**3)
       f(2,1,1) = (a(pos+off(1)+off(2)) - 2*a(pos+off(2)) + a(pos-off(1)+off(2)) - a(pos+off(1)-off(2)) + 2*a(pos-off(2)) - a(pos-off(1)-off(2))) / (2*dx(1)*dx(1)*dx(2))
       f(3,1,1) = (a(pos+off(1)+off(3)) - 2*a(pos+off(3)) + a(pos-off(1)+off(3)) - a(pos+off(1)-off(3)) + 2*a(pos-off(3)) - a(pos-off(1)-off(3))) / (2*dx(1)*dx(1)*dx(3))
       f(1,2,1) = f(2,1,1)
       f(2,2,1) = (a(pos+off(1)+off(2)) - 2*a(pos+off(1)) + a(pos+off(1)-off(2)) - a(pos-off(1)+off(2)) + 2*a(pos-off(1)) - a(pos-off(1)-off(2))) / (2*dx(1)*dx(2)*dx(2))
       f(3,2,1) = (a(pos+off(1)+off(2)+off(3)) - a(pos-off(1)+off(2)+off(3)) - a(pos+off(1)-off(2)+off(3)) + a(pos-off(1)-off(2)+off(3)) - a(pos+off(1)+off(2)-off(3)) + a(pos-off(1)+off(2)-off(3)) + a(pos+off(1)-off(2)-off(3)) - a(pos-off(1)-off(2)-off(3))) / (8*dx(1)*dx(2)*dx(3))
       f(1,3,1) = f(3,1,1)
       f(2,3,1) = f(3,2,1)
       f(3,3,1) = (a(pos+off(1)+off(3)) - 2*a(pos+off(1)) + a(pos+off(1)-off(3)) - a(pos-off(1)+off(3)) + 2*a(pos-off(1)) - a(pos-off(1)-off(3))) / (2*dx(1)*dx(3)*dx(3))
       f(:,1,2) = f(:,2,1)
       f(1,2,2) = f(2,2,1)
       f(2,2,2) = (a(pos+2*off(2)) - 2*a(pos+off(2)) + 2*a(pos-off(2)) - a(pos-2*off(2))) / (2*dx(2)**3)
       f(3,2,2) = (a(pos+off(2)+off(3)) - 2*a(pos+off(3)) + a(pos-off(2)+off(3)) - a(pos+off(2)-off(3)) + 2*a(pos-off(3)) - a(pos-off(2)-off(3))) / (2*dx(2)*dx(2)*dx(3))
       f(1,3,2) = f(3,1,2)
       f(2,3,2) = f(3,2,2)
       f(3,3,2) = (a(pos+off(2)+off(3)) - 2*a(pos+off(2)) + a(pos+off(2)-off(3)) - a(pos-off(2)+off(3)) + 2*a(pos-off(2)) - a(pos-off(2)-off(3))) / (2*dx(2)*dx(3)*dx(3))
       f(:,1,3) = f(:,3,1)
       f(:,2,3) = f(:,3,2)
       f(1,3,3) = f(3,1,3)
       f(2,3,3) = f(3,2,3)
       f(3,3,3) = (a(pos+2*off(3)) - 2*a(pos+off(3)) + 2*a(pos-off(3)) - a(pos-2*off(3))) / (2*dx(3)**3)
    case (4)
       ! [+1 -8 +13 0 -13 +8 -1] / 8
       f(1,1,1) = (a(pos-3*off(1)) - 8*a(pos-2*off(1)) + 13*a(pos-off(1)) - 13*a(pos+off(1)) + 8*a(pos+2*off(1)) - a(pos+3*off(1))) / (8*dx(1)**3)
       ! [-1 +8 0 -8 +1] / 12
       ! [-1 +16 -30 +16 -1] / 12
       f(2,1,1) = (+   a(pos-2*off(1)-2*off(2)) -  16*a(pos-off(1)-2*off(2)) +  30*a(pos-2*off(2)) -  16*a(pos+off(1)-2*off(2)) +   a(pos+2*off(1)-2*off(2)) &
            &      - 8*a(pos-2*off(1)-  off(2)) + 128*a(pos-off(1)-  off(2)) - 240*a(pos-  off(2)) + 128*a(pos+off(1)-  off(2)) - 8*a(pos+2*off(1)-  off(2)) &
            &      + 8*a(pos-2*off(1)+  off(2)) - 128*a(pos-off(1)+  off(2)) + 240*a(pos+  off(2)) - 128*a(pos+off(1)+  off(2)) + 8*a(pos+2*off(1)+  off(2)) &
            &      -   a(pos-2*off(1)+2*off(2)) +  16*a(pos-off(1)+2*off(2)) -  30*a(pos+2*off(2)) +  16*a(pos+off(1)+2*off(2)) -   a(pos+2*off(1)+2*off(2))) / (144*dx(1)**2*dx(2))
       f(3,1,1) = (+   a(pos-2*off(1)-2*off(3)) -  16*a(pos-off(1)-2*off(3)) +  30*a(pos-2*off(3)) -  16*a(pos+off(1)-2*off(3)) +   a(pos+2*off(1)-2*off(3)) &
            &      - 8*a(pos-2*off(1)-  off(3)) + 128*a(pos-off(1)-  off(3)) - 240*a(pos-  off(3)) + 128*a(pos+off(1)-  off(3)) - 8*a(pos+2*off(1)-  off(3)) &
            &      + 8*a(pos-2*off(1)+  off(3)) - 128*a(pos-off(1)+  off(3)) + 240*a(pos+  off(3)) - 128*a(pos+off(1)+  off(3)) + 8*a(pos+2*off(1)+  off(3)) &
            &      -   a(pos-2*off(1)+2*off(3)) +  16*a(pos-off(1)+2*off(3)) -  30*a(pos+2*off(3)) +  16*a(pos+off(1)+2*off(3)) -   a(pos+2*off(1)+2*off(3))) / (144*dx(1)**2*dx(3))
       f(1,2,1) = f(2,1,1)
       f(2,2,1) = (+   a(pos-2*off(2)-2*off(1)) -  16*a(pos-off(2)-2*off(1)) +  30*a(pos-2*off(1)) -  16*a(pos+off(2)-2*off(1)) +   a(pos+2*off(2)-2*off(1)) &
            &      - 8*a(pos-2*off(2)-  off(1)) + 128*a(pos-off(2)-  off(1)) - 240*a(pos-  off(1)) + 128*a(pos+off(2)-  off(1)) - 8*a(pos+2*off(2)-  off(1)) &
            &      + 8*a(pos-2*off(2)+  off(1)) - 128*a(pos-off(2)+  off(1)) + 240*a(pos+  off(1)) - 128*a(pos+off(2)+  off(1)) + 8*a(pos+2*off(2)+  off(1)) &
            &      -   a(pos-2*off(2)+2*off(1)) +  16*a(pos-off(2)+2*off(1)) -  30*a(pos+2*off(1)) +  16*a(pos+off(2)+2*off(1)) -   a(pos+2*off(2)+2*off(1))) / (144*dx(2)**2*dx(1))
       f(3,2,1) = (-     a(pos-2*off(1)-2*off(2)-2*off(3)) +   8*a(pos-off(1)-2*off(2)-2*off(3)) -   8*a(pos+off(1)-2*off(2)-2*off(3)) +     a(pos+2*off(1)-2*off(2)-2*off(3)) &
            &      +   8*a(pos-2*off(1)-  off(2)-2*off(3)) -  64*a(pos-off(1)-  off(2)-2*off(3)) +  64*a(pos+off(1)-  off(2)-2*off(3)) -   8*a(pos+2*off(1)-  off(2)-2*off(3)) &
            &      -   8*a(pos-2*off(1)+  off(2)-2*off(3)) +  64*a(pos-off(1)+  off(2)-2*off(3)) -  64*a(pos+off(1)+  off(2)-2*off(3)) +   8*a(pos+2*off(1)+  off(2)-2*off(3)) &
            &      +     a(pos-2*off(1)+2*off(2)-2*off(3)) -   8*a(pos-off(1)+2*off(2)-2*off(3)) +   8*a(pos+off(1)+2*off(2)-2*off(3)) -     a(pos+2*off(1)+2*off(2)-2*off(3)) &
            &      +   8*a(pos-2*off(1)-2*off(2)-  off(3)) -  64*a(pos-off(1)-2*off(2)-  off(3)) +  64*a(pos+off(1)-2*off(2)-  off(3)) -   8*a(pos+2*off(1)-2*off(2)-  off(3)) &
            &      -  64*a(pos-2*off(1)-  off(2)-  off(3)) + 512*a(pos-off(1)-  off(2)-  off(3)) - 512*a(pos+off(1)-  off(2)-  off(3)) +  64*a(pos+2*off(1)-  off(2)-  off(3)) &
            &      +  64*a(pos-2*off(1)+  off(2)-  off(3)) - 512*a(pos-off(1)+  off(2)-  off(3)) + 512*a(pos+off(1)+  off(2)-  off(3)) -  64*a(pos+2*off(1)+  off(2)-  off(3)) &
            &      -   8*a(pos-2*off(1)+2*off(2)-  off(3)) +  64*a(pos-off(1)+2*off(2)-  off(3)) -  64*a(pos+off(1)+2*off(2)-  off(3)) +   8*a(pos+2*off(1)+2*off(2)-  off(3)) &
            &      -   8*a(pos-2*off(1)-2*off(2)+  off(3)) +  64*a(pos-off(1)-2*off(2)+  off(3)) -  64*a(pos+off(1)-2*off(2)+  off(3)) +   8*a(pos+2*off(1)-2*off(2)+  off(3)) &
            &      +  64*a(pos-2*off(1)-  off(2)+  off(3)) - 512*a(pos-off(1)-  off(2)+  off(3)) + 512*a(pos+off(1)-  off(2)+  off(3)) -  64*a(pos+2*off(1)-  off(2)+  off(3)) &
            &      -  64*a(pos-2*off(1)+  off(2)+  off(3)) + 512*a(pos-off(1)+  off(2)+  off(3)) - 512*a(pos+off(1)+  off(2)+  off(3)) +  64*a(pos+2*off(1)+  off(2)+  off(3)) &
            &      +   8*a(pos-2*off(1)+2*off(2)+  off(3)) -  64*a(pos-off(1)+2*off(2)+  off(3)) +  64*a(pos+off(1)+2*off(2)+  off(3)) -   8*a(pos+2*off(1)+2*off(2)+  off(3)) &
            &      +     a(pos-2*off(1)-2*off(2)+2*off(3)) -   8*a(pos-off(1)-2*off(2)+2*off(3)) +   8*a(pos+off(1)-2*off(2)+2*off(3)) -     a(pos+2*off(1)-2*off(2)+2*off(3)) &
            &      -   8*a(pos-2*off(1)-  off(2)+2*off(3)) +  64*a(pos-off(1)-  off(2)+2*off(3)) -  64*a(pos+off(1)-  off(2)+2*off(3)) +   8*a(pos+2*off(1)-  off(2)+2*off(3)) &
            &      +   8*a(pos-2*off(1)+  off(2)+2*off(3)) -  64*a(pos-off(1)+  off(2)+2*off(3)) +  64*a(pos+off(1)+  off(2)+2*off(3)) -   8*a(pos+2*off(1)+  off(2)+2*off(3)) &
            &      -     a(pos-2*off(1)+2*off(2)+2*off(3)) +   8*a(pos-off(1)+2*off(2)+2*off(3)) -   8*a(pos+off(1)+2*off(2)+2*off(3)) +     a(pos+2*off(1)+2*off(2)+2*off(3))) / (512*dx(1)*dx(2)*dx(3))
       f(1,3,1) = f(3,1,1)
       f(2,3,1) = f(3,2,1)
       f(3,3,1) = (+   a(pos-2*off(3)-2*off(1)) -  16*a(pos-off(3)-2*off(1)) +  30*a(pos-2*off(1)) -  16*a(pos+off(3)-2*off(1)) +   a(pos+2*off(3)-2*off(1)) &
            &      - 8*a(pos-2*off(3)-  off(1)) + 128*a(pos-off(3)-  off(1)) - 240*a(pos-  off(1)) + 128*a(pos+off(3)-  off(1)) - 8*a(pos+2*off(3)-  off(1)) &
            &      + 8*a(pos-2*off(3)+  off(1)) - 128*a(pos-off(3)+  off(1)) + 240*a(pos+  off(1)) - 128*a(pos+off(3)+  off(1)) + 8*a(pos+2*off(3)+  off(1)) &
            &      -   a(pos-2*off(3)+2*off(1)) +  16*a(pos-off(3)+2*off(1)) -  30*a(pos+2*off(1)) +  16*a(pos+off(3)+2*off(1)) -   a(pos+2*off(3)+2*off(1))) / (144*dx(3)**2*dx(1))
       f(:,1,2) = f(:,2,1)
       f(1,2,2) = f(2,2,1)
       f(2,2,2) = (a(pos-3*off(2)) - 8*a(pos-2*off(2)) + 13*a(pos-off(2)) - 13*a(pos+off(2)) + 8*a(pos+2*off(2)) - a(pos+3*off(2))) / (8*dx(2)**3)
       f(3,2,2) = (+   a(pos-2*off(2)-2*off(3)) -  16*a(pos-off(2)-2*off(3)) +  30*a(pos-2*off(3)) -  16*a(pos+off(2)-2*off(3)) +   a(pos+2*off(2)-2*off(3)) &
            &      - 8*a(pos-2*off(2)-  off(3)) + 128*a(pos-off(2)-  off(3)) - 240*a(pos-  off(3)) + 128*a(pos+off(2)-  off(3)) - 8*a(pos+2*off(2)-  off(3)) &
            &      + 8*a(pos-2*off(2)+  off(3)) - 128*a(pos-off(2)+  off(3)) + 240*a(pos+  off(3)) - 128*a(pos+off(2)+  off(3)) + 8*a(pos+2*off(2)+  off(3)) &
            &      -   a(pos-2*off(2)+2*off(3)) +  16*a(pos-off(2)+2*off(3)) -  30*a(pos+2*off(3)) +  16*a(pos+off(2)+2*off(3)) -   a(pos+2*off(2)+2*off(3))) / (144*dx(2)**2*dx(3))
       f(1,3,2) = f(3,1,2)
       f(2,3,2) = f(3,2,2)
       f(3,3,2) = (+   a(pos-2*off(3)-2*off(2)) -  16*a(pos-off(3)-2*off(2)) +  30*a(pos-2*off(2)) -  16*a(pos+off(3)-2*off(2)) +   a(pos+2*off(3)-2*off(2)) &
            &      - 8*a(pos-2*off(3)-  off(2)) + 128*a(pos-off(3)-  off(2)) - 240*a(pos-  off(2)) + 128*a(pos+off(3)-  off(2)) - 8*a(pos+2*off(3)-  off(2)) &
            &      + 8*a(pos-2*off(3)+  off(2)) - 128*a(pos-off(3)+  off(2)) + 240*a(pos+  off(2)) - 128*a(pos+off(3)+  off(2)) + 8*a(pos+2*off(3)+  off(2)) &
            &      -   a(pos-2*off(3)+2*off(2)) +  16*a(pos-off(3)+2*off(2)) -  30*a(pos+2*off(2)) +  16*a(pos+off(3)+2*off(2)) -   a(pos+2*off(3)+2*off(2))) / (144*dx(3)**2*dx(2))
       f(:,1,3) = f(:,3,1)
       f(:,2,3) = f(:,3,2)
       f(1,3,3) = f(3,1,3)
       f(2,3,3) = f(3,2,3)
       f(3,3,3) = (a(pos-3*off(3)) - 8*a(pos-2*off(3)) + 13*a(pos-off(3)) - 13*a(pos+off(3)) + 8*a(pos+2*off(3)) - a(pos+3*off(3))) / (8*dx(3)**3)
    case default
       call CCTK_WARN (0, "Unsupported finite differencing order")
    end select
  end subroutine get_derivs3
#ifndef TGR_INCLUDED
end module derivs
#endif