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    !-------------------------------------------------------------------------
29    ! [1.0]: Initialise:
30    !-------------------------------------------------------------------------  
31 
32    kz = size(rf_scale_factor)
33    
34    rf_scale_factor(:) = 0.0
35    
36    do k = 1, kz
37 
38       !-------------------------------------------------------------------------
39       ! [2.0]: Calculate RF alpha:
40       !-------------------------------------------------------------------------  
41 
42       rf_e = 0.25 * rf_passes / (rf_lengthscale(k) * rf_lengthscale(k))
43       rf_alpha(k) = 1.0 + rf_e - sqrt(rf_e * (rf_e + 2.0))
44 
45       !-------------------------------------------------------------------------
46       ! [3.0]: Calculate rescaling factor:
47       !-------------------------------------------------------------------------
48 
49       ! [3.1]: Calculate generic rescaling (normalise zero distance to 1):
50       ! For rf_passes=2 (SOAR) = 4*rf_lengthscale.
51       ! For rf_passes=infinity (Gaussian) = sqrt(8*pi)*rf_lengthscale.
52 
53       field_in(-n:n) = 0.0
54       field_in(0) = 1.0
55       field_out(-n:n) = field_in(-n:n)
56 
57       do pass = 1, rf_passes / 2
58          call da_recursive_filter_1d_adj(pass, rf_alpha(k), field_out, 2*n+1)
59       end do
60 
61       do pass = 1, rf_passes / 2
62          call da_recursive_filter_1d(pass, rf_alpha(k), field_out, 2*n+1)
63       end do
64 
65       rf_scale_factor(k) = 1.0 / field_out(0)
66 
67       ! Uncomment the following to test equivalence of UU^T and RF:
68       ! write(unit=stdout,fmt='(A,f15.5)') &
69       !    ' RF Scaling Factor = ', 1.0 / field_out(0)
70       ! field_out1(-n:n) = field_in(-n:n)
71       ! do pass = 1, rf_passes
72       !    call da_recursive_filter_1d(pass, rf_alpha(k), field_out1, 2*n+1)
73       ! end do
74 
75       ! do nn = -n, n
76       !    write(unit=stdout,fmt='(2i5,4f12.5)')k, nn, field_in(nn), &
77       !                             field_out(nn) / field_out(0), &
78       !                             field_out1(nn) / field_out1(0), &
79       !                             exp(-0.125*(real(nn)/rf_lengthscale(k))**2)
80       ! end do
81 
82    end do ! End loop over k
83    
84 end subroutine da_calculate_rf_factors
85       
86