da_calculate_rf_factors.inc
References to this file elsewhere.
1 subroutine da_calculate_rf_factors (rf_lengthscale, rf_alpha, rf_scale_factor)
2
3 !---------------------------------------------------------------------------
4 ! Purpose: Calculate:
5 ! 1) Alpha value for recursive filter.
6 ! 2) Turning conditions appropriate for B=UU^T RF.
7 ! 3) Generic (depends only on rf_passes) rescaling factor.
8 ! 4) Grid-dependent (hopefully temporary) scaling factor - removed.
9 !---------------------------------------------------------------------------
10
11 implicit none
12
13 real, intent(in) :: rf_lengthscale(:) ! Non-dim. R.F. lengthscale.
14 real, intent(out) :: rf_alpha(:) ! RF alpha factor.
15 real, intent(out) :: rf_scale_factor(:) ! Variance scaling factor.
16
17 integer, parameter :: n = 500 ! 2n +1 = # pts in delta func.
18 integer :: kz ! 3rd array dimension.
19 integer :: pass ! Pass of recursive filter.
20 integer :: k ! Loop counter
21 ! integer :: nn ! Loop counter
22
23 real :: rf_e ! RF E factor.
24
25 real, dimension(-n:n) :: field_in, field_out ! Working field.
26 ! real, dimension(-n:n) :: field_out1 ! Working field.
27
28 if (trace_use_dull) call da_trace_entry("da_calculate_rf_factors")
29
30 !-------------------------------------------------------------------------
31 ! [1.0]: Initialise:
32 !-------------------------------------------------------------------------
33
34 kz = size(rf_scale_factor)
35
36 rf_scale_factor(:) = 0.0
37
38 do k = 1, kz
39
40 !-------------------------------------------------------------------------
41 ! [2.0]: Calculate RF alpha:
42 !-------------------------------------------------------------------------
43
44 rf_e = 0.25 * rf_passes / (rf_lengthscale(k) * rf_lengthscale(k))
45 rf_alpha(k) = 1.0 + rf_e - sqrt(rf_e * (rf_e + 2.0))
46
47 !-------------------------------------------------------------------------
48 ! [3.0]: Calculate rescaling factor:
49 !-------------------------------------------------------------------------
50
51 ! [3.1]: Calculate generic rescaling (normalise zero distance to 1):
52 ! For rf_passes=2 (SOAR) = 4*rf_lengthscale.
53 ! For rf_passes=infinity (Gaussian) = sqrt(8*pi)*rf_lengthscale.
54
55 field_in(-n:n) = 0.0
56 field_in(0) = 1.0
57 field_out(-n:n) = field_in(-n:n)
58
59 do pass = 1, rf_passes / 2
60 call da_recursive_filter_1d_adj(pass, rf_alpha(k), field_out, 2*n+1)
61 end do
62
63 do pass = 1, rf_passes / 2
64 call da_recursive_filter_1d(pass, rf_alpha(k), field_out, 2*n+1)
65 end do
66
67 rf_scale_factor(k) = 1.0 / field_out(0)
68
69 ! Uncomment the following to test equivalence of UU^T and RF:
70 ! write(unit=stdout,fmt='(A,f15.5)') &
71 ! ' RF Scaling Factor = ', 1.0 / field_out(0)
72 ! field_out1(-n:n) = field_in(-n:n)
73 ! do pass = 1, rf_passes
74 ! call da_recursive_filter_1d(pass, rf_alpha(k), field_out1, 2*n+1)
75 ! end do
76
77 ! do nn = -n, n
78 ! write(unit=stdout,fmt='(2i5,4f12.5)')k, nn, field_in(nn), &
79 ! field_out(nn) / field_out(0), &
80 ! field_out1(nn) / field_out1(0), &
81 ! exp(-0.125*(real(nn)/rf_lengthscale(k))**2)
82 ! end do
83
84 end do ! End loop over k
85
86 if (trace_use_dull) call da_trace_exit("da_calculate_rf_factors")
87
88 end subroutine da_calculate_rf_factors
89
90