Skip to content
Snippets Groups Projects
Forked from Méso-NH / Méso-NH code
4300 commits behind the upstream repository.
beambroad.f90 5.34 KiB
!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
!MNH_LIC for details. version 1.
!-----------------------------------------------------------------
!--------------- special set of characters for RCS information
!-----------------------------------------------------------------
! $Source$ $Revision$ $Date$
!-----------------------------------------------------------------
!     ######spl
MODULE MODI_BEAMBROAD

  INTERFACE 
  SUBROUTINE BEAMBROAD(PDISCR,PSINGPT,PX_H,PX_V,PW_H,PW_V,OMASK)
    REAL,DIMENSION(:,:,:,:,:,:),INTENT(INOUT)  :: PDISCR  
    REAL,DIMENSION(:,:,:,:),  INTENT(OUT) :: PSINGPT
    
    REAL, DIMENSION(:),           INTENT(IN) :: PX_H ! Gaussian horizontal nodes
    REAL, DIMENSION(:),           INTENT(IN) :: PX_V ! Gaussian vertical nodes
    REAL, DIMENSION(:),           INTENT(IN) :: PW_H ! Gaussian horizontal weights
    REAL, DIMENSION(:),           INTENT(IN) :: PW_V ! Gaussian vertical weights
    LOGICAL,                      INTENT(IN) :: OMASK ! compute bins located after partial mask
  END SUBROUTINE BEAMBROAD
  END INTERFACE
  
END MODULE MODI_BEAMBROAD
!
!     ##############################################################
      SUBROUTINE BEAMBROAD(PDISCR,PSINGPT,PX_H,PX_V,PW_H,PW_V,OMASK)
!     ##############################################################
!
!!****  *BEAMBROAD * - takes into account beam broadening with range
!!
!!    PURPOSE
!!    -------
!!      The purpose of this routine is to compute variables on the beam ray from
!!    discretized pinpoint rays.
!!
!!**  METHOD
!!    ------
!!      Book2 of documentation ( routine RADAR_SIMULATOR )
!!
!!    EXTERNAL
!!    --------
!!
!!    IMPLICIT ARGUMENTS
!!    ------------------
!!      Module MODD_CST
!!      Module MODD_PARAMETERS
!!      Module MODD_RADAR 
!!
!!    REFERENCE
!!    ---------
!!      Book2 of documentation ( routine RADAR_SIMULATOR )
!!
!!    AUTHOR
!!    ------
!!      O. Caumont       * Mto-France *
!!
!!    MODIFICATIONS
!!    -------------
!!      Original    10/04/2008
!!
!-------------------------------------------------------------------------------
!
!*       0.    DECLARATIONS
!              ------------
!
USE MODD_CST       , ONLY: XPI
USE MODD_PARAMETERS, ONLY: XUNDEF
USE MODD_RADAR     , ONLY: LQUAD,NBELEV

IMPLICIT NONE
    
REAL,DIMENSION(:,:,:,:,:,:),INTENT(INOUT)  :: PDISCR  
REAL,DIMENSION(:,:,:,:),  INTENT(OUT) :: PSINGPT

REAL, DIMENSION(:),           INTENT(IN) :: PX_H ! Gaussian horizontal nodes
REAL, DIMENSION(:),           INTENT(IN) :: PX_V ! Gaussian vertical nodes
REAL, DIMENSION(:),           INTENT(IN) :: PW_H ! Gaussian horizontal weights
REAL, DIMENSION(:),           INTENT(IN) :: PW_V ! Gaussian vertical weights
LOGICAL,                      INTENT(IN) :: OMASK ! compute bins located after partial mask

INTEGER  :: JI,JL,JEL,JAZ,JH,JV ! Loop control variables
INTEGER  :: IEL
INTEGER  :: INBRAD,INPTS_H,INPTS_V ! sizes of the arrays
REAL :: ZVTEMP
    
!
!*       1.     INITIALIZATION 
!   	        --------------
INBRAD=SIZE(PDISCR,1)
INPTS_H=SIZE(PDISCR,5)
INPTS_V=SIZE(PDISCR,6)
PSINGPT(:,:,:,:)=0.

!
!*       2.     CALCULATIONS 
!   	        --------------
DO JI=1,INBRAD  
   IEL=NBELEV(JI)
   DO JEL=1,IEL  
      DO JAZ=1,SIZE(PDISCR,3) 
         DO JL=1,SIZE(PDISCR,4)
            DO JH=1,INPTS_H
               ZVTEMP=0.
               DO JV=1,INPTS_V  ! Loop on Jv
                  ! if previously underground on this beam
                  IF(JL > 1) THEN
                     IF(PDISCR(JI,JEL,JAZ,JL-1,JH,JV)==-XUNDEF.AND..NOT.OMASK) &
                     PDISCR(JI,JEL,JAZ,JL,JH,JV)=-XUNDEF
                  END IF
                  IF(PDISCR(JI,JEL,JAZ,JL,JH,JV) /= -XUNDEF.AND.ZVTEMP /= -XUNDEF) THEN
                     ! Quadrature on vertical reflectivities 
                     IF(LQUAD) THEN
                        ZVTEMP=ZVTEMP+PDISCR(JI,JEL,JAZ,JL,JH,JV)*PW_V(ABS((2*JV-INPTS_V-1)/2)+1) &
                             *EXP(-2.*LOG(2.)*PX_V(ABS((2*JV-INPTS_V-1)/2)+1)**2)
                     ELSE
                        ZVTEMP=ZVTEMP+PDISCR(JI,JEL,JAZ,JL,JH,JV)*PW_V(ABS((2*JV-INPTS_V-1)/2)+1)
                     END IF
                  ELSE
                     ZVTEMP=-XUNDEF
                  END IF
               END DO ! End loop on JV
               
               IF(ZVTEMP /= -XUNDEF .AND. PSINGPT(JI,JEL,JAZ,JL) /= -XUNDEF) THEN
                  IF(LQUAD) THEN
                     PSINGPT(JI,JEL,JAZ,JL)=PSINGPT(JI,JEL,JAZ,JL)+ZVTEMP*PW_H(ABS((2*JH-INPTS_H-1)/2)+1) &
                          *EXP(-2.*LOG(2.)*PX_H(ABS((2*JH-INPTS_H-1)/2)+1)**2)
                  ELSE
                     PSINGPT(JI,JEL,JAZ,JL)=PSINGPT(JI,JEL,JAZ,JL)+ZVTEMP*PW_H(ABS((2*JH-INPTS_H-1)/2)+1)
                  END IF
               ELSE 
                  PSINGPT(JI,JEL,JAZ,JL)=-XUNDEF
               END IF
            END DO ! End loop on JH 
                
            IF(PSINGPT(JI,JEL,JAZ,JL) /= -XUNDEF) THEN
               IF(LQUAD) THEN
                  PSINGPT(JI,JEL,JAZ,JL)=PSINGPT(JI,JEL,JAZ,JL)*2.*LOG(2.)/XPI
               ELSE
                  PSINGPT(JI,JEL,JAZ,JL)=PSINGPT(JI,JEL,JAZ,JL)/XPI! ELSE REMAINS -XUNDEF
               END IF
            END IF
            
         END DO
      END DO
   END DO
END DO

END SUBROUTINE BEAMBROAD