SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/average_diag.F90
Go to the documentation of this file.
00001 !     #########
00002       SUBROUTINE AVERAGE_DIAG(K2M, OSURF_BUDGET, OSURF_BUDGETC, OCOEF, OSURF_VARS,&
00003                                 PFRAC_TILE,                                       &
00004                                 PRN_TILE, PH_TILE, PLE_TILE, PLEI_TILE ,          &
00005                                 PGFLUX_TILE, PRI_TILE, PCD_TILE, PCH_TILE,        &
00006                                 PCE_TILE, PT2M_TILE, PTS_TILE, PQ2M_TILE,         &
00007                                 PHU2M_TILE, PZON10M_TILE, PMER10M_TILE,           &
00008                                 PQS_TILE, PZ0_TILE, PZ0H_TILE,                    &
00009                                 PSWD_TILE, PSWU_TILE, PSWBD_TILE, PSWBU_TILE,     &
00010                                 PLWD_TILE, PLWU_TILE, PFMU_TILE, PFMV_TILE,       &
00011                                 PRNC_TILE, PHC_TILE, PLEC_TILE, PGFLUXC_TILE,     &
00012                                 PSWDC_TILE, PSWUC_TILE, PLWDC_TILE, PLWUC_TILE,   &
00013                                 PFMUC_TILE, PFMVC_TILE, PT2M_MIN_TILE,            &
00014                                 PT2M_MAX_TILE, PLEIC_TILE,                        &
00015                                 PRN, PH, PLE, PLEI, PGFLUX, PRI, PCD, PCH, PCE,   &
00016                                 PT2M, PTS, PQ2M, PHU2M, PZON10M, PMER10M,         &
00017                                 PQS, PZ0, PZ0H, PUREF, PZREF,                     &
00018                                 PSWD, PSWU, PSWBD, PSWBU,PLWD, PLWU, PFMU, PFMV,  &
00019                                 PRNC, PHC, PLEC, PGFLUXC, PSWDC, PSWUC, PLWDC,    &
00020                                 PLWUC, PFMUC, PFMVC, PT2M_MIN, PT2M_MAX, PLEIC,   &
00021                                 PHU2M_MIN_TILE, PHU2M_MAX_TILE, PHU2M_MIN,        &
00022                                 PHU2M_MAX, PWIND10M_TILE, PWIND10M_MAX_TILE,      &
00023                                 PWIND10M, PWIND10M_MAX                            )  
00024 !     ######################################################################
00025 !
00026 !
00027 !!****  *AVERAGE_DIAG*  
00028 !!
00029 !!    PURPOSE
00030 !!    -------
00031 !      Average the fluxes from the land and water surfaces depending on the
00032 !      fraction of each surface cover type in the mesh area.
00033 !     
00034 !!**  METHOD
00035 !!    ------
00036 !
00037 !!    EXTERNAL
00038 !!    --------
00039 !!
00040 !!    IMPLICIT ARGUMENTS
00041 !!    ------------------ 
00042 !!
00043 !!      
00044 !!    REFERENCE
00045 !!    ---------
00046 !!      
00047 !!    AUTHOR
00048 !!    ------
00049 !!    V. Masson * Meteo-France-
00050 !!
00051 !!    MODIFICATIONS
00052 !!    -------------
00053 !!      Original    06/2003
00054 !!      Modified    08/2009 (B. Decharme) : new diag
00055 !     02/2010 - S. Riette - Security for wind average in case of XUNDEF values
00056 !-------------------------------------------------------------------------------
00057 !
00058 !*       0.     DECLARATIONS
00059 !               ------------
00060 !
00061 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00062 USE PARKIND1  ,ONLY : JPRB
00063 !
00064 IMPLICIT NONE
00065 !
00066 !*      0.1    declarations of arguments
00067 !
00068 INTEGER,              INTENT(IN) :: K2M          ! Flag for 2m and 10m diagnostics
00069 LOGICAL,              INTENT(IN) :: OSURF_BUDGET ! Flag for surface energy budget
00070 LOGICAL,              INTENT(IN) :: OSURF_BUDGETC! Flag for surface cumulated energy budget
00071 LOGICAL,              INTENT(IN) :: OCOEF        ! Flag for transfer coefficients
00072 LOGICAL,              INTENT(IN) :: OSURF_VARS
00073 REAL, DIMENSION(:,:), INTENT(IN) :: PFRAC_TILE   ! Fraction in a mesh-area of 
00074 !                                                ! a given surface
00075 !* fields for each tile
00076 REAL, DIMENSION(:,:), INTENT(IN) :: PRN_TILE      ! Net radiation       (W/m2)
00077 REAL, DIMENSION(:,:), INTENT(IN) :: PH_TILE       ! Sensible heat flux  (W/m2)
00078 REAL, DIMENSION(:,:), INTENT(IN) :: PLE_TILE      ! Total latent heat flux       (W/m2)
00079 REAL, DIMENSION(:,:), INTENT(IN) :: PLEI_TILE     ! Sublimation latent heat flux (W/m2)
00080 REAL, DIMENSION(:,:), INTENT(IN) :: PGFLUX_TILE   ! Storage flux        (W/m2)
00081 REAL, DIMENSION(:,:), INTENT(IN) :: PRI_TILE      ! Richardson number   (-)
00082 REAL, DIMENSION(:,:), INTENT(IN) :: PCD_TILE      ! drag coefficient for wind (W/s2)
00083 REAL, DIMENSION(:,:), INTENT(IN) :: PCH_TILE      ! drag coefficient for heat (W/s)
00084 REAL, DIMENSION(:,:), INTENT(IN) :: PCE_TILE      ! drag coefficient for evaporation (W/s/K)
00085 REAL, DIMENSION(:,:), INTENT(IN) :: PT2M_TILE     ! temperature at 2m   (K)
00086 REAL, DIMENSION(:,:), INTENT(IN) :: PTS_TILE      ! surface temperature         (K)
00087 REAL, DIMENSION(:,:), INTENT(IN) :: PT2M_MIN_TILE ! minimum temperature at 2m   (K)
00088 REAL, DIMENSION(:,:), INTENT(IN) :: PT2M_MAX_TILE ! maximum temperature at 2m   (K)
00089 REAL, DIMENSION(:,:), INTENT(IN) :: PQ2M_TILE     ! humidity at 2m      (kg/kg)
00090 REAL, DIMENSION(:,:), INTENT(IN) :: PHU2M_TILE    ! relative humidity at 2m (-)
00091 REAL, DIMENSION(:,:), INTENT(IN) :: PHU2M_MAX_TILE! maximum relative humidity at 2m (-)
00092 REAL, DIMENSION(:,:), INTENT(IN) :: PHU2M_MIN_TILE! minimum relative humidity at 2m (-)
00093 REAL, DIMENSION(:,:), INTENT(IN) :: PZON10M_TILE  ! zonal wind at 10m   (m/s)
00094 REAL, DIMENSION(:,:), INTENT(IN) :: PMER10M_TILE  ! meridian wind at 10m(m/s)
00095 REAL, DIMENSION(:,:), INTENT(IN) :: PWIND10M_TILE ! wind at 10m (m/s)
00096 REAL, DIMENSION(:,:), INTENT(IN) :: PWIND10M_MAX_TILE  ! maximum wind at 10m(m/s)
00097 REAL, DIMENSION(:,:), INTENT(IN) :: PQS_TILE
00098 REAL, DIMENSION(:,:), INTENT(IN) :: PZ0_TILE      ! roughness lenght for momentum (m)
00099 REAL, DIMENSION(:,:), INTENT(IN) :: PZ0H_TILE     ! roughness lenght for heat     (m)
00100 REAL, DIMENSION(:,:), INTENT(IN) :: PSWD_TILE     ! short wave incoming radiation (W/m2)
00101 REAL, DIMENSION(:,:), INTENT(IN) :: PSWU_TILE     ! short wave outgoing radiation (W/m2)
00102 REAL, DIMENSION(:,:,:), INTENT(IN) :: PSWBD_TILE  ! short wave incoming radiation for each spectral band (W/m2)
00103 REAL, DIMENSION(:,:,:), INTENT(IN) :: PSWBU_TILE  ! short wave outgoing radiation for each spectral band (W/m2)
00104 REAL, DIMENSION(:,:), INTENT(IN) :: PLWD_TILE     ! long wave incoming radiation (W/m2)
00105 REAL, DIMENSION(:,:), INTENT(IN) :: PLWU_TILE     ! long wave outgoing radiation (W/m2)
00106 REAL, DIMENSION(:,:), INTENT(IN) :: PFMU_TILE     ! zonal friction
00107 REAL, DIMENSION(:,:), INTENT(IN) :: PFMV_TILE     ! meridian friction
00108 REAL, DIMENSION(:,:), INTENT(IN) :: PRNC_TILE      ! Net radiation       (J/m2)
00109 REAL, DIMENSION(:,:), INTENT(IN) :: PHC_TILE       ! Sensible heat flux  (J/m2)
00110 REAL, DIMENSION(:,:), INTENT(IN) :: PLEC_TILE      ! Total latent heat flux    (J/m2)
00111 REAL, DIMENSION(:,:), INTENT(IN) :: PLEIC_TILE     ! Sublimation latent heat flux    (J/m2)
00112 REAL, DIMENSION(:,:), INTENT(IN) :: PGFLUXC_TILE   ! Storage flux        (J/m2)
00113 REAL, DIMENSION(:,:), INTENT(IN) :: PSWDC_TILE     ! short wave incoming radiation (J/m2)
00114 REAL, DIMENSION(:,:), INTENT(IN) :: PSWUC_TILE     ! short wave outgoing radiation (J/m2)
00115 REAL, DIMENSION(:,:), INTENT(IN) :: PLWDC_TILE     ! long wave incoming radiation (J/m2)
00116 REAL, DIMENSION(:,:), INTENT(IN) :: PLWUC_TILE     ! long wave outgoing radiation (J/m2)
00117 REAL, DIMENSION(:,:), INTENT(IN) :: PFMUC_TILE     ! zonal friction
00118 REAL, DIMENSION(:,:), INTENT(IN) :: PFMVC_TILE     ! meridian friction
00119 !
00120 REAL, DIMENSION(:), INTENT(IN) :: PUREF      ! reference height for wind  (m)
00121 REAL, DIMENSION(:), INTENT(IN) :: PZREF      ! reference height for T,q   (m)
00122 !
00123 !* aggregated fields
00124 REAL, DIMENSION(:), INTENT(OUT) :: PRN      ! Net radiation       (W/m2)
00125 REAL, DIMENSION(:), INTENT(OUT) :: PH       ! Sensible heat flux  (W/m2)
00126 REAL, DIMENSION(:), INTENT(OUT) :: PLE      ! Total latent heat flux    (W/m2)
00127 REAL, DIMENSION(:), INTENT(OUT) :: PLEI     ! Sublimation latent heat flux    (W/m2)
00128 REAL, DIMENSION(:), INTENT(OUT) :: PGFLUX   ! Storage flux        (W/m2)
00129 REAL, DIMENSION(:), INTENT(OUT) :: PRI      ! Richardson number   (-)
00130 REAL, DIMENSION(:), INTENT(OUT) :: PCD      ! drag coefficient for wind (W/s2)
00131 REAL, DIMENSION(:), INTENT(OUT) :: PCH      ! drag coefficient for heat (W/s)
00132 REAL, DIMENSION(:), INTENT(OUT) :: PCE      ! drag coefficient for evaporation (W/s/K)
00133 REAL, DIMENSION(:), INTENT(OUT) :: PT2M     ! temperature at 2m   (K)
00134 REAL, DIMENSION(:), INTENT(OUT) :: PTS      ! surface temperature (K)
00135 REAL, DIMENSION(:), INTENT(OUT) :: PQ2M     ! humidity at 2m      (kg/kg)
00136 REAL, DIMENSION(:), INTENT(OUT) :: PHU2M    ! relative humidity at 2m (-)
00137 REAL, DIMENSION(:), INTENT(OUT) :: PZON10M  ! zonal wind at 10m   (m/s)
00138 REAL, DIMENSION(:), INTENT(OUT) :: PMER10M  ! meridian wind at 10m(m/s)
00139 REAL, DIMENSION(:), INTENT(OUT) :: PQS
00140 REAL, DIMENSION(:), INTENT(OUT) :: PZ0      ! roughness lenght for momentum (m)
00141 REAL, DIMENSION(:), INTENT(OUT) :: PZ0H     ! roughness lenght for heat     (m)
00142 REAL, DIMENSION(:), INTENT(OUT) :: PSWD     ! short wave incoming radiation (W/m2)
00143 REAL, DIMENSION(:), INTENT(OUT) :: PSWU     ! short wave outgoing radiation (W/m2)
00144 REAL, DIMENSION(:,:), INTENT(OUT) :: PSWBD  ! short wave incoming radiation for each spectral band (W/m2)
00145 REAL, DIMENSION(:,:), INTENT(OUT) :: PSWBU  ! short wave outgoing radiation for each spectral band (W/m2)
00146 REAL, DIMENSION(:), INTENT(OUT) :: PLWD     ! long wave incoming radiation (W/m2)
00147 REAL, DIMENSION(:), INTENT(OUT) :: PLWU     ! long wave outgoing radiation (W/m2)
00148 REAL, DIMENSION(:), INTENT(OUT) :: PFMU     ! zonal friction
00149 REAL, DIMENSION(:), INTENT(OUT) :: PFMV     ! meridian friction
00150 REAL, DIMENSION(:), INTENT(OUT) :: PRNC     ! Net radiation       (J/m2)
00151 REAL, DIMENSION(:), INTENT(OUT) :: PHC      ! Sensible heat flux  (J/m2)
00152 REAL, DIMENSION(:), INTENT(OUT) :: PLEC     ! Total latent heat flux    (J/m2)
00153 REAL, DIMENSION(:), INTENT(OUT) :: PLEIC    ! Sublimation latent heat flux    (J/m2)
00154 REAL, DIMENSION(:), INTENT(OUT) :: PGFLUXC  ! Storage flux        (J/m2)
00155 REAL, DIMENSION(:), INTENT(OUT) :: PSWDC    ! incoming short wave radiation (J/m2)
00156 REAL, DIMENSION(:), INTENT(OUT) :: PSWUC    ! outgoing short wave radiation (J/m2)
00157 REAL, DIMENSION(:), INTENT(OUT) :: PLWDC    ! incoming long wave radiation (J/m2)
00158 REAL, DIMENSION(:), INTENT(OUT) :: PLWUC    ! outgoing long wave radiation (J/m2)
00159 REAL, DIMENSION(:), INTENT(OUT) :: PFMUC    ! zonal friction
00160 REAL, DIMENSION(:), INTENT(OUT) :: PFMVC    ! meridian friction
00161 !
00162 REAL, DIMENSION(:), INTENT(OUT) :: PHU2M_MIN! Minimum relative humidity at 2m (-)
00163 REAL, DIMENSION(:), INTENT(OUT) :: PHU2M_MAX! Maximum relative humidity at 2m (-)
00164 REAL, DIMENSION(:), INTENT(OUT) :: PT2M_MIN ! Minimum temperature at 2m   (K)
00165 REAL, DIMENSION(:), INTENT(OUT) :: PT2M_MAX ! Maximum temperature at 2m   (K)
00166 REAL, DIMENSION(:), INTENT(OUT) :: PWIND10M ! wind at 10m(m/s)
00167 REAL, DIMENSION(:), INTENT(OUT) :: PWIND10M_MAX ! Maximum wind at 10m(m/s)
00168 !
00169 !*      0.2    declarations of local variables
00170 !
00171 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00172 !-------------------------------------------------------------------------------
00173 !
00174 !       1.     Grid-Box average fluxes
00175 !              -----------------------
00176 !
00177 IF (LHOOK) CALL DR_HOOK('AVERAGE_DIAG',0,ZHOOK_HANDLE)
00178 !
00179 IF (OSURF_BUDGET) THEN
00180 !
00181 ! Net radiation
00182 !
00183   CALL MAKE_AVERAGE(PFRAC_TILE,PRN_TILE,PRN)
00184 !
00185 ! Sensible heat flux
00186 !
00187   CALL MAKE_AVERAGE(PFRAC_TILE,PH_TILE,PH)
00188 !
00189 ! Total latent heat flux
00190 !
00191   CALL MAKE_AVERAGE(PFRAC_TILE,PLE_TILE,PLE)
00192 !
00193 ! Sublimation latent heat flux
00194 !
00195   CALL MAKE_AVERAGE(PFRAC_TILE,PLEI_TILE,PLEI)
00196 !
00197 ! Storage flux
00198 !
00199   CALL MAKE_AVERAGE(PFRAC_TILE,PGFLUX_TILE,PGFLUX)
00200 !
00201 ! Downwards short wave radiation
00202 !
00203   CALL MAKE_AVERAGE(PFRAC_TILE,PSWD_TILE,PSWD)
00204 !
00205 ! Upwards short wave radiation
00206 !
00207   CALL MAKE_AVERAGE(PFRAC_TILE,PSWU_TILE,PSWU)
00208 !
00209 ! Downwards long wave radiation
00210 !
00211   CALL MAKE_AVERAGE(PFRAC_TILE,PLWD_TILE,PLWD)
00212 !
00213 ! Upwards long wave radiation
00214 !
00215   CALL MAKE_AVERAGE(PFRAC_TILE,PLWU_TILE,PLWU)
00216 !
00217 ! Zonal wind stress
00218 !
00219   CALL MAKE_AVERAGE(PFRAC_TILE,PFMU_TILE,PFMU)
00220 !
00221 ! Meridian wind stress
00222 !
00223   CALL MAKE_AVERAGE(PFRAC_TILE,PFMV_TILE,PFMV)
00224 !
00225 ! Downwards short wave radiation for each spectral band
00226 !
00227   CALL MAKE_AVERAGE_2D(PFRAC_TILE,PSWBD_TILE,PSWBD)
00228 !
00229 ! Upwards short wave radiation for each spectral band
00230 !
00231   CALL MAKE_AVERAGE_2D(PFRAC_TILE,PSWBU_TILE,PSWBU)
00232 !
00233 END IF
00234 !
00235 IF (OSURF_BUDGETC) THEN
00236 !
00237 ! Net radiation
00238 !
00239   CALL MAKE_AVERAGE(PFRAC_TILE,PRNC_TILE,PRNC)
00240 !
00241 ! Sensible heat flux
00242 !
00243   CALL MAKE_AVERAGE(PFRAC_TILE,PHC_TILE,PHC)
00244 !
00245 ! Total latent heat flux
00246 !
00247   CALL MAKE_AVERAGE(PFRAC_TILE,PLEC_TILE,PLEC)
00248 !
00249 ! Sublimation latent heat flux
00250 !
00251   CALL MAKE_AVERAGE(PFRAC_TILE,PLEIC_TILE,PLEIC)
00252 !
00253 ! Storage flux
00254 !
00255   CALL MAKE_AVERAGE(PFRAC_TILE,PGFLUXC_TILE,PGFLUXC)
00256 !
00257 ! Downwards short wave radiation
00258 !
00259   CALL MAKE_AVERAGE(PFRAC_TILE,PSWDC_TILE,PSWDC)
00260 !
00261 ! Upwards short wave radiation
00262 !
00263   CALL MAKE_AVERAGE(PFRAC_TILE,PSWUC_TILE,PSWUC)
00264 !
00265 ! Downwards long wave radiation
00266 !
00267   CALL MAKE_AVERAGE(PFRAC_TILE,PLWDC_TILE,PLWDC)
00268 !
00269 ! Upwards long wave radiation
00270 !
00271   CALL MAKE_AVERAGE(PFRAC_TILE,PLWUC_TILE,PLWUC)
00272 !
00273 ! Zonal wind stress
00274 !
00275   CALL MAKE_AVERAGE(PFRAC_TILE,PFMUC_TILE,PFMUC)
00276 !
00277 ! Meridian wind stress
00278 !
00279   CALL MAKE_AVERAGE(PFRAC_TILE,PFMVC_TILE,PFMVC)
00280 !
00281 END IF
00282 !
00283 !-------------------------------------------------------------------------------
00284 !
00285 !       2.     Richardson number
00286 !              -----------------
00287 !
00288 IF (K2M>=1) THEN
00289   !
00290   CALL MAKE_AVERAGE(PFRAC_TILE,PRI_TILE,PRI)
00291   !
00292 !-------------------------------------------------------------------------------
00293 !
00294 !       3.     Operational parameters at surface, 2 and 10 meters
00295 !              --------------------------------------------------
00296 !
00297 !
00298 ! Surface temperature
00299 !
00300   CALL MAKE_AVERAGE(PFRAC_TILE,PTS_TILE,PTS)
00301 !
00302 ! Temperature at 2 meters
00303 !
00304   CALL MAKE_AVERAGE(PFRAC_TILE,PT2M_TILE,PT2M)
00305   CALL MAKE_AVERAGE(PFRAC_TILE,PT2M_MIN_TILE,PT2M_MIN)
00306   CALL MAKE_AVERAGE(PFRAC_TILE,PT2M_MAX_TILE,PT2M_MAX)
00307 !
00308 ! Relative humidity at 2 meters
00309 !
00310   CALL MAKE_AVERAGE(PFRAC_TILE,PHU2M_TILE,PHU2M)
00311   CALL MAKE_AVERAGE(PFRAC_TILE,PHU2M_MIN_TILE,PHU2M_MIN)
00312   CALL MAKE_AVERAGE(PFRAC_TILE,PHU2M_MAX_TILE,PHU2M_MAX)
00313 !
00314 ! Specific humidity at 2 meters
00315 !
00316   CALL MAKE_AVERAGE(PFRAC_TILE,PQ2M_TILE,PQ2M)
00317 !
00318 ! Wind at 10 meters
00319 !
00320   CALL MAKE_AVERAGE(PFRAC_TILE,PZON10M_TILE,PZON10M)
00321 !
00322   CALL MAKE_AVERAGE(PFRAC_TILE,PMER10M_TILE,PMER10M)
00323 !
00324   CALL MAKE_AVERAGE(PFRAC_TILE,PWIND10M_TILE,PWIND10M)
00325   CALL MAKE_AVERAGE(PFRAC_TILE,PWIND10M_MAX_TILE,PWIND10M_MAX)
00326 !
00327 END IF
00328 !-------------------------------------------------------------------------------
00329 !
00330 !       4.     Transfer coeffients and roughness lengths
00331 !              -----------------------------------------
00332 !
00333 IF (OCOEF) THEN
00334 !
00335   CALL MAKE_AVERAGE(PFRAC_TILE,PCD_TILE,PCD)
00336 !
00337   CALL MAKE_AVERAGE(PFRAC_TILE,PCH_TILE,PCH)
00338 !
00339   CALL MAKE_AVERAGE(PFRAC_TILE,PCE_TILE,PCE)
00340 !
00341   CALL MAKE_AVERAGE(PFRAC_TILE,PCE_TILE,PCE)
00342 !
00343   CALL MAKE_AVERAGE_Z0(PFRAC_TILE,PUREF,PZ0_TILE,PZ0)
00344 !
00345   CALL MAKE_AVERAGE_Z0(PFRAC_TILE,PZREF,PZ0H_TILE,PZ0H)
00346 !
00347 ENDIF
00348 !
00349 IF (OSURF_VARS) THEN
00350 !
00351   CALL MAKE_AVERAGE(PFRAC_TILE,PQS_TILE,PQS)
00352 !
00353 ENDIF
00354 !
00355 IF (LHOOK) CALL DR_HOOK('AVERAGE_DIAG',1,ZHOOK_HANDLE)
00356 !
00357 CONTAINS
00358 !
00359 SUBROUTINE MAKE_AVERAGE(PFRAC,PFIELD_IN,PFIELD_OUT)
00360 !
00361 USE MODD_SURF_PAR, ONLY : XUNDEF
00362 !
00363 IMPLICIT NONE
00364 !
00365 REAL, DIMENSION(:,:),INTENT(IN)   :: PFRAC
00366 REAL, DIMENSION(:,:),INTENT(IN)   :: PFIELD_IN
00367 REAL, DIMENSION(:), INTENT(OUT) :: PFIELD_OUT
00368 LOGICAL, DIMENSION(SIZE(PFIELD_IN,1)) :: GMASK
00369 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00370 INTEGER :: JT
00371 !
00372 IF (LHOOK) CALL DR_HOOK('AVERAGE_DIAG:MAKE_AVERAGE',0,ZHOOK_HANDLE)
00373 !
00374 GMASK(:) = .TRUE.
00375 DO JT=1,SIZE(PFIELD_IN,2)
00376   WHERE (PFIELD_IN(:,JT)==XUNDEF .AND. PFRAC(:,JT)/=0.) GMASK(:) = .FALSE.
00377 END DO
00378 !
00379 PFIELD_OUT(:) = 0.
00380 DO JT=1,SIZE(PFIELD_IN,2)
00381   PFIELD_OUT(:) = PFIELD_OUT(:) + PFRAC(:,JT) * PFIELD_IN(:,JT)
00382 END DO
00383 WHERE(.NOT. GMASK(:)) PFIELD_OUT(:) = XUNDEF
00384 !
00385 IF (LHOOK) CALL DR_HOOK('AVERAGE_DIAG:MAKE_AVERAGE',1,ZHOOK_HANDLE)
00386 !
00387 END SUBROUTINE MAKE_AVERAGE
00388 !
00389 SUBROUTINE MAKE_AVERAGE_2D(PFRAC,PFIELD_IN,PFIELD_OUT)
00390 !
00391 USE MODD_SURF_PAR, ONLY : XUNDEF
00392 !
00393 IMPLICIT NONE
00394 !
00395 REAL, DIMENSION(:,:),INTENT(IN)   :: PFRAC
00396 REAL, DIMENSION(:,:,:),INTENT(IN)   :: PFIELD_IN
00397 REAL, DIMENSION(:,:), INTENT(OUT) :: PFIELD_OUT
00398 LOGICAL, DIMENSION(SIZE(PFIELD_IN,1)) :: GMASK
00399 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00400 INTEGER :: JT, JL
00401 !
00402 IF (LHOOK) CALL DR_HOOK('AVERAGE_DIAG:MAKE_AVERAGE_2D',0,ZHOOK_HANDLE)
00403 !
00404 DO JL=1,SIZE(PFIELD_IN,3)
00405   PFIELD_OUT(:,JL) = 0.
00406   GMASK(:) = .TRUE.
00407   DO JT=1,SIZE(PFIELD_IN,2)
00408     WHERE (PFIELD_IN(:,JT,JL)==XUNDEF .AND. PFRAC(:,JT)/=0.) GMASK(:) = .FALSE.
00409     PFIELD_OUT(:,JL) = PFIELD_OUT(:,JL) + PFRAC(:,JT) * PFIELD_IN(:,JT,JL)
00410   END DO
00411   WHERE(.NOT. GMASK(:)) PFIELD_OUT(:,JL) = XUNDEF
00412 END DO
00413 !
00414 IF (LHOOK) CALL DR_HOOK('AVERAGE_DIAG:MAKE_AVERAGE_2D',1,ZHOOK_HANDLE)
00415 !
00416 END SUBROUTINE MAKE_AVERAGE_2D
00417 !
00418 SUBROUTINE MAKE_AVERAGE_Z0(PFRAC,PREF,PFIELD_IN,PFIELD_OUT)
00419 !
00420 USE MODD_SURF_PAR, ONLY : XUNDEF
00421 !
00422 IMPLICIT NONE
00423 !
00424 REAL, DIMENSION(:,:),INTENT(IN)   :: PFRAC
00425 REAL, DIMENSION(:,:),INTENT(IN)   :: PFIELD_IN
00426 REAL, DIMENSION(:),INTENT(IN)   :: PREF
00427 REAL, DIMENSION(:), INTENT(OUT) :: PFIELD_OUT
00428 LOGICAL, DIMENSION(SIZE(PFIELD_IN,1)) :: GMASK
00429 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00430 INTEGER :: JT, JL
00431 !
00432 IF (LHOOK) CALL DR_HOOK('AVERAGE_DIAG:MAKE_AVERAGE_Z0',0,ZHOOK_HANDLE)
00433 !
00434 GMASK(:) = .TRUE.
00435 DO JT=1,SIZE(PFIELD_IN,2)
00436   WHERE (PFIELD_IN(:,JT)==XUNDEF .AND. PFRAC(:,JT)/=0.) GMASK(:) = .FALSE.
00437 END DO
00438 !
00439 PFIELD_OUT(:) = 0.
00440 DO JT=1,SIZE(PFIELD_IN,2)
00441   PFIELD_OUT(:) = PFIELD_OUT(:) + PFRAC(:,JT) *  1./(LOG(PREF(:)/PFIELD_IN(:,JT)))**2
00442 END DO
00443 WHERE (PFIELD_OUT(:) == 0.)
00444   PFIELD_OUT(:) = XUNDEF
00445 ELSEWHERE
00446   PFIELD_OUT(:) = PREF(:) * EXP( - SQRT(1./PFIELD_OUT(:)) )
00447 ENDWHERE
00448 WHERE(.NOT. GMASK(:)) PFIELD_OUT(:) = XUNDEF
00449 !
00450 IF (LHOOK) CALL DR_HOOK('AVERAGE_DIAG:MAKE_AVERAGE_Z0',1,ZHOOK_HANDLE)
00451 !
00452 END SUBROUTINE MAKE_AVERAGE_Z0
00453 
00454 !-------------------------------------------------------------------------------
00455 !
00456 END SUBROUTINE AVERAGE_DIAG