Skip to content
Snippets Groups Projects
Commit ae50524e authored by WAUTELET Philippe's avatar WAUTELET Philippe
Browse files

Philippe 08/04/2022: stations: add position and interpolation coefficients in TSTATIONDATA type

parent 30f5984c
No related branches found
No related tags found
No related merge requests found
...@@ -262,6 +262,8 @@ END SUBROUTINE ALLOCATE_STATION_n ...@@ -262,6 +262,8 @@ END SUBROUTINE ALLOCATE_STATION_n
!---------------------------------------------------------------------------- !----------------------------------------------------------------------------
SUBROUTINE INI_INTERP_STATION_n() SUBROUTINE INI_INTERP_STATION_n()
! !
USE MODE_STATION_TOOLS, ONLY: STATION_POSITION
INTEGER :: JII INTEGER :: JII
INTEGER :: IIU, IJU INTEGER :: IIU, IJU
! !
...@@ -271,6 +273,7 @@ IF ( ALL(TSTATIONS(:)%XLAT /= XUNDEF) .AND. ALL(TSTATIONS(:)%XLON /= XUNDEF) ) T ...@@ -271,6 +273,7 @@ IF ( ALL(TSTATIONS(:)%XLAT /= XUNDEF) .AND. ALL(TSTATIONS(:)%XLON /= XUNDEF) ) T
CALL SM_XYHAT(PLATOR,PLONOR, & CALL SM_XYHAT(PLATOR,PLONOR, &
TSTATIONS(JII)%XLAT, TSTATIONS(JII)%XLON, & TSTATIONS(JII)%XLAT, TSTATIONS(JII)%XLON, &
TSTATIONS(JII)%XX, TSTATIONS(JII)%XY ) TSTATIONS(JII)%XX, TSTATIONS(JII)%XY )
CALL STATION_POSITION( TSTATIONS(JII) )
END DO END DO
ELSE ELSE
CMNHMSG(1) = 'Error in station position' CMNHMSG(1) = 'Error in station position'
......
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
! ------------ ! ------------
! !
use modd_type_date, only: date_time use modd_type_date, only: date_time
use modd_parameters, only: NUNDEF, XUNDEF use modd_parameters, only: NNEGUNDEF, NUNDEF, XUNDEF
implicit none implicit none
...@@ -57,6 +57,7 @@ TYPE TSTATIONDATA ...@@ -57,6 +57,7 @@ TYPE TSTATIONDATA
CHARACTER(LEN=8) :: CNAME = '' ! station name CHARACTER(LEN=8) :: CNAME = '' ! station name
CHARACTER(LEN=8) :: CTYPE = '' ! station type (currently not used) CHARACTER(LEN=8) :: CTYPE = '' ! station type (currently not used)
LOGICAL :: LERROR = .FALSE. ! LOGICAL :: LERROR = .FALSE. !
LOGICAL :: LPRESENT = .FALSE. ! If true, this station is situated on this process
REAL :: XX = XUNDEF ! X(n) REAL :: XX = XUNDEF ! X(n)
REAL :: XY = XUNDEF ! Y(n) REAL :: XY = XUNDEF ! Y(n)
...@@ -65,6 +66,18 @@ REAL :: XLON = XUNDEF ! longitude(n) ...@@ -65,6 +66,18 @@ REAL :: XLON = XUNDEF ! longitude(n)
REAL :: XLAT = XUNDEF ! latitude (n) REAL :: XLAT = XUNDEF ! latitude (n)
REAL :: XZS = XUNDEF ! zs(n) REAL :: XZS = XUNDEF ! zs(n)
! Position in the mesh
INTEGER :: NI_M = NNEGUNDEF ! X position for mass-point axis (between this one and the next one)
INTEGER :: NJ_M = NNEGUNDEF ! Y position for mass-point axis (between this one and the next one)
INTEGER :: NI_U = NNEGUNDEF ! X position for u-point axis (between this one and the next one)
INTEGER :: NJ_V = NNEGUNDEF ! Y position for v-point axis (between this one and the next one)
! Coefficient to interpolate values (stations are usually not exactly on mesh points)
REAL :: XXMCOEF = XUNDEF ! Interpolation coefficient for X (mass-point)
REAL :: XYMCOEF = XUNDEF ! Interpolation coefficient for Y (mass-point)
REAL :: XXUCOEF = XUNDEF ! Interpolation coefficient for X (U-point)
REAL :: XYVCOEF = XUNDEF ! Interpolation coefficient for Y (V-point)
INTEGER :: NK = NUNDEF ! Model level for altitude comparisons INTEGER :: NK = NUNDEF ! Model level for altitude comparisons
REAL, DIMENSION(:), ALLOCATABLE :: XZON ! zonal wind(n) REAL, DIMENSION(:), ALLOCATABLE :: XZON ! zonal wind(n)
......
!MNH_LIC Copyright 2022-2022 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.
!-----------------------------------------------------------------
! Author:
! P. Wautelet 08/04/2022
!-----------------------------------------------------------------
! Modifications:
!-----------------------------------------------------------------
! ##################
MODULE MODE_STATION_TOOLS
! ##################
IMPLICIT NONE
PRIVATE
PUBLIC :: STATION_POSITION
CONTAINS
! ######################################
SUBROUTINE STATION_POSITION( TPSTATION )
! ######################################
! Subroutine to determine the position of a station on the model grid
! and set the useful coefficient for data interpolation
USE MODD_CONF, ONLY: L1D
USE MODD_GRID_n, ONLY: XXHAT, XYHAT
USE MODD_TYPE_STATION, ONLY: TSTATIONDATA
USE MODE_TOOLS_ll, ONLY: GET_INDICE_ll, LWEST_ll, LEAST_ll, LNORTH_ll, LSOUTH_ll
IMPLICIT NONE
TYPE(TSTATIONDATA), INTENT(INOUT) :: TPSTATION
INTEGER :: IIB ! domain sizes of current process
INTEGER :: IJB !
INTEGER :: IIE !
INTEGER :: IJE !
INTEGER :: IIU !
INTEGER :: IJU !
REAL, DIMENSION(SIZE(XXHAT)) :: ZXHATM ! mass point coordinates
REAL, DIMENSION(SIZE(XYHAT)) :: ZYHATM ! mass point coordinates
IIU = SIZE( XXHAT )
IJU = SIZE( XYHAT )
CALL GET_INDICE_ll (IIB, IJB, IIE, IJE )
! Interpolations of model variables to mass points
ZXHATM(1:IIU-1) = 0.5 * XXHAT(1:IIU-1) + 0.5 * XXHAT(2:IIU )
ZXHATM( IIU ) = 1.5 * XXHAT( IIU ) - 0.5 * XXHAT( IIU-1)
ZYHATM(1:IJU-1) = 0.5 * XYHAT(1:IJU-1) + 0.5 * XYHAT(2:IJU )
ZYHATM( IJU ) = 1.5 * XYHAT( IJU ) - 0.5 * XYHAT( IJU-1)
TPSTATION%LPRESENT = .FALSE.
! X position
TPSTATION%NI_U = COUNT( XXHAT (:) <= TPSTATION%XX )
TPSTATION%NI_M = COUNT( ZXHATM(:) <= TPSTATION%XX )
IF ( TPSTATION%NI_M<=IIB-1 .AND. LWEST_ll() .AND. .NOT. L1D ) TPSTATION%LERROR = .TRUE.
IF ( TPSTATION%NI_M>=IIE .AND. LEAST_ll() .AND. .NOT. L1D ) TPSTATION%LERROR = .TRUE.
! Y position
TPSTATION%NJ_V = COUNT( XYHAT (:) <= TPSTATION%XY )
TPSTATION%NJ_M = COUNT( ZYHATM(:) <= TPSTATION%XY )
IF ( TPSTATION%NJ_M<=IJB-1 .AND. LSOUTH_ll() .AND. .NOT. L1D ) TPSTATION%LERROR = .TRUE.
IF ( TPSTATION%NJ_M>=IJE .AND. LNORTH_ll() .AND. .NOT. L1D ) TPSTATION%LERROR = .TRUE.
! Position of station according to processes
IF ( TPSTATION%NI_U >= IIB .AND. TPSTATION%NI_U <= IIE &
.AND. TPSTATION%NJ_V >= IJB .AND. TPSTATION%NJ_V <= IJE ) TPSTATION%LPRESENT = .TRUE.
IF ( L1D ) TPSTATION%LPRESENT = .TRUE.
! Computations only on correct process
IF ( TPSTATION%LPRESENT .AND. .NOT. L1D ) THEN
! Interpolation coefficient for X (mass-point)
TPSTATION%XXMCOEF = ( TPSTATION%XX - ZXHATM(TPSTATION%NI_M) ) / ( ZXHATM(TPSTATION%NI_M+1) - ZXHATM(TPSTATION%NI_M) )
! Interpolation coefficient for Y (mass-point)
TPSTATION%XYMCOEF = ( TPSTATION%XY - ZYHATM(TPSTATION%NJ_M) ) / ( ZYHATM(TPSTATION%NJ_M+1) - ZYHATM(TPSTATION%NJ_M) )
! Interpolation coefficient for X (U-point)
TPSTATION%XXUCOEF = ( TPSTATION%XX - XXHAT(TPSTATION%NI_U) ) / ( XXHAT(TPSTATION%NI_U+1) - XXHAT(TPSTATION%NI_U) )
! Interpolation coefficient for Y (V-point)
TPSTATION%XYVCOEF = ( TPSTATION%XY - XYHAT(TPSTATION%NJ_V) ) / ( XYHAT(TPSTATION%NJ_V+1) - XYHAT(TPSTATION%NJ_V) )
END IF
END SUBROUTINE STATION_POSITION
END MODULE MODE_STATION_TOOLS
...@@ -152,7 +152,6 @@ REAL :: ZU_STAT ! horizontal wind speed at station location (along x) ...@@ -152,7 +152,6 @@ REAL :: ZU_STAT ! horizontal wind speed at station location (along x)
REAL :: ZV_STAT ! horizontal wind speed at station location (along y) REAL :: ZV_STAT ! horizontal wind speed at station location (along y)
REAL :: ZGAM ! rotation between meso-nh base and spherical lat-lon base. REAL :: ZGAM ! rotation between meso-nh base and spherical lat-lon base.
! !
INTEGER :: IINFO_ll ! return code
INTEGER :: IRESP ! return code INTEGER :: IRESP ! return code
INTEGER :: I ! loop for stations INTEGER :: I ! loop for stations
INTEGER :: J ! loop for levels INTEGER :: J ! loop for levels
...@@ -318,7 +317,7 @@ END IF ...@@ -318,7 +317,7 @@ END IF
IF (GSTORE) THEN IF (GSTORE) THEN
DO I=1,NUMBSTAT DO I=1,NUMBSTAT
! !
IF ((ZTHIS_PROCS(I)==1.).AND.(.NOT. TSTATIONS(I)%LERROR)) THEN IF ( TSTATIONS(I)%LPRESENT .AND. .NOT. TSTATIONS(I)%LERROR ) THEN
IF (TSTATIONS(I)%NK/= XUNDEF) THEN IF (TSTATIONS(I)%NK/= XUNDEF) THEN
J = TSTATIONS(I)%NK J = TSTATIONS(I)%NK
ELSE ! suppose TSTATIONS(I)%XZ /= XUNDEF ELSE ! suppose TSTATIONS(I)%XZ /= XUNDEF
...@@ -461,17 +460,17 @@ ELSEIF (L1D) THEN ...@@ -461,17 +460,17 @@ ELSEIF (L1D) THEN
JI=2 JI=2
JJ=2 JJ=2
ELSE ELSE
JI=II(I) JI=TSTATIONS(I)%NI_M
JJ=IJ(I) JJ=TSTATIONS(I)%NJ_M
END IF END IF
! !
! !
IF ((JI .GE. 1).AND. (JI .LE. SIZE(PA,1)) .AND. & IF ((JI .GE. 1).AND. (JI .LE. SIZE(PA,1)) .AND. &
(JJ .GE. 1).AND. (JJ .LE. SIZE(PA,2))) & (JJ .GE. 1).AND. (JJ .LE. SIZE(PA,2))) &
PB = (1.-ZYCOEF(I)) * (1.-ZXCOEF(I)) * PA(JI,JJ) + & PB = (1.-TSTATIONS(I)%XYMCOEF) * (1.-TSTATIONS(I)%XXMCOEF) * PA(JI,JJ) + &
(1.-ZYCOEF(I)) * (ZXCOEF(I)) * PA(JI+1,JJ) + & (1.-TSTATIONS(I)%XYMCOEF) * (TSTATIONS(I)%XXMCOEF) * PA(JI+1,JJ) + &
( ZYCOEF(I)) * (1.-ZXCOEF(I)) * PA(JI,JJ+1) + & ( TSTATIONS(I)%XYMCOEF) * (1.-TSTATIONS(I)%XXMCOEF) * PA(JI,JJ+1) + &
( ZYCOEF(I)) * (ZXCOEF(I)) * PA(JI+1,JJ+1) ( TSTATIONS(I)%XYMCOEF) * (TSTATIONS(I)%XXMCOEF) * PA(JI+1,JJ+1)
! !
END FUNCTION STATION_INTERP_2D END FUNCTION STATION_INTERP_2D
!---------------------------------------------------------------------------- !----------------------------------------------------------------------------
...@@ -491,16 +490,16 @@ ELSEIF (L1D) THEN ...@@ -491,16 +490,16 @@ ELSEIF (L1D) THEN
JI=2 JI=2
JJ=2 JJ=2
ELSE ELSE
JI=II(I) JI=TSTATIONS(I)%NI_M
JJ=IJ(I) JJ=TSTATIONS(I)%NJ_M
END IF END IF
! !
IF ((JI .GE. 1).AND. (JI .LE. SIZE(PA,1)) .AND. & IF ((JI .GE. 1).AND. (JI .LE. SIZE(PA,1)) .AND. &
(JJ .GE. 1).AND. (JJ .LE. SIZE(PA,2))) & (JJ .GE. 1).AND. (JJ .LE. SIZE(PA,2))) &
PB = (1.- ZYCOEF(I)) * (1.-ZUCOEF(I)) * PA(JI ,JJ ) & PB = (1.- TSTATIONS(I)%XYMCOEF) * (1.-TSTATIONS(I)%XXUCOEF) * PA(JI ,JJ ) &
+ (1.- ZYCOEF(I)) * ( ZUCOEF(I)) * PA(JI+1,JJ ) & + (1.- TSTATIONS(I)%XYMCOEF) * ( TSTATIONS(I)%XXUCOEF) * PA(JI+1,JJ ) &
+ ( ZYCOEF(I)) * (1.-ZUCOEF(I)) * PA(JI ,JJ+1) & + ( TSTATIONS(I)%XYMCOEF) * (1.-TSTATIONS(I)%XXUCOEF) * PA(JI ,JJ+1) &
+ ( ZYCOEF(I)) * ( ZUCOEF(I)) * PA(JI+1,JJ+1) + ( TSTATIONS(I)%XYMCOEF) * ( TSTATIONS(I)%XXUCOEF) * PA(JI+1,JJ+1)
! !
END FUNCTION STATION_INTERP_2D_U END FUNCTION STATION_INTERP_2D_U
!---------------------------------------------------------------------------- !----------------------------------------------------------------------------
...@@ -520,16 +519,16 @@ ELSEIF (L1D) THEN ...@@ -520,16 +519,16 @@ ELSEIF (L1D) THEN
JI=2 JI=2
JJ=2 JJ=2
ELSE ELSE
JI=II(I) JI=TSTATIONS(I)%NI_M
JJ=IJ(I) JJ=TSTATIONS(I)%NJ_M
END IF END IF
! !
IF ((JI .GT. 0).AND. (JI .LT. SIZE(PA,1)) .AND. & IF ((JI .GT. 0).AND. (JI .LT. SIZE(PA,1)) .AND. &
(JJ .GT. 0).AND. (JJ .LT. SIZE(PA,2))) & (JJ .GT. 0).AND. (JJ .LT. SIZE(PA,2))) &
PB = (1.- ZVCOEF(I)) * (1.-ZXCOEF(I)) * PA(JI ,JJ ) & PB = (1.- TSTATIONS(I)%XYVCOEF) * (1.-TSTATIONS(I)%XXMCOEF) * PA(JI ,JJ ) &
+ (1.- ZVCOEF(I)) * ( ZXCOEF(I)) * PA(JI+1,JJ ) & + (1.- TSTATIONS(I)%XYVCOEF) * ( TSTATIONS(I)%XXMCOEF) * PA(JI+1,JJ ) &
+ ( ZVCOEF(I)) * (1.-ZXCOEF(I)) * PA(JI ,JJ+1) & + ( TSTATIONS(I)%XYVCOEF) * (1.-TSTATIONS(I)%XXMCOEF) * PA(JI ,JJ+1) &
+ ( ZVCOEF(I)) * ( ZXCOEF(I)) * PA(JI+1,JJ+1) + ( TSTATIONS(I)%XYVCOEF) * ( TSTATIONS(I)%XXMCOEF) * PA(JI+1,JJ+1)
! !
END FUNCTION STATION_INTERP_2D_V END FUNCTION STATION_INTERP_2D_V
!---------------------------------------------------------------------------- !----------------------------------------------------------------------------
...@@ -538,7 +537,9 @@ SUBROUTINE DISTRIBUTE_STATION(PAS) ...@@ -538,7 +537,9 @@ SUBROUTINE DISTRIBUTE_STATION(PAS)
! !
REAL, INTENT(INOUT) :: PAS REAL, INTENT(INOUT) :: PAS
! !
PAS = PAS * ZTHIS_PROCS(I) INTEGER :: IINFO_ll ! return code
IF ( .NOT. TSTATIONS(I)%LPRESENT ) PAS = 0.
CALL REDUCESUM_ll(PAS,IINFO_ll) CALL REDUCESUM_ll(PAS,IINFO_ll)
! !
END SUBROUTINE DISTRIBUTE_STATION END SUBROUTINE DISTRIBUTE_STATION
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment