SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
zsfilter.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
5 ! #########
6  SUBROUTINE zsfilter(PZS,PMASK,KZSFILTER)
7 ! #############################################
8 !
9 !!**** *ZSFILTER* add a Laplacian to filter orographic signal
10 !!
11 !! PURPOSE
12 !! -------
13 !!
14 !! METHOD
15 !! ------
16 !!
17 !! An iterative method is used, adding each time the discretized Laplacian
18 !! to the point value.
19 !! Note that only points where land is present are modified, taking into
20 !! account only such points in the filtering.
21 !!
22 !! EXTERNAL
23 !! --------
24 !!
25 !! IMPLICIT ARGUMENTS
26 !! ------------------
27 !!
28 !! REFERENCE
29 !! ---------
30 !!
31 !! AUTHOR
32 !! ------
33 !!
34 !! V. Masson Meteo-France
35 !!
36 !! MODIFICATION
37 !! ------------
38 !!
39 !! Original 15/03/96
40 !!
41 !----------------------------------------------------------------------------
42 !
43 !* 0. DECLARATION
44 ! -----------
45 !
46 !
47 USE yomhook ,ONLY : lhook, dr_hook
48 USE parkind1 ,ONLY : jprb
49 !
50 IMPLICIT NONE
51 !
52 !* 0.1 Declaration of arguments
53 ! ------------------------
54 !
55 REAL, DIMENSION(:,:), INTENT(INOUT) :: pzs ! orography
56 REAL, DIMENSION(:,:), INTENT(IN) :: pmask ! where filter is applied
57 INTEGER, INTENT(IN) :: kzsfilter! iteration number
58 !
59 !* 0.2 Declaration of local variables
60 ! ------------------------------
61 !
62 REAL,DIMENSION(0:SIZE(PZS,1)+1,0:SIZE(PZS,2)+1) :: zzs ! modified
63  ! orography
64 REAL,DIMENSION(0:SIZE(PZS,1)+1,0:SIZE(PZS,2)+1) :: zmask ! modified
65  ! orography
66 INTEGER :: ji,jj,jiter,iiu,iju
67 REAL :: zk ! filter efficiency coefficient (0.=< ZK =<1.)
68 REAL(KIND=JPRB) :: zhook_handle
69 !----------------------------------------------------------------------------
70 !
71 !* 1. Initialisations
72 ! ---------------
73 !
74 IF (lhook) CALL dr_hook('ZSFILTER',0,zhook_handle)
75 iiu=SIZE(pzs,1)
76 iju=SIZE(pzs,2)
77 zk=1.
78 zzs(:,:)=0.
79 zzs(1:iiu,1:iju)=pzs(:,:)
80 zzs(0,:) =2.*zzs(1,:) -zzs(2,:)
81 zzs(iiu+1,:)=2.*zzs(iiu,:)-zzs(iiu-1,:)
82 zzs(:,0) =2.*zzs(:,1) -zzs(:,2)
83 zzs(:,iju+1)=2.*zzs(:,iju)-zzs(:,iju-1)
84 zmask(:,:)=0.
85 zmask(1:iiu,1:iju)=pmask(:,:)
86 !
87 !* 2. Iterative loop
88 ! --------------
89 !
90 DO jiter=1,kzsfilter
91  DO ji=1,iiu
92  DO jj=1,iju
93  pzs(ji,jj)= zzs(ji,jj) &
94  + zk*0.125* zmask(ji,jj) &
95  * ( zmask(ji-1,jj) * zzs(ji-1,jj) &
96  + zmask(ji+1,jj) * zzs(ji+1,jj) &
97  + zmask(ji,jj-1) * zzs(ji,jj-1) &
98  + zmask(ji,jj+1) * zzs(ji,jj+1) &
99  - ( zmask(ji-1,jj) &
100  +zmask(ji+1,jj) &
101  +zmask(ji,jj-1) &
102  +zmask(ji,jj+1) ) * zzs(ji,jj) )
103  ENDDO
104  ENDDO
105  zzs(1:iiu,1:iju)=pzs(:,:)
106 ENDDO
107 IF (lhook) CALL dr_hook('ZSFILTER',1,zhook_handle)
108 !
109 !-------------------------------------------------------------------------------
110 !
111 END SUBROUTINE zsfilter
subroutine zsfilter(PZS, PMASK, KZSFILTER)
Definition: zsfilter.F90:6