DISPATCH
vector_ops.f90
1 !===============================================================================
2 !> $Id: 2f90f54fd1d05f88c2aaec0e8b6dc51fb34b3f4c $
3 !===============================================================================
4 MODULE vector_ops
5  USE stagger_mod
6  USE mesh_mod
7  implicit none
8  public
9  interface norm
10  module procedure vector_norm_scalar
11  end interface
12  interface norm2
13  module procedure vector_norm2_scalar
14  end interface
15  interface edge
16  module procedure scalar_edge_vector
17  end interface
18  interface edge_up
19  module procedure scalar_edge_vector_up
20  end interface
21  interface face
22  module procedure scalar_face_vector
23  end interface
24  interface face_up
25  module procedure scalar_face_vector_up
26  end interface
27  interface down
28  module procedure scalar_down_vector
29  module procedure vector_down_vector
30  end interface
31  interface up
32  module procedure scalar_up_vector
33  module procedure vector_up_vector
34  end interface
35  interface ddown
36  module procedure scalar_ddown_vector
37  module procedure vector_ddown_vector
38  end interface
39  interface dup
40  module procedure scalar_dup_vector
41  module procedure vector_dup_vector
42  end interface
43  interface grad
44  module procedure vector_grad_scalar
45  end interface
46  interface div
47  module procedure scalar_div_vector
48  end interface
49  interface div_dn
50  module procedure scalar_div_dn_vector
51  end interface
52  interface minusdiv
53  module procedure scalar_minusdiv_vector
54  end interface
55  interface curl_dn
56  module procedure vector_curl_dn_vector
57  end interface
58  interface curl_up
59  module procedure vector_curl_up_vector
60  end interface
61 CONTAINS
62 
63 !===============================================================================
64 FUNCTION vector_norm2_scalar (in) RESULT (out)
65  real, dimension(:,:,:,:), intent(in):: in
66  real, dimension(size(in,1),size(in,2),size(in,3)):: out
67  !-----------------------------------------------------------------------------
68  out = in(:,:,:,1)**2 + in(:,:,:,2)**2 + in(:,:,:,3)**2
69 END FUNCTION vector_norm2_scalar
70 !===============================================================================
71 FUNCTION vector_norm_scalar (in) RESULT (out)
72  real, dimension(:,:,:,:), intent(in):: in
73  real, dimension(size(in,1),size(in,2),size(in,3)):: out
74  !-----------------------------------------------------------------------------
75  out = sqrt(in(:,:,:,1)**2 + in(:,:,:,2)**2 + in(:,:,:,3)**2)
76 END FUNCTION vector_norm_scalar
77 
78 !===============================================================================
79 FUNCTION scalar_edge_vector (in) RESULT (out)
80  real, dimension(:,:,:), intent(in):: in
81  real, dimension(size(in,1),size(in,2),size(in,3),3):: out
82  !-----------------------------------------------------------------------------
83  out(:,:,:,1) = ydn(zdn(in))
84  out(:,:,:,2) = zdn(xdn(in))
85  out(:,:,:,3) = xdn(ydn(in))
86 END FUNCTION scalar_edge_vector
87 !===============================================================================
88 FUNCTION scalar_edge_vector_up (in) RESULT (out)
89  real, dimension(:,:,:), intent(in):: in
90  real, dimension(size(in,1),size(in,2),size(in,3),3):: out
91  !-----------------------------------------------------------------------------
92  out(:,:,:,1) = yup(zup(in))
93  out(:,:,:,2) = zup(xup(in))
94  out(:,:,:,3) = xup(yup(in))
95 END FUNCTION scalar_edge_vector_up
96 !===============================================================================
97 FUNCTION scalar_face_vector (in) RESULT (out)
98  real, dimension(:,:,:), intent(in):: in
99  real, dimension(size(in,1),size(in,2),size(in,3),3):: out
100  real:: ds(3)
101  !-----------------------------------------------------------------------------
102  out(:,:,:,1) = xdn(in)
103  out(:,:,:,2) = ydn(in)
104  out(:,:,:,3) = zdn(in)
105 END FUNCTION scalar_face_vector
106 !===============================================================================
107 FUNCTION scalar_face_vector_up (in) RESULT (out)
108  real, dimension(:,:,:), intent(in):: in
109  real, dimension(size(in,1),size(in,2),size(in,3),3):: out
110  real:: ds(3)
111  !-----------------------------------------------------------------------------
112  out(:,:,:,1) = xup(in)
113  out(:,:,:,2) = yup(in)
114  out(:,:,:,3) = zup(in)
115 END FUNCTION scalar_face_vector_up
116 !===============================================================================
117 FUNCTION scalar_down_vector (in) RESULT (out)
118  real, dimension(:,:,:), intent(in):: in
119  real, dimension(size(in,1),size(in,2),size(in,3),3):: out
120  !-----------------------------------------------------------------------------
121  out(:,:,:,1) = xdn(in)
122  out(:,:,:,2) = ydn(in)
123  out(:,:,:,3) = zdn(in)
124 END FUNCTION scalar_down_vector
125 !===============================================================================
126 FUNCTION vector_down_vector (in) RESULT (out)
127  real, dimension(:,:,:,:), intent(in):: in
128  real, dimension(size(in,1),size(in,2),size(in,3),3):: out
129  !-----------------------------------------------------------------------------
130  out(:,:,:,1) = xdn(in(:,:,:,1))
131  out(:,:,:,2) = ydn(in(:,:,:,2))
132  out(:,:,:,3) = zdn(in(:,:,:,3))
133 END FUNCTION vector_down_vector
134 !===============================================================================
135 FUNCTION scalar_up_vector (in) RESULT (out)
136  real, dimension(:,:,:), intent(in):: in
137  real, dimension(size(in,1),size(in,2),size(in,3),3):: out
138  !-----------------------------------------------------------------------------
139  out(:,:,:,1) = xup(in)
140  out(:,:,:,2) = yup(in)
141  out(:,:,:,3) = zup(in)
142 END FUNCTION scalar_up_vector
143 !===============================================================================
144 FUNCTION vector_up_vector (in) RESULT (out)
145  real, dimension(:,:,:,:), intent(in):: in
146  real, dimension(size(in,1),size(in,2),size(in,3),3):: out
147  !-----------------------------------------------------------------------------
148  out(:,:,:,1) = xup(in(:,:,:,1))
149  out(:,:,:,2) = yup(in(:,:,:,2))
150  out(:,:,:,3) = zup(in(:,:,:,3))
151 END FUNCTION vector_up_vector
152 
153 !===============================================================================
154 FUNCTION scalar_ddown_vector (ds, in) RESULT (out)
155  real, dimension(:,:,:), intent(in):: in
156  real, dimension(size(in,1),size(in,2),size(in,3),3):: out
157  real(8):: ds(3)
158  !-----------------------------------------------------------------------------
159  out(:,:,:,1) = ddxdn(ds, in)
160  out(:,:,:,2) = ddydn(ds, in)
161  out(:,:,:,3) = ddzdn(ds, in)
162 END FUNCTION scalar_ddown_vector
163 
164 !===============================================================================
165 FUNCTION vector_ddown_vector (ds, in) RESULT (out)
166  real, dimension(:,:,:,:), intent(in):: in
167  real, dimension(size(in,1),size(in,2),size(in,3),3):: out
168  real(8):: ds(3)
169  !-----------------------------------------------------------------------------
170  out(:,:,:,1) = ddxdn(ds, in(:,:,:,1))
171  out(:,:,:,2) = ddydn(ds, in(:,:,:,2))
172  out(:,:,:,3) = ddzdn(ds, in(:,:,:,3))
173 END FUNCTION vector_ddown_vector
174 
175 !===============================================================================
176 FUNCTION scalar_dup_vector (ds, in) RESULT (out)
177  real, dimension(:,:,:), intent(in):: in
178  real, dimension(size(in,1),size(in,2),size(in,3),3):: out
179  real(8):: ds(3)
180  !-----------------------------------------------------------------------------
181  out(:,:,:,1) = ddxup(ds, in)
182  out(:,:,:,2) = ddyup(ds, in)
183  out(:,:,:,3) = ddzup(ds, in)
184 END FUNCTION scalar_dup_vector
185 
186 !===============================================================================
187 FUNCTION vector_dup_vector (ds, in) RESULT (out)
188  real, dimension(:,:,:,:), intent(in):: in
189  real, dimension(size(in,1),size(in,2),size(in,3),3):: out
190  real(8):: ds(3)
191  !-----------------------------------------------------------------------------
192  out(:,:,:,1) = ddxup(ds, in(:,:,:,1))
193  out(:,:,:,2) = ddyup(ds, in(:,:,:,2))
194  out(:,:,:,3) = ddzup(ds, in(:,:,:,3))
195 END FUNCTION vector_dup_vector
196 
197 !===============================================================================
198 FUNCTION vector_grad_scalar (mesh, in) RESULT(out)
199  real, dimension(:,:,:), intent(in):: in
200  real, dimension(size(in,1),size(in,2),size(in,3),3):: out
201  class(mesh_t), dimension(:):: mesh
202  real(8):: ds(3)
203  !-----------------------------------------------------------------------------
204  ds = mesh%d
205  out(:,:,:,1) = ddxdn(ds, in)
206  out(:,:,:,2) = ddydn(ds, in)
207  out(:,:,:,3) = ddzdn(ds, in)
208 END FUNCTION
209 !===============================================================================
210 FUNCTION scalar_div_vector (ds, in) RESULT (out)
211  real, dimension(:,:,:,:), intent(in):: in
212  real, dimension(size(in,1),size(in,2),size(in,3)):: out
213  real(8):: ds(3)
214  !-----------------------------------------------------------------------------
215  out = ddxup(ds, in(:,:,:,1)) + ddyup(ds, in(:,:,:,2)) + ddzup(ds, in(:,:,:,3))
216 END FUNCTION
217 !===============================================================================
218 FUNCTION scalar_div_dn_vector (ds, in) RESULT (out)
219  real, dimension(:,:,:,:), intent(in):: in
220  real, dimension(size(in,1),size(in,2),size(in,3)):: out
221  real(8):: ds(3)
222  !-----------------------------------------------------------------------------
223  out = ddxdn(ds, in(:,:,:,1)) + ddydn(ds, in(:,:,:,2)) + ddzdn(ds, in(:,:,:,3))
224 END FUNCTION
225 !===============================================================================
226 FUNCTION scalar_minusdiv_vector (ds, in) RESULT (out)
227  real, dimension(:,:,:,:), intent(in):: in
228  real, dimension(size(in,1),size(in,2),size(in,3)):: out
229  real(8):: ds(3)
230  !-----------------------------------------------------------------------------
231  out = - ddxup(ds, in(:,:,:,1)) - ddyup(ds, in(:,:,:,2)) - ddzup(ds, in(:,:,:,3))
232 END FUNCTION
233 !===============================================================================
234 FUNCTION vector_curl_dn_vector (ds, in) RESULT (out)
235  real, dimension(:,:,:,:), intent(in):: in
236  real, dimension(size(in,1),size(in,2),size(in,3),3):: out
237  real(8):: ds(3)
238  !-----------------------------------------------------------------------------
239  out(:,:,:,1) = ddydn(ds, in(:,:,:,3)) - ddzdn(ds, in(:,:,:,2))
240  out(:,:,:,2) = ddzdn(ds, in(:,:,:,1)) - ddxdn(ds, in(:,:,:,3))
241  out(:,:,:,3) = ddxdn(ds, in(:,:,:,2)) - ddydn(ds, in(:,:,:,1))
242 END FUNCTION
243 !===============================================================================
244 FUNCTION vector_curl_up_vector (ds, in) RESULT (out)
245  real, dimension(:,:,:,:), intent(in):: in
246  real, dimension(size(in,1),size(in,2),size(in,3),3):: out
247  real(8):: ds(3)
248  !-----------------------------------------------------------------------------
249  out(:,:,:,1) = ddyup(ds, in(:,:,:,3)) - ddzup(ds, in(:,:,:,2))
250  out(:,:,:,2) = ddzup(ds, in(:,:,:,1)) - ddxup(ds, in(:,:,:,3))
251  out(:,:,:,3) = ddxup(ds, in(:,:,:,2)) - ddyup(ds, in(:,:,:,1))
252 END FUNCTION
253 !*******************************************************************************
254 END MODULE
Template module for mesh.
Definition: mesh_mod.f90:4
6th order stagger operators, with self-test procedure
Definition: stagger_2nd.f90:4