Newer
Older

WAUTELET Philippe
committed
!MNH_LIC Copyright 1998-2023 CNRS, Meteo-France and Universite Paul Sabatier
!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence

WAUTELET Philippe
committed
!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
!MNH_LIC for details. version 1.
!-----------------------------------------------------------------
! ####################
MODULE MODD_SERIES_n
! ####################
!
!!**** *MODD_SERIES$n*- declaration of variables related with the diagnostics
!! for diachro files
!!
!! PURPOSE
!! -------
! The purpose of this declarative module is to specify
! the conditions of realization of the diagnostics (box and slice definition)
!
!!
!!** IMPLICIT ARGUMENTS
!! ------------------
!! None
!!
!! REFERENCE
!! ---------
!!
!! AUTHOR
!! ------
!! V. Ducrocq *Meteo France*
!!
!! MODIFICATIONS
!! -------------
!! Original 29/01/98
!! Oct. 10,1998 (Lafore) adaptation of Diagnostics
!! to the sequential nesting version

WAUTELET Philippe
committed
! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management
! P. Wautelet 05/05/2021: add CSMASK1/2/3 variables
!-------------------------------------------------------------------------------
!
!* 0. DECLARATIONS
! ------------
!

WAUTELET Philippe
committed
USE MODD_PARAMETERS, ONLY: JPMODELMAX, NCOMMENTLGTMAX, NMNHNAMELGTMAX, NUNITLGTMAX

WAUTELET Philippe
committed
use modd_type_date, only: date_time
IMPLICIT NONE
TYPE SERIES_t
!
INTEGER :: NIBOXL,NJBOXL ! Lower indices of the horizontal box
INTEGER :: NIBOXH,NJBOXH ! Higher indices of the horizontal box
INTEGER :: NKCLA,NKCLS ! K level respectively in CLS and in CLA
INTEGER :: NKLOW,NKMID,NKUP ! K levels in the mid troposphere
! (average are done between NKLOW and NKUP)
INTEGER :: NBJSLICE ! Number of y-slices for (x,t) series
!JUAN
INTEGER, DIMENSION(:),POINTER :: NJSLICEL=>NULL() ,NJSLICEH=>NULL() ! Lower and
!JUAN
! Higher index along y-axe of the y-slice
INTEGER :: NFREQSERIES ! time frequency of diagnostic writting
!
INTEGER :: NSTEMP_SERIE1 ! number of processes in 1st group (t)
INTEGER :: NAVER1 ! number of processes to Average in 1st group
INTEGER :: NSTEMP_SERIE2 ! number of processes in 2nd group (z,t)
INTEGER :: NSTEMP_SERIE3 ! number of processes in 3rd group (x,t)
! (by y-slice)
!
REAL, DIMENSION(:,:,:,:,:,:), POINTER :: XSSERIES1=>NULL() ! 1st group: temporal serie (t)
REAL, DIMENSION(:,:,:,:,:,:), POINTER :: XSSERIES2=>NULL() ! 2nd group:temporal serie (z,t)
REAL, DIMENSION(:,:,:,:,:,:), POINTER :: XSSERIES3=>NULL() ! 3rd group:temporal serie (x,t)

WAUTELET Philippe
committed
type(date_time), dimension(:), pointer :: tpsdates => NULL() ! dates

