SURFEX v7.3
General documentation of Surfex
|
00001 ! ######### 00002 SUBROUTINE ZSFILTER(PZS,PMASK,KZSFILTER) 00003 ! ############################################# 00004 ! 00005 !!**** *ZSFILTER* add a Laplacian to filter orographic signal 00006 !! 00007 !! PURPOSE 00008 !! ------- 00009 !! 00010 !! METHOD 00011 !! ------ 00012 !! 00013 !! An iterative method is used, adding each time the discretized Laplacian 00014 !! to the point value. 00015 !! Note that only points where land is present are modified, taking into 00016 !! account only such points in the filtering. 00017 !! 00018 !! EXTERNAL 00019 !! -------- 00020 !! 00021 !! IMPLICIT ARGUMENTS 00022 !! ------------------ 00023 !! 00024 !! REFERENCE 00025 !! --------- 00026 !! 00027 !! AUTHOR 00028 !! ------ 00029 !! 00030 !! V. Masson Meteo-France 00031 !! 00032 !! MODIFICATION 00033 !! ------------ 00034 !! 00035 !! Original 15/03/96 00036 !! 00037 !---------------------------------------------------------------------------- 00038 ! 00039 !* 0. DECLARATION 00040 ! ----------- 00041 ! 00042 ! 00043 USE YOMHOOK ,ONLY : LHOOK, DR_HOOK 00044 USE PARKIND1 ,ONLY : JPRB 00045 ! 00046 IMPLICIT NONE 00047 ! 00048 !* 0.1 Declaration of arguments 00049 ! ------------------------ 00050 ! 00051 REAL, DIMENSION(:,:), INTENT(INOUT) :: PZS ! orography 00052 REAL, DIMENSION(:,:), INTENT(IN) :: PMASK ! where filter is applied 00053 INTEGER, INTENT(IN) :: KZSFILTER! iteration number 00054 ! 00055 !* 0.2 Declaration of local variables 00056 ! ------------------------------ 00057 ! 00058 REAL,DIMENSION(0:SIZE(PZS,1)+1,0:SIZE(PZS,2)+1) :: ZZS ! modified 00059 ! orography 00060 REAL,DIMENSION(0:SIZE(PZS,1)+1,0:SIZE(PZS,2)+1) :: ZMASK ! modified 00061 ! orography 00062 INTEGER :: JI,JJ,JITER,IIU,IJU 00063 REAL :: ZK ! filter efficiency coefficient (0.=< ZK =<1.) 00064 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00065 !---------------------------------------------------------------------------- 00066 ! 00067 !* 1. Initialisations 00068 ! --------------- 00069 ! 00070 IF (LHOOK) CALL DR_HOOK('ZSFILTER',0,ZHOOK_HANDLE) 00071 IIU=SIZE(PZS,1) 00072 IJU=SIZE(PZS,2) 00073 ZK=1. 00074 ZZS(:,:)=0. 00075 ZZS(1:IIU,1:IJU)=PZS(:,:) 00076 ZZS(0,:) =2.*ZZS(1,:) -ZZS(2,:) 00077 ZZS(IIU+1,:)=2.*ZZS(IIU,:)-ZZS(IIU-1,:) 00078 ZZS(:,0) =2.*ZZS(:,1) -ZZS(:,2) 00079 ZZS(:,IJU+1)=2.*ZZS(:,IJU)-ZZS(:,IJU-1) 00080 ZMASK(:,:)=0. 00081 ZMASK(1:IIU,1:IJU)=PMASK(:,:) 00082 ! 00083 !* 2. Iterative loop 00084 ! -------------- 00085 ! 00086 DO JITER=1,KZSFILTER 00087 DO JI=1,IIU 00088 DO JJ=1,IJU 00089 PZS(JI,JJ)= ZZS(JI,JJ) & 00090 + ZK*0.125* ZMASK(JI,JJ) & 00091 * ( ZMASK(JI-1,JJ) * ZZS(JI-1,JJ) & 00092 + ZMASK(JI+1,JJ) * ZZS(JI+1,JJ) & 00093 + ZMASK(JI,JJ-1) * ZZS(JI,JJ-1) & 00094 + ZMASK(JI,JJ+1) * ZZS(JI,JJ+1) & 00095 - ( ZMASK(JI-1,JJ) & 00096 +ZMASK(JI+1,JJ) & 00097 +ZMASK(JI,JJ-1) & 00098 +ZMASK(JI,JJ+1) ) * ZZS(JI,JJ) ) 00099 ENDDO 00100 ENDDO 00101 ZZS(1:IIU,1:IJU)=PZS(:,:) 00102 ENDDO 00103 IF (LHOOK) CALL DR_HOOK('ZSFILTER',1,ZHOOK_HANDLE) 00104 ! 00105 !------------------------------------------------------------------------------- 00106 ! 00107 END SUBROUTINE ZSFILTER