Skip to content
Snippets Groups Projects
modd_seriesn.f90 11.6 KiB
Newer Older
  • Learn to ignore specific revisions
  • !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
    
    !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
    
    !  P. Wautelet 13/09/2019: budget: simplify and modernize date/time management
    
    !  P. Wautelet 05/05/2021: add CSMASK1/2/3 variables
    
    !-------------------------------------------------------------------------------
    !
    !*       0.   DECLARATIONS
    !             ------------
    !
    
    USE MODD_PARAMETERS, ONLY: JPMODELMAX, NCOMMENTLGTMAX, NMNHNAMELGTMAX, NUNITLGTMAX
    
    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)
    
      type(date_time), dimension(:), pointer :: tpsdates => NULL() ! dates
    
      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()
    
      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()
    
    type(date_time), dimension(:), pointer :: tpsdates => NULL()
    
    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()
    
    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
    
    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
    
    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
    
    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
    
    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