Juan 8/12/2016: add management of LEN_HREC in MNH & SURFEX
[MNH-git_open_source-lfs.git] / src / SURFEX / read_precipn.F90
1 !SURFEX_LIC Copyright 1994-2014 Meteo-France 
2 !SURFEX_LIC This is part of the SURFEX software governed by the CeCILL-C  licence
3 !SURFEX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SURFEX_LIC for details. version 1.
5 !     #########
6       SUBROUTINE READ_PRECIP_n(HPROGRAM,HINIT)
7 !     ########################################
8 !
9 !!****  *READ_PRECIP_n* - routine to read the restart file for
10 !!                        precip field
11 !!
12 !!    PURPOSE
13 !!    -------
14 !!       The purpose of this routine is to initialise the 
15 !!       precip field. Indeed, when ARPEGE/ALADIN is used, 
16 !!       the precip field is not initialize at the begin of
17 !!       a run.
18 !!
19 !!
20 !!**  METHOD
21 !!    ------
22 !!      The data are read in the initial surface file :
23 !!        - 2D data fields
24 !!          
25 !!      It does not read the grid definition. This should have been
26 !!      read already.
27 !!
28 !!    EXTERNAL
29 !!    --------
30 !!      
31 !!
32 !!
33 !!    IMPLICIT ARGUMENTS
34 !!    ------------------
35 !!
36 !!    REFERENCE
37 !!    ---------
38 !!
39 !!
40 !!    AUTHOR
41 !!    ------
42 !!      B. Decharme   *Meteo France*    
43 !!
44 !!    MODIFICATIONS
45 !!    -------------
46 !!      Original    04/2009
47 !-------------------------------------------------------------------------------
48 !
49 !*       0.    DECLARATIONS
50 !              ------------
51 !
52 USE MODD_SURF_ATM_n    ,     ONLY : NSIZE_FULL,LINIT_PRECIP
53 !
54 USE MODD_SURF_ATM,           ONLY : LRW_PRECIP,LSAVE_PRECIP
55 USE MODD_DIAG_SURF_ATM_n,    ONLY : XRW_RAIN, XRW_SNOW
56 !
57 USE MODI_READ_SURF
58 !
59 !
60 !
61 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
62 USE PARKIND1  ,ONLY : JPRB
63 !
64 IMPLICIT NONE
65 !
66 !*       0.1   Declarations of arguments
67 !              -------------------------
68 !
69  CHARACTER(LEN=6),  INTENT(IN)  :: HPROGRAM ! calling program
70  CHARACTER(LEN=3),  INTENT(IN)  :: HINIT    ! choice of fields to initialize
71 !
72 !*       0.2   Declarations of local variables
73 !              -------------------------------
74 !
75
76 !
77 INTEGER           :: IRESP      ! Error code after redding
78
79  CHARACTER(LEN=LEN_HREC) :: YRECFM     ! Name of the article to be read
80 !
81 INTEGER           :: IVERSION   ! surface version
82 INTEGER           :: IBUGFIX    ! surface bugfix
83 REAL(KIND=JPRB) :: ZHOOK_HANDLE
84 !
85 !-------------------------------------------------------------------------------
86 !
87 IF (LHOOK) CALL DR_HOOK('READ_PRECIP_N',0,ZHOOK_HANDLE)
88 SELECT CASE (HINIT)
89 !
90 CASE ('PGD')
91 !     
92      ALLOCATE(XRW_RAIN(0))
93      ALLOCATE(XRW_SNOW(0))           
94      LRW_PRECIP   =.FALSE.
95      LINIT_PRECIP =.FALSE.
96      LSAVE_PRECIP =.FALSE.
97 !     
98 CASE ('PRE')
99 !     
100      IF(LRW_PRECIP)THEN
101         LINIT_PRECIP =.TRUE.
102         LSAVE_PRECIP =.TRUE.
103         ALLOCATE(XRW_RAIN(NSIZE_FULL))
104         ALLOCATE(XRW_SNOW(NSIZE_FULL))
105         XRW_RAIN(:)=0.0
106         XRW_SNOW(:)=0.0
107      ELSE   
108         LINIT_PRECIP =.FALSE.
109         LSAVE_PRECIP =.FALSE.
110         ALLOCATE(XRW_RAIN(0))
111         ALLOCATE(XRW_SNOW(0))
112      ENDIF
113 !     
114 CASE DEFAULT
115 !
116         YRECFM='VERSION'
117         CALL READ_SURF(HPROGRAM,YRECFM,IVERSION,IRESP)
118         IF (IVERSION<6) THEN
119            LRW_PRECIP =.FALSE.
120         ELSE
121            YRECFM='RW_PRECIP'
122            CALL READ_SURF(HPROGRAM,YRECFM,LRW_PRECIP,IRESP)
123         ENDIF
124 !
125         IF(LRW_PRECIP)THEN
126            LINIT_PRECIP =.TRUE.
127            LSAVE_PRECIP =.TRUE.
128            ALLOCATE(XRW_RAIN(NSIZE_FULL))
129            ALLOCATE(XRW_SNOW(NSIZE_FULL))           
130            YRECFM='RW_RAIN'
131            CALL READ_SURF(HPROGRAM,YRECFM,XRW_RAIN(:),IRESP)
132            YRECFM='RW_SNOW'
133            CALL READ_SURF(HPROGRAM,YRECFM,XRW_SNOW(:),IRESP)
134         ELSE   
135            LINIT_PRECIP =.FALSE.
136            LSAVE_PRECIP =.FALSE.
137            ALLOCATE(XRW_RAIN(0))
138            ALLOCATE(XRW_SNOW(0))
139         ENDIF
140 !        
141 END SELECT
142 IF (LHOOK) CALL DR_HOOK('READ_PRECIP_N',1,ZHOOK_HANDLE)
143 !
144 !-------------------------------------------------------------------------------
145 !
146 END SUBROUTINE READ_PRECIP_n