Report Typos and Errors    
Semi-Lagrangian Library
Modular library for kinetic and gyrokinetic simulations of plasmas in fusion energy devices.
sll_m_geometry_functions.F90
Go to the documentation of this file.
2 #include "sll_working_precision.h"
3 
4 #include "sll_assert.h"
5 
6 ! use sll_splines
8  implicit none
9 
10  sll_real64, parameter :: c1_test = 0.1_f64
11  sll_real64, parameter :: c2_test = 0.1_f64
12 
13 ! type(sll_spline_2D), pointer :: spl2D_x1, spl2D_x2
14 
15 contains
16 
17  ! geometry functions should provide direct mapping, inverse mapping and
18  ! jacobian all of these should be implement following the examples using
19  ! a common name to identity on specific mapping
20 
21  ! identity function
22  !-------------------
23  ! direct mapping
24  function identity_x1(eta1, eta2)
25  sll_real64 :: identity_x1
26  sll_real64, intent(in) :: eta1
27  sll_real64, intent(in) :: eta2
28  identity_x1 = eta1
29  end function identity_x1
30 
31  function identity_x2(eta1, eta2)
32  sll_real64 :: identity_x2
33  sll_real64, intent(in) :: eta1
34  sll_real64, intent(in) :: eta2
35  identity_x2 = eta2
36  end function identity_x2
37 
38  ! inverse mapping
39  function identity_eta1(x1, x2)
40  sll_real64 :: identity_eta1
41  sll_real64, intent(in) :: x1
42  sll_real64, intent(in) :: x2
43  identity_eta1 = x1
44  end function identity_eta1
45 
46  function identity_eta2(x1, x2)
47  sll_real64 :: identity_eta2
48  sll_real64, intent(in) :: x1
49  sll_real64, intent(in) :: x2
50  identity_eta2 = x2
51  end function identity_eta2
52 
53  ! jacobian maxtrix
54  function identity_jac11(eta1, eta2)
55  sll_real64 :: identity_jac11
56  sll_real64, intent(in) :: eta1
57  sll_real64, intent(in) :: eta2
58  identity_jac11 = 1.0_f64
59  end function identity_jac11
60 
61  function identity_jac12(eta1, eta2)
62  sll_real64 :: identity_jac12
63  sll_real64, intent(in) :: eta1
64  sll_real64, intent(in) :: eta2
65  identity_jac12 = 0.0_f64
66  end function identity_jac12
67 
68  function identity_jac21(eta1, eta2)
69  sll_real64 :: identity_jac21
70  sll_real64, intent(in) :: eta1
71  sll_real64, intent(in) :: eta2
72  identity_jac21 = 0.0_f64
73  end function identity_jac21
74 
75  function identity_jac22(eta1, eta2)
76  sll_real64 :: identity_jac22
77  sll_real64, intent(in) :: eta1
78  sll_real64, intent(in) :: eta2
79  identity_jac22 = 1.0_f64
80  end function identity_jac22
81 
82  ! jacobian ie determinant of jacobian matrix
83  function identity_jac(eta1, eta2)
84  sll_real64 :: identity_jac
85  sll_real64, intent(in) :: eta1
86  sll_real64, intent(in) :: eta2
87  identity_jac = 1.0_f64
88  end function identity_jac
89 
90  ! affine function (logical mesh is [0,1]x[0,1])
91  ! x1 = (b1-a1)*eta1 + a1; x2=(b2-a2)*eta2 + a2
92  !-------------------
93 #define A1 (-1.0_f64)
94 #define B1 1.0_f64
95 #define A2 (-1.0_f64)
96 #define B2 1.0_f64
97  ! direct mapping
98  function affine_x1(eta1, eta2)
99  sll_real64 :: affine_x1
100  sll_real64, intent(in) :: eta1
101  sll_real64, intent(in) :: eta2
102  affine_x1 = (b1 - a1)*eta1 + a1
103  end function affine_x1
104 
105  function affine_x2(eta1, eta2)
106  sll_real64 :: affine_x2
107  sll_real64, intent(in) :: eta1
108  sll_real64, intent(in) :: eta2
109  affine_x2 = (b2 - a2)*eta2 + a2
110  end function affine_x2
111 
112  ! jacobian maxtrix
113  function affine_jac11(eta1, eta2)
114  sll_real64 :: affine_jac11
115  sll_real64, intent(in) :: eta1
116  sll_real64, intent(in) :: eta2
117  affine_jac11 = b1 - a1
118  end function affine_jac11
119 
120  function affine_jac12(eta1, eta2)
121  sll_real64 :: affine_jac12
122  sll_real64, intent(in) :: eta1
123  sll_real64, intent(in) :: eta2
124  affine_jac12 = 0.0_f64
125  end function affine_jac12
126 
127  function affine_jac21(eta1, eta2)
128  sll_real64 :: affine_jac21
129  sll_real64, intent(in) :: eta1
130  sll_real64, intent(in) :: eta2
131  affine_jac21 = 0.0_f64
132  end function affine_jac21
133 
134  function affine_jac22(eta1, eta2)
135  sll_real64 :: affine_jac22
136  sll_real64, intent(in) :: eta1
137  sll_real64, intent(in) :: eta2
138  affine_jac22 = b2 - a2
139  end function affine_jac22
140 
141  ! jacobian ie determinant of jacobian matrix
142  function affine_jac(eta1, eta2)
143  sll_real64 :: affine_jac
144  sll_real64, intent(in) :: eta1
145  sll_real64, intent(in) :: eta2
146  affine_jac = (b1 - a1)*(b2 - a2)
147  end function affine_jac
148 
149 #undef A1
150 #undef B1
151 #undef A2
152 #undef B2
153  ! polar coordinates (r = eta1, theta = eta2)
154  ! x1 = eta1 * cos (eta2)
155  ! x2 = eta1 * sin (eta2)
156  !-------------------
157  ! direct mapping
158  function polar_x1(eta1, eta2)
159  sll_real64 :: polar_x1
160  sll_real64, intent(in) :: eta1
161  sll_real64, intent(in) :: eta2
162  polar_x1 = eta1*cos(eta2)
163  end function polar_x1
164 
165  function polar_x2(eta1, eta2)
166  sll_real64 :: polar_x2
167  sll_real64, intent(in) :: eta1
168  sll_real64, intent(in) :: eta2
169  polar_x2 = eta1*sin(eta2)
170  end function polar_x2
171 
172  ! inverse mapping
173  function polar_eta1(x1, x2)
174  sll_real64 :: polar_eta1
175  sll_real64, intent(in) :: x1
176  sll_real64, intent(in) :: x2
177  polar_eta1 = sqrt(x1*x1 + x2*x2)
178  end function polar_eta1
179 
180  function polar_eta2(x1, x2)
181  sll_real64 :: polar_eta2
182  sll_real64, intent(in) :: x1
183  sll_real64, intent(in) :: x2
184  polar_eta2 = atan(x2/x1)
185  end function polar_eta2
186 
187  ! jacobian matrix
188  function polar_jac11(eta1, eta2)
189  sll_real64 :: polar_jac11
190  sll_real64, intent(in) :: eta1
191  sll_real64, intent(in) :: eta2
192  polar_jac11 = cos(eta2)
193  end function polar_jac11
194 
195  function polar_jac12(eta1, eta2)
196  sll_real64 :: polar_jac12
197  sll_real64, intent(in) :: eta1
198  sll_real64, intent(in) :: eta2
199  polar_jac12 = -eta1*sin(eta2)
200  end function polar_jac12
201 
202  function polar_jac21(eta1, eta2)
203  sll_real64 :: polar_jac21
204  sll_real64, intent(in) :: eta1
205  sll_real64, intent(in) :: eta2
206  polar_jac21 = sin(eta2)
207  end function polar_jac21
208 
209  function polar_jac22(eta1, eta2)
210  sll_real64 :: polar_jac22
211  sll_real64, intent(in) :: eta1
212  sll_real64, intent(in) :: eta2
213  polar_jac22 = eta1*cos(eta2)
214  end function polar_jac22
215 
216  ! jacobian ie determinant of jacobian matrix
217  function polar_jac(eta1, eta2)
218  sll_real64 :: polar_jac
219  sll_real64, intent(in) :: eta1
220  sll_real64, intent(in) :: eta2
221  polar_jac = eta1
222  end function polar_jac
223 
224  ! sinusoidal product (see P. Colella et al. JCP 230 (2011) formula
225  ! (102) p 2968)
226  ! x1 = eta1 + 0.1 * sin(2*pi*eta1) * sin(2*pi*eta2)
227  ! x2 = eta2 + 0.1 * sin(2*pi*eta1) * sin(2*pi*eta2)
228  !-------------------
229  ! direct mapping
230  function sinprod_x1(eta1, eta2)
231  sll_real64 :: sinprod_x1
232  sll_real64, intent(in) :: eta1
233  sll_real64, intent(in) :: eta2
234  sinprod_x1 = eta1 + 0.1_f64*sin(2*sll_p_pi*eta1)*sin(2*sll_p_pi*eta2)
235  end function sinprod_x1
236 
237  function sinprod_x2(eta1, eta2)
238  sll_real64 :: sinprod_x2
239  sll_real64, intent(in) :: eta1
240  sll_real64, intent(in) :: eta2
241  sinprod_x2 = eta2 + 0.1_f64*sin(2*sll_p_pi*eta1)*sin(2*sll_p_pi*eta2)
242  end function sinprod_x2
243 
244  ! inverse mapping
245  ! cannot be computed analytically in this case. Use fixed point iterations.
246  function sinprod_eta1(x1, x2)
247  sll_real64 :: sinprod_eta1
248  sll_real64, intent(in) :: x1
249  sll_real64, intent(in) :: x2
250  ! NEEDS TO BE IMPLEMENTED
251  stop 'function not implemented'
252  sinprod_eta1 = x1
253  end function sinprod_eta1
254 
255  function sinprod_eta2(x1, x2)
256  sll_real64 :: sinprod_eta2
257  sll_real64, intent(in) :: x1
258  sll_real64, intent(in) :: x2
259  ! NEEDS TO BE IMPLEMENTED
260  stop 'function not implemented'
261  sinprod_eta2 = x2
262  end function sinprod_eta2
263 
264  ! jacobian matrix
265  function sinprod_jac11(eta1, eta2)
266  sll_real64 :: sinprod_jac11
267  sll_real64, intent(in) :: eta1
268  sll_real64, intent(in) :: eta2
269  sinprod_jac11 = 1.0_f64 + 0.2_f64*sll_p_pi*cos(2*sll_p_pi*eta1)*sin(2*sll_p_pi*eta2)
270  end function sinprod_jac11
271 
272  function sinprod_jac12(eta1, eta2)
273  sll_real64 :: sinprod_jac12
274  sll_real64, intent(in) :: eta1
275  sll_real64, intent(in) :: eta2
276  sinprod_jac12 = 0.2_f64*sll_p_pi*sin(2*sll_p_pi*eta1)*cos(2*sll_p_pi*eta2)
277  end function sinprod_jac12
278 
279  function sinprod_jac21(eta1, eta2)
280  sll_real64 :: sinprod_jac21
281  sll_real64, intent(in) :: eta1
282  sll_real64, intent(in) :: eta2
283  sinprod_jac21 = 0.2_f64*sll_p_pi*cos(2*sll_p_pi*eta1)*sin(2*sll_p_pi*eta2)
284  end function sinprod_jac21
285 
286  function sinprod_jac22(eta1, eta2)
287  sll_real64 :: sinprod_jac22
288  sll_real64, intent(in) :: eta1
289  sll_real64, intent(in) :: eta2
290  sinprod_jac22 = 1.0_f64 + 0.2_f64*sll_p_pi*sin(2*sll_p_pi*eta1)*cos(2*sll_p_pi*eta2)
291  end function sinprod_jac22
292 
293  ! jacobian ie determinant of jacobian matrix
294  function sinprod_jac(eta1, eta2)
295  sll_real64 :: sinprod_jac
296  sll_real64, intent(in) :: eta1
297  sll_real64, intent(in) :: eta2
298  !sinprod_jac = 1.0_f64 + 0.2_f64 *sll_p_pi * sin (2*sll_p_pi**(eta1+eta2))
299  sinprod_jac = (1.0_f64 + 0.2_f64*sll_p_pi*cos(2*sll_p_pi*eta1)*sin(2*sll_p_pi*eta2))* &
300  (1.0_f64 + 0.2_f64*sll_p_pi*sin(2*sll_p_pi*eta1)*cos(2*sll_p_pi*eta2)) - &
301  0.2_f64*sll_p_pi*sin(2*sll_p_pi*eta1)*cos(2*sll_p_pi*eta2)* &
302  0.2_f64*sll_p_pi*cos(2*sll_p_pi*eta1)*sin(2*sll_p_pi*eta2)
303 
304  end function sinprod_jac
305 
306  ! test function
307  !-------------------
308  ! direct mapping
309  function test_x1(eta1, eta2)
310  sll_real64 :: test_x1
311  sll_real64, intent(in) :: eta1
312  sll_real64, intent(in) :: eta2
313  test_x1 = eta1 + c1_test*sin(2.0_f64*sll_p_pi*eta1)
314  !test_x1 = eta1**2
315  end function test_x1
316 
317  function test_x2(eta1, eta2)
318  sll_real64 :: test_x2
319  sll_real64, intent(in) :: eta1
320  sll_real64, intent(in) :: eta2
321  test_x2 = eta2 + c2_test*sin(2.0_f64*sll_p_pi*eta2)
322  end function test_x2
323 
324  ! inverse mapping
325  function test_eta1(x1, x2)
326  sll_real64 :: test_eta1
327  sll_real64, intent(in) :: x1
328  sll_real64, intent(in) :: x2
329  test_eta1 = x1/c1_test
330  end function test_eta1
331 
332  function test_eta2(x1, x2)
333  sll_real64 :: test_eta2
334  sll_real64, intent(in) :: x1
335  sll_real64, intent(in) :: x2
336  test_eta2 = x2/c2_test
337  end function test_eta2
338 
339  ! inverse jacobian matrix
340  function test_jac11(eta1, eta2)
341  sll_real64 :: test_jac11
342  sll_real64, intent(in) :: eta1
343  sll_real64, intent(in) :: eta2
344  test_jac11 = 1.0_f64/(1.0_f64 + 2.0_f64*sll_p_pi*c1_test*cos(2.0_f64*sll_p_pi*eta1))
345  end function test_jac11
346 
347  function test_jac12(eta1, eta2)
348  sll_real64 :: test_jac12
349  sll_real64, intent(in) :: eta1
350  sll_real64, intent(in) :: eta2
351  test_jac12 = 0.0_f64
352  end function test_jac12
353 
354  function test_jac21(eta1, eta2)
355  sll_real64 :: test_jac21
356  sll_real64, intent(in) :: eta1
357  sll_real64, intent(in) :: eta2
358  test_jac21 = 0.0_f64
359  end function test_jac21
360 
361  function test_jac22(eta1, eta2)
362  sll_real64 :: test_jac22
363  sll_real64, intent(in) :: eta1
364  sll_real64, intent(in) :: eta2
365  test_jac22 = 1.0_f64/(1.0_f64 + 2.0_f64*sll_p_pi*c2_test*cos(2.0_f64*sll_p_pi*eta2))
366  end function test_jac22
367 
368  ! jacobian ie determinant of jacobian matrix
369  function test_jac(eta1, eta2)
370  sll_real64 :: test_jac
371  sll_real64, intent(in) :: eta1
372  sll_real64, intent(in) :: eta2
373  test_jac = (1.0_f64 + 2.0_f64*sll_p_pi*c1_test*cos(2.0_f64*sll_p_pi*eta1))* &
374  (1.0_f64 + 2.0_f64*sll_p_pi*c2_test*cos(2.0_f64*sll_p_pi*eta2))
375  !test_jac = 2 * eta1!
376  end function test_jac
377 
378  ! Alternative formulation for the polar coordinate transformation:
379  !
380  ! X1 = (Rmin + (Rmax-Rmin)*eta1)*cos(2*pi*eta2)
381  ! X2 = (Rmin + (Rmax-Rmin)*eta1)*sin(2*pi*eta2)
382  !
383  ! Where eta1 and eta2 are defined in the interval [0,1]. Following are
384  ! the functions that embody this transformation. This is used for testing
385  ! purposes, hence the parameters R1 and R2 do not form part of the functions'
386  ! interfaces. This may become a limitation and should be discussed further.
387 #define R1 0.1_f64
388 #define R2 1.0_f64
389  function x1_polar_f(eta1, eta2)
390  sll_real64 :: x1_polar_f
391  sll_real64, intent(in) :: eta1, eta2
392  x1_polar_f = (r1 + (r2 - r1)*eta1)*cos(2.0_f64*sll_p_pi*eta2)
393  end function x1_polar_f
394 
395  function x2_polar_f(eta1, eta2)
396  sll_real64 :: x2_polar_f
397  sll_real64, intent(in) :: eta1, eta2
398  x2_polar_f = (r1 + (r2 - r1)*eta1)*sin(2.0_f64*sll_p_pi*eta2)
399  end function x2_polar_f
400 
401  function deriv_x1_polar_f_eta1(eta1, eta2)
402  sll_real64 :: deriv_x1_polar_f_eta1
403  sll_real64, intent(in) :: eta1, eta2
404  deriv_x1_polar_f_eta1 = (r2 - r1)*cos(2.0_f64*sll_p_pi*eta2)
405  end function deriv_x1_polar_f_eta1
406 
407  function deriv_x1_polar_f_eta2(eta1, eta2)
408  sll_real64 :: deriv_x1_polar_f_eta2
409  sll_real64, intent(in) :: eta1, eta2
410  sll_real64 :: k
411  k = 2.0_f64*sll_p_pi
412  deriv_x1_polar_f_eta2 = -(r1 + (r2 - r1)*eta1)*sin(k*eta2)*k
413  end function deriv_x1_polar_f_eta2
414 
415  function deriv_x2_polar_f_eta1(eta1, eta2)
416  sll_real64 :: deriv_x2_polar_f_eta1
417  sll_real64, intent(in) :: eta1, eta2
418  deriv_x2_polar_f_eta1 = (r2 - r1)*sin(2.0_f64*sll_p_pi*eta2)
419  end function deriv_x2_polar_f_eta1
420 
421  function deriv_x2_polar_f_eta2(eta1, eta2)
422  sll_real64 :: deriv_x2_polar_f_eta2
423  sll_real64, intent(in) :: eta1, eta2
424  sll_real64 :: k
425  k = 2.0_f64*sll_p_pi
426  deriv_x2_polar_f_eta2 = (r1 + (r2 - r1)*eta1)*cos(k*eta2)*k
427  end function deriv_x2_polar_f_eta2
428 
429  function jacobian_polar_f(eta1, eta2) result(jac)
430  sll_real64 :: jac
431  sll_real64, intent(in) :: eta1, eta2
432  jac = 2.0_f64*sll_p_pi*(r1 + (r2 - r1)*eta1)*(r2 - r1)
433  end function jacobian_polar_f
434 
435  function deriv1_jacobian_polar_f() result(deriv)
436  sll_real64 :: deriv
437  deriv = 2.0_f64*sll_p_pi*(r2 - r1)**2
438  end function deriv1_jacobian_polar_f
439 
440 #undef R1
441 #undef R2
442 
443  function zero_function(eta1, eta2)
444  sll_real64, intent(in) :: eta1, eta2
445  sll_real64 :: zero_function
446  zero_function = 0.0_f64
447  end function zero_function
448 
449  !************************************************************************
450  ! 1D maps
451  !************************************************************************
452 
453 #define A (-1.0_f64)
454 #define B 1.0_f64
455 
456  function linear_map_f(eta) result(val)
457  sll_real64 :: val
458  sll_real64, intent(in) :: eta
459  val = (b - a)*eta + a
460  end function linear_map_f
461 
462  function linear_map_jac_f(eta) result(val)
463  sll_real64 :: val
464  sll_real64, intent(in) :: eta
465  val = (b - a)
466  end function linear_map_jac_f
467 
468 #undef A
469 #undef B
470 
471 #define A 0.0_f64
472 #define B 6.2831853071795862_f64
473 
474  function linear_map_poisson_f(eta) result(val)
475  sll_real64 :: val
476  sll_real64, intent(in) :: eta
477  val = (b - a)*eta + a
478  end function linear_map_poisson_f
479 
480  function linear_map_poisson_jac_f(eta) result(val)
481  sll_real64 :: val
482  sll_real64, intent(in) :: eta
483  val = (b - a)
484  end function linear_map_poisson_jac_f
485 
486 #undef A
487 #undef B
488 
489 end module sll_m_geometry_functions
490 
Fortran module where set some physical and mathematical constants.
real(kind=f64), parameter, public sll_p_pi
real(kind=f64) function affine_jac(eta1, eta2)
real(kind=f64) function affine_jac21(eta1, eta2)
real(kind=f64) function sinprod_jac12(eta1, eta2)
real(kind=f64) function test_jac(eta1, eta2)
real(kind=f64) function identity_jac11(eta1, eta2)
real(kind=f64) function sinprod_jac21(eta1, eta2)
real(kind=f64) function test_eta2(x1, x2)
real(kind=f64) function identity_eta2(x1, x2)
function deriv_x1_polar_f_eta2(eta1, eta2)
real(kind=f64) function identity_jac22(eta1, eta2)
real(kind=f64), parameter c2_test
real(kind=f64) function test_x1(eta1, eta2)
real(kind=f64) function polar_jac22(eta1, eta2)
real(kind=f64) function sinprod_jac22(eta1, eta2)
real(kind=f64) function affine_jac12(eta1, eta2)
real(kind=f64) function sinprod_jac(eta1, eta2)
real(kind=f64) function identity_jac(eta1, eta2)
real(kind=f64) function polar_jac12(eta1, eta2)
real(kind=f64) function sinprod_eta1(x1, x2)
real(kind=f64) function affine_jac22(eta1, eta2)
real(kind=f64) function test_jac22(eta1, eta2)
real(kind=f64) function test_jac21(eta1, eta2)
real(kind=f64) function identity_eta1(x1, x2)
real(kind=f64) function identity_jac21(eta1, eta2)
real(kind=f64) function affine_x2(eta1, eta2)
real(kind=f64) function test_x2(eta1, eta2)
real(kind=f64) function identity_jac12(eta1, eta2)
real(kind=f64) function affine_x1(eta1, eta2)
function deriv_x2_polar_f_eta2(eta1, eta2)
real(kind=f64) function polar_eta1(x1, x2)
real(kind=f64) function sinprod_x1(eta1, eta2)
real(kind=f64) function sinprod_x2(eta1, eta2)
real(kind=f64), parameter c1_test
real(kind=f64) function test_eta1(x1, x2)
real(kind=f64) function test_jac12(eta1, eta2)
real(kind=f64) function polar_jac(eta1, eta2)
real(kind=f64) function test_jac11(eta1, eta2)
real(kind=f64) function polar_eta2(x1, x2)
real(kind=f64) function identity_x1(eta1, eta2)
real(kind=f64) function polar_jac11(eta1, eta2)
real(kind=f64) function affine_jac11(eta1, eta2)
real(kind=f64) function identity_x2(eta1, eta2)
real(kind=f64) function polar_x1(eta1, eta2)
real(kind=f64) function polar_jac21(eta1, eta2)
real(kind=f64) function sinprod_jac11(eta1, eta2)
real(kind=f64) function sinprod_eta2(x1, x2)
function deriv_x2_polar_f_eta1(eta1, eta2)
real(kind=f64) function polar_x2(eta1, eta2)
function deriv_x1_polar_f_eta1(eta1, eta2)
    Report Typos and Errors