WAUTELET Philippe
committed
CHARACTER(LEN=NCOMMENTLGTMAX), DIMENSION(:), POINTER :: CSCOMMENT1 => NULL() ! comments associated with the 1st group
CHARACTER(LEN=NCOMMENTLGTMAX), DIMENSION(:), POINTER :: CSCOMMENT2 => NULL() ! with the 2nd
CHARACTER(LEN=NCOMMENTLGTMAX), DIMENSION(:), POINTER :: CSCOMMENT3 => NULL() ! with the 3rd
CHARACTER(LEN=NMNHNAMELGTMAX), DIMENSION(:), POINTER :: CSTITLE1 => NULL() ! titles associated with the 1st group
CHARACTER(LEN=NMNHNAMELGTMAX), DIMENSION(:), POINTER :: CSTITLE2 => NULL() ! with the 2nd
CHARACTER(LEN=NMNHNAMELGTMAX), DIMENSION(:), POINTER :: CSTITLE3 => NULL() ! with the 3rd
CHARACTER(LEN=NUNITLGTMAX), DIMENSION(:), POINTER :: CSUNIT1 => NULL() ! units associated with the 1st group
CHARACTER(LEN=NUNITLGTMAX), DIMENSION(:), POINTER :: CSUNIT2 => NULL() ! with the 2nd
CHARACTER(LEN=NUNITLGTMAX), DIMENSION(:), POINTER :: CSUNIT3 => NULL() ! with the 3rd
CHARACTER(LEN=4), DIMENSION(:),POINTER :: CSMASK1=>NULL()
CHARACTER(LEN=4), DIMENSION(:),POINTER :: CSMASK2=>NULL()
! CHARACTER(LEN=4), DIMENSION(:),POINTER :: CSMASK3=>NULL()
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
INTEGER , DIMENSION(:) ,POINTER :: NSGRIDD1=>NULL() !grid indicator for the 1st serie
INTEGER , DIMENSION(:) ,POINTER :: NSGRIDD2=>NULL() ! for the 2nd
INTEGER , DIMENSION(:) ,POINTER :: NSGRIDD3=>NULL() ! for the 3rd
!
INTEGER :: NSTEMP3 ! number of total processes in 3rd group
INTEGER :: NSCOUNTD,NSNBSTEPT ! current index and size in t dimension
CHARACTER (LEN=3) :: CSKCLA,CSKCLS,CSKUP,CSKMID,CSKLOW
! strings for levels
INTEGER :: NIBOXSL,NIBOXSH ! lowest and highest I indices of the intersection
! of the horizontal box with the sub-domain (//)
INTEGER :: NJBOXSL,NJBOXSH ! lowest and highest J indices of the intersection
! of the horizontal box with the sub-domain (//)
LOGICAL :: LSERIES1,LSERIES2 ! logical to compute XSERIES1,XSERIES2
LOGICAL,DIMENSION(:), POINTER :: LSERIES3=>NULL() !logical to compute XSERIES3
LOGICAL :: LDOSERIES ! logical to compute XSERIES1,XSERIES2 or XSERIES3
LOGICAL, DIMENSION(:,:), POINTER :: LINBOX=>NULL(),LINBOXL=>NULL(),LINBOXS=>NULL()
! mask to compute diagnostics on the horizontal domain,
! or on land or sea points of the sub-domain
!JUAN
INTEGER, DIMENSION(:),POINTER :: NISL=>NULL() ,NISH=>NULL() ! Lower and Higher indices
! along x-axis of the y-slice
INTEGER, DIMENSION(:),POINTER :: NJSLICESL=>NULL() ,NJSLICESH=>NULL() ! Lower and Higher indiceso
!JUAN
! along x-axis of the y-slice
!
END TYPE SERIES_t
TYPE(SERIES_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: SERIES_MODEL
!JUAN
LOGICAL , DIMENSION(JPMODELMAX), SAVE :: SERIES_FIRST_CALL = .TRUE.
!JUAN
INTEGER, POINTER :: NIBOXL=>NULL(),NJBOXL=>NULL()
INTEGER, POINTER :: NIBOXH=>NULL(),NJBOXH=>NULL()
INTEGER, POINTER :: NKCLA=>NULL(),NKCLS=>NULL()
INTEGER, POINTER :: NKLOW=>NULL(),NKMID=>NULL(),NKUP=>NULL()
INTEGER, POINTER :: NBJSLICE=>NULL()
INTEGER, DIMENSION(:), POINTER :: NJSLICEL=>NULL(),NJSLICEH=>NULL()
INTEGER, POINTER :: NFREQSERIES=>NULL()
INTEGER, POINTER :: NSTEMP_SERIE1=>NULL()
INTEGER, POINTER :: NAVER1=>NULL()
INTEGER, POINTER :: NSTEMP_SERIE2=>NULL()
INTEGER, POINTER :: NSTEMP_SERIE3=>NULL()
REAL, DIMENSION(:,:,:,:,:,:), POINTER :: XSSERIES1=>NULL()
REAL, DIMENSION(:,:,:,:,:,:), POINTER :: XSSERIES2=>NULL()
REAL, DIMENSION(:,:,:,:,:,:), POINTER :: XSSERIES3=>NULL()

WAUTELET Philippe
committed
type(date_time), dimension(:), pointer :: tpsdates => NULL()

WAUTELET Philippe
committed
CHARACTER(LEN=NCOMMENTLGTMAX), DIMENSION(:), POINTER :: CSCOMMENT1 => NULL()
CHARACTER(LEN=NCOMMENTLGTMAX), DIMENSION(:), POINTER :: CSCOMMENT2 => NULL()
CHARACTER(LEN=NCOMMENTLGTMAX), DIMENSION(:), POINTER :: CSCOMMENT3 => NULL()
CHARACTER(LEN=NMNHNAMELGTMAX), DIMENSION(:), POINTER :: CSTITLE1 => NULL()
CHARACTER(LEN=NMNHNAMELGTMAX), DIMENSION(:), POINTER :: CSTITLE2 => NULL()
CHARACTER(LEN=NMNHNAMELGTMAX), DIMENSION(:), POINTER :: CSTITLE3 => NULL()
CHARACTER(LEN=NUNITLGTMAX), DIMENSION(:), POINTER :: CSUNIT1 => NULL()
CHARACTER(LEN=NUNITLGTMAX), DIMENSION(:), POINTER :: CSUNIT2 => NULL()
CHARACTER(LEN=NUNITLGTMAX), DIMENSION(:), POINTER :: CSUNIT3 => NULL()
CHARACTER(LEN=4), DIMENSION(:),POINTER :: CSMASK1=>NULL()
CHARACTER(LEN=4), DIMENSION(:),POINTER :: CSMASK2=>NULL()
! CHARACTER(LEN=4), DIMENSION(:),POINTER :: CSMASK3=>NULL()
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
INTEGER , DIMENSION(:) ,POINTER :: NSGRIDD1=>NULL()
INTEGER , DIMENSION(:) ,POINTER :: NSGRIDD2=>NULL()
INTEGER , DIMENSION(:) ,POINTER :: NSGRIDD3=>NULL()
INTEGER, POINTER :: NSTEMP3=>NULL()
INTEGER, POINTER :: NSCOUNTD=>NULL(),NSNBSTEPT=>NULL()
CHARACTER (LEN=3), POINTER :: CSKCLA=>NULL(),CSKCLS=>NULL(), &
CSKUP=>NULL(),CSKMID=>NULL(),CSKLOW=>NULL()
INTEGER, POINTER :: NIBOXSL=>NULL(),NIBOXSH=>NULL()
INTEGER, POINTER :: NJBOXSL=>NULL(),NJBOXSH=>NULL()
LOGICAL, POINTER :: LSERIES1=>NULL(),LSERIES2=>NULL()
LOGICAL,DIMENSION(:), POINTER :: LSERIES3=>NULL()
LOGICAL, POINTER :: LDOSERIES=>NULL()
LOGICAL, DIMENSION(:,:), POINTER :: LINBOX=>NULL(),LINBOXL=>NULL(),LINBOXS=>NULL()
INTEGER, DIMENSION(:), POINTER :: NISL=>NULL(),NISH=>NULL()
INTEGER, DIMENSION(:), POINTER :: NJSLICESL=>NULL(),NJSLICESH=>NULL()
CONTAINS
SUBROUTINE SERIES_GOTO_MODEL(KFROM, KTO)
INTEGER, INTENT(IN) :: KFROM, KTO
!
!JUAN
IF (SERIES_FIRST_CALL(KTO)) THEN
ALLOCATE (SERIES_MODEL(KTO)%NJSLICEL(20))
ALLOCATE (SERIES_MODEL(KTO)%NJSLICEH(20))
ALLOCATE (SERIES_MODEL(KTO)%NISL(20))
ALLOCATE (SERIES_MODEL(KTO)%NISH(20))
ALLOCATE (SERIES_MODEL(KTO)%NJSLICESL(20))
ALLOCATE (SERIES_MODEL(KTO)%NJSLICESH(20))
SERIES_FIRST_CALL(KTO) = .FALSE.
ENDIF
!JUAN
! Save current state for allocated arrays
SERIES_MODEL(KFROM)%XSSERIES1=>XSSERIES1
SERIES_MODEL(KFROM)%XSSERIES2=>XSSERIES2
SERIES_MODEL(KFROM)%XSSERIES3=>XSSERIES3

WAUTELET Philippe
committed
series_model(kfrom)%tpsdates=>tpsdates
SERIES_MODEL(KFROM)%CSCOMMENT1=>CSCOMMENT1
SERIES_MODEL(KFROM)%CSCOMMENT2=>CSCOMMENT2
SERIES_MODEL(KFROM)%CSCOMMENT3=>CSCOMMENT3
SERIES_MODEL(KFROM)%CSTITLE1=>CSTITLE1
SERIES_MODEL(KFROM)%CSTITLE2=>CSTITLE2
SERIES_MODEL(KFROM)%CSTITLE3=>CSTITLE3
SERIES_MODEL(KFROM)%CSUNIT1=>CSUNIT1
SERIES_MODEL(KFROM)%CSUNIT2=>CSUNIT2
SERIES_MODEL(KFROM)%CSUNIT3=>CSUNIT3
SERIES_MODEL(KFROM)%CSMASK1=>CSMASK1
SERIES_MODEL(KFROM)%CSMASK2=>CSMASK2
! SERIES_MODEL(KFROM)%CSMASK3=>CSMASK3
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
SERIES_MODEL(KFROM)%NSGRIDD1=>NSGRIDD1
SERIES_MODEL(KFROM)%NSGRIDD2=>NSGRIDD2
SERIES_MODEL(KFROM)%NSGRIDD3=>NSGRIDD3
SERIES_MODEL(KFROM)%LSERIES3=>LSERIES3
SERIES_MODEL(KFROM)%LINBOX=>LINBOX
SERIES_MODEL(KFROM)%LINBOXL=>LINBOXL
SERIES_MODEL(KFROM)%LINBOXS=>LINBOXS
!
! Current model is set to model KTO
NIBOXL=>SERIES_MODEL(KTO)%NIBOXL
NJBOXL=>SERIES_MODEL(KTO)%NJBOXL
NIBOXH=>SERIES_MODEL(KTO)%NIBOXH
NJBOXH=>SERIES_MODEL(KTO)%NJBOXH
NKCLA=>SERIES_MODEL(KTO)%NKCLA
NKCLS=>SERIES_MODEL(KTO)%NKCLS
NKLOW=>SERIES_MODEL(KTO)%NKLOW
NKMID=>SERIES_MODEL(KTO)%NKMID
NKUP=>SERIES_MODEL(KTO)%NKUP
NBJSLICE=>SERIES_MODEL(KTO)%NBJSLICE
NJSLICEL=>SERIES_MODEL(KTO)%NJSLICEL
NJSLICEH=>SERIES_MODEL(KTO)%NJSLICEH
NFREQSERIES=>SERIES_MODEL(KTO)%NFREQSERIES
NSTEMP_SERIE1=>SERIES_MODEL(KTO)%NSTEMP_SERIE1
NAVER1=>SERIES_MODEL(KTO)%NAVER1
NSTEMP_SERIE2=>SERIES_MODEL(KTO)%NSTEMP_SERIE2
NSTEMP_SERIE3=>SERIES_MODEL(KTO)%NSTEMP_SERIE3
XSSERIES1=>SERIES_MODEL(KTO)%XSSERIES1
XSSERIES2=>SERIES_MODEL(KTO)%XSSERIES2
XSSERIES3=>SERIES_MODEL(KTO)%XSSERIES3

WAUTELET Philippe
committed
tpsdates=>series_model(kto)%tpsdates
CSCOMMENT1=>SERIES_MODEL(KTO)%CSCOMMENT1
CSCOMMENT2=>SERIES_MODEL(KTO)%CSCOMMENT2
CSCOMMENT3=>SERIES_MODEL(KTO)%CSCOMMENT3
CSTITLE1=>SERIES_MODEL(KTO)%CSTITLE1
CSTITLE2=>SERIES_MODEL(KTO)%CSTITLE2
CSTITLE3=>SERIES_MODEL(KTO)%CSTITLE3
CSUNIT1=>SERIES_MODEL(KTO)%CSUNIT1
CSUNIT2=>SERIES_MODEL(KTO)%CSUNIT2
CSUNIT3=>SERIES_MODEL(KTO)%CSUNIT3
CSMASK1=>SERIES_MODEL(KTO)%CSMASK1
CSMASK2=>SERIES_MODEL(KTO)%CSMASK2
! CSMASK3=>SERIES_MODEL(KTO)%CSMASK3
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
NSGRIDD1=>SERIES_MODEL(KTO)%NSGRIDD1
NSGRIDD2=>SERIES_MODEL(KTO)%NSGRIDD2
NSGRIDD3=>SERIES_MODEL(KTO)%NSGRIDD3
NSTEMP3=>SERIES_MODEL(KTO)%NSTEMP3
NSCOUNTD=>SERIES_MODEL(KTO)%NSCOUNTD
NSNBSTEPT=>SERIES_MODEL(KTO)%NSNBSTEPT
CSKCLA=>SERIES_MODEL(KTO)%CSKCLA
CSKCLS=>SERIES_MODEL(KTO)%CSKCLS
CSKUP=>SERIES_MODEL(KTO)%CSKUP
CSKMID=>SERIES_MODEL(KTO)%CSKMID
CSKLOW=>SERIES_MODEL(KTO)%CSKLOW
NIBOXSL=>SERIES_MODEL(KTO)%NIBOXSL
NIBOXSH=>SERIES_MODEL(KTO)%NIBOXSH
NJBOXSL=>SERIES_MODEL(KTO)%NJBOXSL
NJBOXSH=>SERIES_MODEL(KTO)%NJBOXSH
LSERIES1=>SERIES_MODEL(KTO)%LSERIES1
LSERIES2=>SERIES_MODEL(KTO)%LSERIES2
LSERIES3=>SERIES_MODEL(KTO)%LSERIES3
LDOSERIES=>SERIES_MODEL(KTO)%LDOSERIES
LINBOX=>SERIES_MODEL(KTO)%LINBOX
LINBOXL=>SERIES_MODEL(KTO)%LINBOXL
LINBOXS=>SERIES_MODEL(KTO)%LINBOXS
NISL=>SERIES_MODEL(KTO)%NISL
NISH=>SERIES_MODEL(KTO)%NISH
NJSLICESL=>SERIES_MODEL(KTO)%NJSLICESL
NJSLICESH=>SERIES_MODEL(KTO)%NJSLICESH
END SUBROUTINE SERIES_GOTO_MODEL
END MODULE MODD_SERIES_n