SURFEX v8.1
General documentation of Surfex
fandai.F90
Go to the documentation of this file.
1 ! Oct-2012 P. Marguinaud 64b LFI
2 ! Jan-2011 P. Marguinaud Thread-safe FA
3 SUBROUTINE fandai_fort &
4 & (fa, krep, krang, kdatef, kdatxf, ldmoda )
5 USE fa_mod, ONLY : fa_com, jpniil, &
6  & jd_yea, jd_mon, jd_day, &
7  & jd_hou, jd_min, jd_tun, &
8  & jd_tho, jd_ian, &
9  & jd_cu1, jd_cu2, &
10  & jd_dex, jd_sem, &
11  & jd_set, jd_ce1, jd_ce2, &
12  & jd_tst, jd_fmt
13 
14 USE parkind1, ONLY : jprb
15 USE yomhook , ONLY : lhook, dr_hook
16 USE lfi_precision
17 IMPLICIT NONE
18 !****
19 ! Sous-programme INTERNE du logiciel de Fichiers ARPEGE:
20 ! Definition d'une (Nouvelle) Date.
21 !**
22 ! Arguments : KREP (Sortie) ==> Code-reponse du sous-programme;
23 ! KRANG (Entree) ==> Rang de l'unite logique;
24 ! (Tableau) KDATEF (Entree/Sortie) ==> Date elle-meme (FA%JPLDAT mots).
25 ! KDATXF (Entree) ==> Date etendue
26 ! LDMODA (Sortie) ==> Vrai s'il y a modification d'une
27 ! date deja definie.
28 !*
29 ! En mode multi-taches, il doit y avoir verrouillage du fichier
30 ! concerne avant l'appel au sous-programme.
31 !
32 !
33 !
34 TYPE(fa_com) :: FA
35 INTEGER (KIND=JPLIKB) KREP, KRANG
36 INTEGER (KIND=JPLIKB) KDATEF (fa%jpldat)
37 INTEGER (KIND=JPLIKB) KDATXF (fa%jpldat)
38 !
39 INTEGER (KIND=JPLIKB) IMI123, IMAX69, IMINIM
40 INTEGER (KIND=JPLIKB) J, ILMOIS, INIMES, INUMER
41 INTEGER (KIND=JPLIKB) ISECMAX
42 !
43 LOGICAL LDMODA
44 !
45 CHARACTER(LEN=FA%JPXNOM) CLACTI
46 CHARACTER(LEN=FA%JPLMES) CLMESS
47 CHARACTER(LEN=FA%JPLSPX) CLNSPR
48 LOGICAL LLFATA
49 
50 !**
51 ! 1. - CONTROLES DES PARAMETRES D'APPEL.
52 !-----------------------------------------------------------------------
53 !
54 REAL(KIND=JPRB) :: ZHOOK_HANDLE
55 IF (lhook) CALL dr_hook('FANDAI_MT',0,zhook_handle)
56 clacti=''
57 ldmoda=.false.
58 krep=0
59 !
60 IF (krang.LE.0.OR.krang.GT.fa%JPNXFA) THEN
61  krep=-66
62  GOTO 1001
63 ENDIF
64 
65 IF (kdatxf(jd_dex-fa%JPLDAT) > 0) THEN
66 
67 !
68 ! Controle de la Date etendue.
69 !
70  IF (any(kdatxf < 0)) krep=-82
71 
72  IF (kdatef(jd_hou) < 0 .AND. kdatef(jd_min) < 0) THEN
73  kdatef(jd_hou) = kdatxf(jd_sem-fa%JPLDAT) / 3600
74  kdatef(jd_min) = kdatxf(jd_sem-fa%JPLDAT) / 60
75  ENDIF
76 
77 !
78 ! Controle de la coherence de la date et de la date etendue
79 !
80  IF (kdatxf(jd_fmt-fa%JPLDAT) > 0) THEN
81  isecmax = 60
82  ELSE
83  isecmax = 3600
84  ENDIF
85 
86  IF (abs(kdatef(jd_hou) * 3600 + kdatef(jd_min) * 60 - kdatxf(jd_sem-fa%JPLDAT)) > isecmax) krep=-82
87 
88  CALL fandai_cmpsec (kdatef(jd_tun), kdatef(jd_tho), kdatxf(jd_set-fa%JPLDAT))
89  CALL fandai_cmpsec (kdatef(jd_tun), kdatef(jd_cu1), kdatxf(jd_ce1-fa%JPLDAT))
90  CALL fandai_cmpsec (kdatef(jd_tun), kdatef(jd_cu2), kdatxf(jd_ce2-fa%JPLDAT))
91 
92  IF (krep /= 0) GOTO 1001
93 ENDIF
94 
95 !
96 ! Controle de la Date proprement dite.
97 !
98 imi123=min(kdatef(jd_yea),kdatef(jd_mon),kdatef(jd_day))
99 imax69=max(kdatef(jd_tun),kdatef(jd_ian))
100 iminim=kdatef(jd_yea)
101 !
102 DO j=2,fa%JPLDAT
103 iminim=min(iminim,kdatef(j))
104 ENDDO
105 !
106 IF (iminim.LT.0.OR.imi123.LE.0.OR.kdatef(jd_mon).GT.12.OR. &
107 & kdatef(jd_day).GT.31.OR.kdatef(jd_hou).GE.24.OR.kdatef(jd_min).GE.60.OR. &
108 & imax69.GE.255.OR. &
109 & (kdatef(jd_cu1).LE.kdatef(jd_cu2).AND.(kdatef(jd_cu1)*kdatef(jd_cu2)).NE.0)) THEN
110 !
111 ! Erreur de syntaxe.
112 !
113  krep=-82
114  GOTO 1001
115 ELSEIF ((kdatef(jd_mon).GT.7.OR.mod(kdatef(jd_mon),2_jplikb ).EQ.0).AND. &
116 & (kdatef(jd_mon).LE.7.OR.mod(kdatef(jd_mon),2_jplikb ).EQ.1)) THEN
117 !
118 ! Controle de coherence (annee,mois,jour).
119 !
120  IF (kdatef(jd_mon).EQ.2) THEN
121  ilmois=28+max(0_jplikb ,1-mod(kdatef(jd_yea),4_jplikb ))
122  ELSE
123  ilmois=30
124  ENDIF
125 !
126  IF (kdatef(jd_day).GT.ilmois) THEN
127  krep=-82
128  GOTO 1001
129  ENDIF
130 !
131 ENDIF
132 
133 
134 IF (kdatxf(jd_dex-fa%JPLDAT) == 0) THEN
135 
136 !
137 ! Calcul de la date etendue si elle n'est pas definie
138 !
139  kdatxf(jd_dex-fa%JPLDAT) = 1
140  kdatxf(jd_sem-fa%JPLDAT) = kdatef(jd_hou) * 3600 + kdatef(jd_min) * 60
141 
142  CALL fandai_setsec (kdatef(jd_tun), kdatef(jd_tho), kdatxf(jd_set-fa%JPLDAT))
143  CALL fandai_setsec (kdatef(jd_tun), kdatef(jd_cu1), kdatxf(jd_ce1-fa%JPLDAT))
144  CALL fandai_setsec (kdatef(jd_tun), kdatef(jd_cu2), kdatxf(jd_ce2-fa%JPLDAT))
145  kdatxf(jd_tst-fa%JPLDAT) = 1800
146 
147 ENDIF
148 
149 !**
150 ! 2. - SI DATE DEJA DEFINIE, COMPARAISON ANCIENNE/NOUVELLE.
151 !-----------------------------------------------------------------------
152 !
153 IF (.NOT. fa%FICHIER(krang)%LCREAF) THEN
154 !
155  DO j=1,fa%JPLDAT
156 !
157  IF (fa%FICHIER(krang)%MADATE(j).NE.kdatef(j)) THEN
158  ldmoda=.true.
159  GOTO 300
160  ENDIF
161 !
162  ENDDO
163 !
164  DO j=1,fa%JPLDAT
165 !
166  IF (fa%FICHIER(krang)%MADATX(j).NE.kdatxf(j)) THEN
167  ldmoda=.true.
168  GOTO 300
169  ENDIF
170 !
171  ENDDO
172 !
173 ! Si on arrive ici, il y a redefinition a l'identique.
174 !
175  GOTO 1001
176 ENDIF
177 !**
178 ! 3. - SI NECESSAIRE, MISE A JOUR DU TABLEAU "FA%MADATE".
179 !-----------------------------------------------------------------------
180 !
181 300 CONTINUE
182 !
183 fa%FICHIER(krang)%MADATE (:) = kdatef(:)
184 fa%FICHIER(krang)%MADATX (:) = kdatxf(:)
185 !**
186 ! 10. - PHASE TERMINALE : MESSAGERIE EVENTUELLE,
187 ! VIA LE SOUS-PROGRAMME "FAIPAR" .
188 !-----------------------------------------------------------------------
189 !
190 1001 CONTINUE
191 llfata=llmoer(krep,krang)
192 !
193 IF (fa%LFAMOP.OR.llfata) THEN
194  inimes=2
195  clnspr='FANDAI'
196  inumer=jpniil
197  WRITE (unit=clmess,fmt='(''KREP='',I4,'', KRANG='',I4, &
198 & '', KDATEF(1:5)='',I5,2(''/'',I2),I3,'':'',I2.2, &
199 & '', KDATEF(7:8)='',I6,''-'',I6,'', KDATXF='',11I6, &
200 & '', LDMODA= '',L1)') &
201 & krep,krang,(kdatef(j),j=1,5),(kdatef(j),j=7,8),kdatxf,&
202 & ldmoda
203  CALL faipar_fort &
204 & (fa, inumer,inimes,krep,.false.,clmess, &
205 & clnspr,clacti, .false.)
206 ENDIF
207 !
208 IF (lhook) CALL dr_hook('FANDAI_MT',1,zhook_handle)
209 
210 CONTAINS
211 
212 SUBROUTINE fandai_setsec (KDATEF6, KDATEFX, KSECS)
214 INTEGER (KIND=JPLIKB), INTENT (IN) :: KDATEF6
215 INTEGER (KIND=JPLIKB), INTENT (IN) :: KDATEFX
216 INTEGER (KIND=JPLIKB), INTENT (INOUT) :: KSECS
217 
218 SELECT CASE (kdatef6)
219  CASE (1)
220  ksecs = kdatefx * 3600
221  CASE (2)
222  ksecs = kdatefx * 3600 * 24
223  CASE DEFAULT
224  ksecs = -1
225 END SELECT
226 
227 END SUBROUTINE fandai_setsec
228 
229 SUBROUTINE fandai_cmpsec (KDATEF6, KDATEFX, KSECS)
231 INTEGER (KIND=JPLIKB), INTENT (INOUT) :: KDATEF6
232 INTEGER (KIND=JPLIKB), INTENT (INOUT) :: KDATEFX
233 INTEGER (KIND=JPLIKB), INTENT (IN) :: KSECS
234 
235 IF (kdatef6 < 0) THEN
236  IF (ksecs < 65000) THEN
237  kdatef6 = 1
238  ELSE
239  kdatef6 = 2
240  ENDIF
241 ENDIF
242 
243 IF (kdatefx < 0) THEN
244 
245  SELECT CASE (kdatef6)
246  CASE (1)
247  kdatefx = nint(REAL (KSECS, JPDBLR) / 3600._JPDBLR)
248  CASE (2)
249  kdatefx = nint(REAL (KSECS, JPDBLR) / 3600._JPDBLR) / 24
250  CASE DEFAULT
251  krep=-82
252  END SELECT
253 
254 ENDIF
255 
256 SELECT CASE (kdatef6)
257  CASE (1)
258  IF (abs(kdatefx * 3600 - ksecs) > 3600) THEN
259  krep=-82
260  ENDIF
261  CASE (2)
262  IF (abs(kdatefx * 3600 * 24 - ksecs) > 3600 * 24) THEN
263  krep=-82
264  ENDIF
265  CASE DEFAULT
266  krep=-82
267 END SELECT
268 
269 END SUBROUTINE fandai_cmpsec
270 
271 #include "facom2.llmoer.h"
272 
273 END SUBROUTINE fandai_fort
274 
subroutine fandai_setsec(KDATEF6, KDATEFX, KSECS)
Definition: fandai.F90:213
integer(kind=jplikb), parameter jd_tho
Definition: fa_mod.F90:16
subroutine fandai_fort(FA, KREP, KRANG, KDATEF, KDATXF, LDMODA)
Definition: fandai.F90:5
subroutine fandai_cmpsec(KDATEF6, KDATEFX, KSECS)
Definition: fandai.F90:230
integer(kind=jplikb), parameter jd_ce1
Definition: fa_mod.F90:16
Definition: fa_mod.F90:1
integer(kind=jplikb), parameter jd_hou
Definition: fa_mod.F90:16
integer, parameter jprb
Definition: parkind1.F90:32
integer(kind=jplikb), parameter jd_ce2
Definition: fa_mod.F90:16
integer(kind=jplikb), parameter jd_ian
Definition: fa_mod.F90:16
integer(kind=jplikb), parameter jd_tun
Definition: fa_mod.F90:16
integer(kind=jplikb), parameter jd_yea
Definition: fa_mod.F90:16
integer(kind=jplikb), parameter jd_day
Definition: fa_mod.F90:16
integer(kind=jplikb), parameter jd_set
Definition: fa_mod.F90:16
integer(kind=jplikb), parameter jd_fmt
Definition: fa_mod.F90:16
logical lhook
Definition: yomhook.F90:15
integer(kind=jplikb), parameter jd_cu2
Definition: fa_mod.F90:16
integer(kind=jplikb), parameter jd_sem
Definition: fa_mod.F90:16
integer(kind=jplikb), parameter jd_cu1
Definition: fa_mod.F90:16
integer(kind=jplikb), parameter jd_min
Definition: fa_mod.F90:16
integer(kind=jplikb), parameter jd_mon
Definition: fa_mod.F90:16
integer(kind=jplikb), parameter jd_dex
Definition: fa_mod.F90:16
subroutine faipar_fort(FA, KNUMER, KNIMES, KCODE, LDFATA, CDMESS, CDNSPR, CDACTI, LDRLFI)
Definition: faipar.F90:6
integer(kind=jplikb), parameter jd_tst
Definition: fa_mod.F90:16
integer(kind=jplikb), parameter jpniil
Definition: fa_mod.F90:31