V3FIT
smooth1.f
1  SUBROUTINE smooth1(ya, n1, n2, wk, frac)
2 C-----------------------------------------------
3 C M o d u l e s
4 C-----------------------------------------------
5  USE parambs
6  USE vmec0
7  IMPLICIT NONE
8 C-----------------------------------------------
9 C D u m m y A r g u m e n t s
10 C-----------------------------------------------
11  INTEGER n1, n2
12  REAL(rprec) frac
13  REAL(rprec), DIMENSION(*) :: ya, wk
14 C-----------------------------------------------
15 C L o c a l P a r a m e t e r s
16 C-----------------------------------------------
17  REAL(rprec), PARAMETER :: zero = 0, one = 1
18 C-----------------------------------------------
19 C L o c a l V a r i a b l e s
20 C-----------------------------------------------
21  INTEGER :: n11, n21, n, i
22  REAL(rprec) :: as, a, a1, a2, a3
23 C-----------------------------------------------
24 c--
25 c smoothing REAL array ya(*) for i: n1.le.i.le.n2
26 c frac - defines how strong is smoothing;
27 c IF frac=0 THEN ONLY smoothes the peaks
28 c--
29  n11 = n1 + 1
30  n21 = n2 - 1
31  n = n21 - n11
32  IF (n .le. 0) RETURN !too little number of points
33 c
34 c- check the edges
35 c
36  as = sum(abs(ya(n11:n21-1)-ya(n11+1:n21)))
37  as = as/n
38 c
39  IF (as .le. zero) THEN
40  ya(n1) = ya(n11)
41  ya(n2) = ya(n21)
42  RETURN
43  ELSE
44  a = 3*(as + abs(ya(n11)-ya(n11+1)))
45  a1 = abs(ya(n1)-ya(n11))
46  IF (a1 > a) ya(n1) = 2*ya(n11) - ya(n11+1)
47  a = 3*(as + abs(ya(n21)-ya(n21-1)))
48  a1 = abs(ya(n2)-ya(n21))
49  IF (a1 > a) ya(n2) = 2*ya(n21) - ya(n21-1)
50  ENDIF
51 c
52 c- work array
53 c
54  wk(n1:n2) = ya(n1:n2)
55 c
56 c- check for strong peaks and remove
57 c
58  DO i = n11, n21
59  a1 = .5_dp*(ya(i+1)+ya(i-1))
60  a2 = 3*abs(ya(i+1)-ya(i-1))
61  a3 = abs(ya(i)-a1)
62  IF (a3 > a2) ya(i) = a1
63  END DO
64 c
65 c- smoothing with a factor frac
66 c
67  IF (frac .le. zero) RETURN
68  ya(n11:n21) =(ya(n11:n21)+.5_dp*(wk(n11+1:n21+1)+wk(n11-1:n21-1))*
69  1 frac)/(one + frac)
70 
71  END SUBROUTINE smooth1