SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
mode_write_surf_fa.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
6 !
7 INTERFACE write_surf0_fa
8  MODULE PROCEDURE write_surfx0_fa
9  MODULE PROCEDURE write_surfn0_fa
10  MODULE PROCEDURE write_surfl0_fa
11  MODULE PROCEDURE write_surfc0_fa
12 END INTERFACE
13 INTERFACE write_surfn_fa
14  MODULE PROCEDURE write_surfx1_fa
15  MODULE PROCEDURE write_surfn1_fa
16  MODULE PROCEDURE write_surfl1_fa
17  MODULE PROCEDURE write_surfx2_fa
18 END INTERFACE
19 INTERFACE write_surft_fa
20  MODULE PROCEDURE write_surft0_fa
21  MODULE PROCEDURE write_surft2_fa
22 END INTERFACE
23 !
24  CONTAINS
25 !
26 ! #############################################################
27  SUBROUTINE write_surfx0_fa (&
28  hrec,pfield,kresp,hcomment)
29 ! #############################################################
30 !
31 !!**** * - routine to write a real scalar
32 !
33 !
34 !
35 !
36 USE modd_surfex_omp, ONLY : lwork0
37 !
38 USE modd_io_surf_fa, ONLY : nunit_fa, cprefix1d, lfanocompact
39 !
40 USE mode_fasurfex
41 !
42 USE modi_io_buff
43 USE modi_error_write_surf_fa
44 !
45 USE yomhook ,ONLY : lhook, dr_hook
46 USE parkind1 ,ONLY : jprb
47 !
48 IMPLICIT NONE
49 !
50 !* 0.1 Declarations of arguments
51 !
52 !
53 !
54  CHARACTER(LEN=12), INTENT(IN) :: hrec ! name of the article to be read
55 REAL, INTENT(IN) :: pfield ! the real scalar to be read
56 INTEGER, INTENT(OUT):: kresp ! KRESP : return-code if a problem appears
57  CHARACTER(LEN=100), INTENT(IN) :: hcomment ! comment string
58 !
59 !* 0.2 Declarations of local variables
60 !
61  CHARACTER(LEN=18):: yname ! Field Name
62 INTEGER :: ingrib,inbpdg,inbcsp,istron,ipuila,idmopl
63 REAL(KIND=JPRB) :: zhook_handle
64 !
65 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_FA:ERROR_WRITE_SURF_FA:WRITE_SURFX0_FA',0,zhook_handle)
66 !
67 kresp=0
68 !
69  CALL io_buff(&
70  hrec,'W',lwork0)
71 IF (lwork0 .AND. lhook) CALL dr_hook('MODE_WRITE_SURF_FA:WRITE_SURFX0_FA',1,zhook_handle)
72 IF (lwork0) RETURN
73 !
74 IF(lfanocompact)THEN
75  CALL faveur(kresp,nunit_fa,ingrib,inbpdg,inbcsp,istron,ipuila,idmopl)
76  ! -- Pour ecrire sans compactage
77  CALL fagote(kresp,nunit_fa,-1,inbpdg,inbcsp,istron,ipuila,idmopl)
78 ENDIF
79 !
80 yname=trim(cprefix1d)//trim(hrec)
81  CALL faecr_r(kresp,nunit_fa,yname,pfield)
82 IF (kresp/=0) THEN
83  CALL error_write_surf_fa(hrec,kresp)
84 ENDIF
85 !
86 IF(lfanocompact)THEN
87  ! On remet la valeur par defaut
88  CALL fagote(kresp,nunit_fa,ingrib,inbpdg,inbcsp,istron,ipuila,idmopl)
89 ENDIF
90 !
91 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_FA:WRITE_SURFX0_FA',1,zhook_handle)
92 !
93 END SUBROUTINE write_surfx0_fa
94 !
95 ! #############################################################
96  SUBROUTINE write_surfn0_fa (&
97  hrec,kfield,kresp,hcomment)
98 ! #############################################################
99 !
100 !!**** * - routine to write an integer
101 !
102 !
103 !
104 !
105 USE modd_surfex_omp, ONLY : lwork0
106 !
107 USE modd_io_surf_fa, ONLY : nunit_fa, nmask, cprefix1d, lfanocompact
108 !
109 USE mode_fasurfex
110 !
111 USE modi_io_buff
112 USE modi_error_write_surf_fa
113 !
114 USE yomhook ,ONLY : lhook, dr_hook
115 USE parkind1 ,ONLY : jprb
116 !
117 IMPLICIT NONE
118 !
119 !* 0.1 Declarations of arguments
120 !
121 !
122 !
123  CHARACTER(LEN=12), INTENT(IN) :: hrec ! name of the article to be read
124 INTEGER, INTENT(IN) :: kfield ! the integer to be read
125 INTEGER, INTENT(OUT):: kresp ! KRESP : return-code if a problem appears
126  CHARACTER(LEN=100), INTENT(IN) :: hcomment ! comment string
127 !
128 !* 0.2 Declarations of local variables
129 !
130  CHARACTER(LEN=18):: yname ! Field Name
131 INTEGER :: ingrib,inbpdg,inbcsp,istron,ipuila,idmopl
132 REAL(KIND=JPRB) :: zhook_handle
133 !
134 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_FA:WRITE_SURFN0_FA',0,zhook_handle)
135 !
136 kresp=0
137 !
138  CALL io_buff(&
139  hrec,'W',lwork0)
140 IF (lwork0 .AND. lhook) CALL dr_hook('MODE_WRITE_SURF_FA:WRITE_SURFN0_FA',1,zhook_handle)
141 IF (lwork0) RETURN
142 !
143 IF(lfanocompact)THEN
144  CALL faveur(kresp,nunit_fa,ingrib,inbpdg,inbcsp,istron,ipuila,idmopl)
145  ! -- Pour ecrire sans compactage
146  CALL fagote(kresp,nunit_fa,-1,inbpdg,inbcsp,istron,ipuila,idmopl)
147 ENDIF
148 !
149 yname=trim(cprefix1d)//trim(hrec)
150  CALL faecr_i(kresp,nunit_fa,yname,kfield)
151 IF (kresp/=0) THEN
152  CALL error_write_surf_fa(hrec,kresp)
153 ENDIF
154 !
155 IF(lfanocompact)THEN
156  ! On remet la valeur par defaut
157  CALL fagote(kresp,nunit_fa,ingrib,inbpdg,inbcsp,istron,ipuila,idmopl)
158 ENDIF
159 !
160 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_FA:WRITE_SURFN0_FA',1,zhook_handle)
161 !
162 END SUBROUTINE write_surfn0_fa
163 !
164 ! #############################################################
165  SUBROUTINE write_surfl0_fa (&
166  hrec,ofield,kresp,hcomment)
167 ! #############################################################
168 !
169 !!**** * - routine to write a logical
170 !
171 !
172 !
173 !
174 USE modd_surfex_omp, ONLY : lwork0
175 !
176 USE modd_io_surf_fa, ONLY : nunit_fa, cprefix1d, lfanocompact
177 !
178 USE mode_fasurfex
179 !
180 USE modi_io_buff
181 USE modi_error_write_surf_fa
182 !
183 USE yomhook ,ONLY : lhook, dr_hook
184 USE parkind1 ,ONLY : jprb
185 !
186 IMPLICIT NONE
187 !
188 !* 0.1 Declarations of arguments
189 !
190 !
191 !
192  CHARACTER(LEN=12), INTENT(IN) :: hrec ! name of the article to be read
193 LOGICAL, INTENT(IN) :: ofield ! array containing the data field
194 INTEGER, INTENT(OUT):: kresp ! KRESP : return-code if a problem appears
195  CHARACTER(LEN=100), INTENT(IN) :: hcomment ! comment string
196 !
197 !* 0.2 Declarations of local variables
198 !
199  CHARACTER(LEN=18):: yname ! Field Name
200 INTEGER :: ingrib,inbpdg,inbcsp,istron,ipuila,idmopl
201 REAL(KIND=JPRB) :: zhook_handle
202 !
203 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_FA:WRITE_SURFL0_FA',0,zhook_handle)
204 !
205 kresp=0
206 !
207  CALL io_buff(&
208  hrec,'W',lwork0)
209 IF (lwork0 .AND. lhook) CALL dr_hook('MODE_WRITE_SURF_FA:WRITE_SURFL0_FA',1,zhook_handle)
210 IF (lwork0) RETURN
211 !
212 IF(lfanocompact)THEN
213  CALL faveur(kresp,nunit_fa,ingrib,inbpdg,inbcsp,istron,ipuila,idmopl)
214  ! -- Pour ecrire sans compactage
215  CALL fagote(kresp,nunit_fa,-1,inbpdg,inbcsp,istron,ipuila,idmopl)
216 ENDIF
217 !
218 yname=trim(cprefix1d)//trim(hrec)
219  CALL faecr_l(kresp,nunit_fa,yname,ofield)
220 IF (kresp/=0) THEN
221  CALL error_write_surf_fa(hrec,kresp)
222 ENDIF
223 !
224 IF(lfanocompact)THEN
225  ! On remet la valeur par defaut
226  CALL fagote(kresp,nunit_fa,ingrib,inbpdg,inbcsp,istron,ipuila,idmopl)
227 ENDIF
228 !
229 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_FA:WRITE_SURFL0_FA',1,zhook_handle)
230 !
231 END SUBROUTINE write_surfl0_fa
232 !
233 ! #############################################################
234  SUBROUTINE write_surfc0_fa (&
235  hrec,hfield,kresp,hcomment)
236 ! #############################################################
237 !
238 !!**** * - routine to write a character
239 !
240 !
241 !
242 !
243 USE modd_surfex_omp, ONLY : lwork0
244 !
245 USE modd_io_surf_fa, ONLY : nunit_fa, cprefix1d, lfanocompact
246 !
247 USE mode_fasurfex
248 !
249 USE modi_io_buff
250 USE modi_error_write_surf_fa
251 !
252 USE yomhook ,ONLY : lhook, dr_hook
253 USE parkind1 ,ONLY : jprb
254 !
255 IMPLICIT NONE
256 !
257 !* 0.1 Declarations of arguments
258 !
259 !
260 !
261  CHARACTER(LEN=12), INTENT(IN) :: hrec ! name of the article to be read
262  CHARACTER(LEN=40), INTENT(IN) :: hfield ! the integer to be read
263 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
264  CHARACTER(LEN=100), INTENT(IN) :: hcomment ! comment string
265 !
266 !* 0.2 Declarations of local variables
267 !
268  CHARACTER,DIMENSION(40) :: yfield
269  CHARACTER(LEN=18) :: yname ! Field Name
270 INTEGER :: ingrib,inbpdg,inbcsp,istron,ipuila,idmopl
271 REAL(KIND=JPRB) :: zhook_handle
272 !
273 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_FA:WRITE_SURFC0_FA',0,zhook_handle)
274 !
275 kresp=0
276 !
277  CALL io_buff(&
278  hrec,'W',lwork0)
279 IF (lwork0.AND. lhook) CALL dr_hook('MODE_WRITE_SURF_FA:WRITE_SURFC0_FA',1,zhook_handle)
280 IF (lwork0) RETURN
281 !
282 IF(lfanocompact)THEN
283  CALL faveur(kresp,nunit_fa,ingrib,inbpdg,inbcsp,istron,ipuila,idmopl)
284  ! -- Pour ecrire sans compactage
285  CALL fagote(kresp,nunit_fa,-1,inbpdg,inbcsp,istron,ipuila,idmopl)
286 ENDIF
287 !
288 READ(hfield,'(40A1)') yfield
289 yname=trim(cprefix1d)//trim(hrec)
290  CALL faecr_c(kresp,nunit_fa,yname,40,yfield)
291 IF (kresp/=0) THEN
292  CALL error_write_surf_fa(hrec,kresp)
293 ENDIF
294 !
295 IF(lfanocompact)THEN
296  ! On remet la valeur par defaut
297  CALL fagote(kresp,nunit_fa,ingrib,inbpdg,inbcsp,istron,ipuila,idmopl)
298 ENDIF
299 !
300 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_FA:WRITE_SURFC0_FA',1,zhook_handle)
301 !
302 END SUBROUTINE write_surfc0_fa
303 !
304 ! #############################################################
305  SUBROUTINE write_surfx1_fa (&
306  hrec,kl,pfield,kresp,hcomment,hdir)
307 ! #############################################################
308 !
309 !!**** * - routine to fill a write 1D array for the externalised surface
310 !
311 !
312 !
313 !
314 USE modd_surfex_mpi, ONLY : nrank, npio, xtime_npio_write, wlog_mpi
315 !
316 USE modd_surfex_omp, ONLY : lwork0, nworkb
317 !
318 USE modd_io_surf_fa, ONLY : nunit_fa, nmask, nfull, cprefix1d, &
319  lfanocompact
320 USE modd_surf_par, ONLY : xundef
321 !
322 USE modi_io_buff
323 USE modi_error_write_surf_fa
325 !
326 USE yomhook ,ONLY : lhook, dr_hook
327 USE parkind1 ,ONLY : jprb
328 !
329 IMPLICIT NONE
330 !
331 #ifdef SFX_MPI
332 include "mpif.h"
333 #endif
334 !
335 !* 0.1 Declarations of arguments
336 !
337 !
338 !
339  CHARACTER(LEN=12), INTENT(IN) :: hrec ! name of the article to be read
340 INTEGER, INTENT(IN) :: kl ! number of points
341 REAL, DIMENSION(KL), INTENT(IN) :: pfield ! array containing the data field
342 INTEGER, INTENT(OUT):: kresp ! KRESP : return-code if a problem appears
343  CHARACTER(LEN=100), INTENT(IN) :: hcomment ! comment string
344  CHARACTER(LEN=1), INTENT(IN) :: hdir ! type of field :
345  ! 'H' : field with
346  ! horizontal spatial dim.
347  ! '-' : no horizontal dim.
348 !* 0.2 Declarations of local variables
349 !
350 INTEGER :: i,ingrib,inbpdg,inbcsp,istron,ipuila,idmopl
351 REAL :: zmean, zcount
352 REAL :: xtime0
353 REAL, DIMENSION(MAX(NFULL,SIZE(PFIELD))) :: zwork ! work array read in the file
354 REAL(KIND=JPRB) :: zhook_handle
355 !
356 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_FA:WRITE_SURFX1_FA',0,zhook_handle)
357 !
358 !$OMP BARRIER
359 !
360 !$OMP SINGLE
361 nworkb=0
362 !
363  CALL io_buff(&
364  hrec,'W',lwork0)
365 !$OMP END SINGLE
366 !
367 IF (lwork0 .AND. lhook) CALL dr_hook('MODE_WRITE_SURF_FA:WRITE_SURFX1_FA',1,zhook_handle)
368 IF (lwork0) RETURN
369 !
370 IF(hdir=='H')THEN
371  CALL gather_and_write_mpi(pfield,zwork,nmask)
372 ELSE !no horizontal dim. case (not masked)
373  zwork(1:kl)=pfield(1:kl)
374  zwork(kl+1:nfull)=sum(pfield(1:kl))/REAL(kl)
375 ENDIF
376 !
377 IF (nrank==npio) THEN
378  !
379 #ifdef SFX_MPI
380  xtime0 = mpi_wtime()
381 #endif
382  !
383 !$OMP SINGLE
384  !
385  IF(lfanocompact)THEN
386  CALL faveur(nworkb,nunit_fa,ingrib,inbpdg,inbcsp,istron,ipuila,idmopl)
387  ! -- Pour ecrire sans compactage
388  CALL fagote(nworkb,nunit_fa,-1,inbpdg,inbcsp,istron,ipuila,idmopl)
389  CALL faienc(nworkb,nunit_fa,cprefix1d,0,hrec,zwork,.false.)
390  IF (nworkb/=0) CALL error_write_surf_fa(hrec,nworkb)
391  ! On remet la valeur par defaut
392  CALL fagote(nworkb,nunit_fa,ingrib,inbpdg,inbcsp,istron,ipuila,idmopl)
393  ELSE
394  zmean =0.0
395  zcount=0.0
396  DO i=1,nfull
397  IF(zwork(i)/=xundef)THEN
398  zmean =zmean+zwork(i)
399  zcount=zcount+1.0
400  ENDIF
401  ENDDO
402  IF (zcount.GT.0.0) zmean=zmean/zcount
403  WHERE(zwork(:)==xundef)zwork(:)=zmean
404  CALL faienc(nworkb,nunit_fa,cprefix1d,0,hrec,zwork,.false.)
405  IF (nworkb/=0) CALL error_write_surf_fa(hrec,nworkb)
406  ENDIF
407  !
408 !$OMP END SINGLE
409  !
410 #ifdef SFX_MPI
411  xtime_npio_write = xtime_npio_write + (mpi_wtime() - xtime0)
412 #endif
413  !
414 ENDIF
415 !
416 kresp = nworkb
417 !
418 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_FA:WRITE_SURFX1_FA',1,zhook_handle)
419 !
420 END SUBROUTINE write_surfx1_fa
421 !
422 ! #############################################################
423  SUBROUTINE write_surfx2_fa (&
424  hrec,kl1,kl2,pfield,kresp,hcomment,hdir)
425 ! #############################################################
426 !
427 !!**** * - routine to fill a write 2D array for the externalised surface
428 !
429 !
430 !
431 !
432 USE modd_surfex_mpi, ONLY : nrank, npio, xtime_npio_write
433 !
434 USE modd_surfex_omp, ONLY : lwork0, nworkb
435 !
436 USE modd_io_surf_fa, ONLY : nunit_fa, nmask, nfull, &
437  cprefix2d, lfanocompact
438 USE modd_surf_par, ONLY : xundef
439 !
440 USE modi_io_buff
441 USE modi_error_write_surf_fa
443 !
444 USE yomhook ,ONLY : lhook, dr_hook
445 USE parkind1 ,ONLY : jprb
446 !
447 IMPLICIT NONE
448 !
449 #ifdef SFX_MPI
450 include "mpif.h"
451 #endif
452 !
453 !* 0.1 Declarations of arguments
454 !
455 !
456 !
457  CHARACTER(LEN=12), INTENT(IN) :: hrec ! name of the article to be read
458 INTEGER, INTENT(IN) :: kl1 ! number of points
459 INTEGER, INTENT(IN) :: kl2 ! 2nd dimension
460 REAL, DIMENSION(KL1,KL2), INTENT(IN) :: pfield ! array containing the data field
461 INTEGER, INTENT(OUT):: kresp ! KRESP : return-code if a problem appears
462  CHARACTER(LEN=100), INTENT(IN) :: hcomment ! comment string
463  CHARACTER(LEN=1), INTENT(IN) :: hdir ! type of field :
464  ! 'H' : field with
465  ! horizontal spatial dim.
466  ! '-' : no horizontal dim.
467 !* 0.2 Declarations of local variables
468 !
469  CHARACTER(LEN=4) :: yprefix
470  CHARACTER(LEN=3) :: ypatch
471 INTEGER :: i, jl ! loop counter
472 INTEGER :: ingrib,inbpdg,inbcsp,istron,ipuila,idmopl
473 REAL :: xtime0
474 REAL, DIMENSION(MAX(NFULL,SIZE(PFIELD,1)),SIZE(PFIELD,2)) :: zwork ! work array read in the file
475 REAL, DIMENSION(SIZE(PFIELD,2)) :: zmean, zcount
476 REAL(KIND=JPRB) :: zhook_handle
477 !
478 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_FA:WRITE_SURFX2_FA',0,zhook_handle)
479 !
480 !$OMP BARRIER
481 !
482 !$OMP SINGLE
483 nworkb=0
484 !
485  CALL io_buff(&
486  hrec,'W',lwork0)
487 !$OMP END SINGLE
488 !
489 IF (lwork0 .AND. lhook) CALL dr_hook('MODE_WRITE_SURF_FA:WRITE_SURFX2_FA',1,zhook_handle)
490 IF (lwork0) RETURN
491 !
492  CALL gather_and_write_mpi(pfield,zwork,nmask)
493 !
494 IF (nrank==npio) THEN
495  !
496 #ifdef SFX_MPI
497  xtime0 = mpi_wtime()
498 #endif
499  !
500 !$OMP SINGLE
501  !
502  IF(lfanocompact)THEN
503  CALL faveur(nworkb,nunit_fa,ingrib,inbpdg,inbcsp,istron,ipuila,idmopl)
504  ! -- Pour ecrire sans compactage
505  CALL fagote(nworkb,nunit_fa,-1,inbpdg,inbcsp,istron,ipuila,idmopl)
506  DO jl=1,SIZE(zwork,2)
507  WRITE(ypatch,'(I3.3)')jl
508  yprefix=cprefix2d//ypatch//'_'
509  CALL faienc(nworkb,nunit_fa,yprefix,0,hrec,zwork(:,jl),.false.)
510  IF (nworkb/=0) CALL error_write_surf_fa(hrec,nworkb)
511  END DO
512  ! On remet la valeur par defaut
513  CALL fagote(nworkb,nunit_fa,ingrib,inbpdg,inbcsp,istron,ipuila,idmopl)
514  ELSE
515  zmean(:)=0.0
516  zcount(:)=0.0
517  DO i=1,nfull
518  DO jl=1,SIZE(zwork,2)
519  IF(zwork(i,jl)/=xundef) THEN
520  zmean(jl)=zmean(jl)+zwork(i,jl)
521  zcount(jl)=zcount(jl)+1.0
522  ENDIF
523  ENDDO
524  ENDDO
525  WHERE(zcount(:)>0.0)zmean(:)=zmean(:)/zcount(:)
526  DO jl=1,SIZE(zwork,2)
527  WHERE(zwork(:,jl)==xundef)zwork(:,jl)=zmean(jl)
528  WRITE(ypatch,'(I3.3)')jl
529  yprefix=cprefix2d//ypatch//'_'
530  CALL faienc(nworkb,nunit_fa,yprefix,0,hrec,zwork(:,jl),.false.)
531  IF (nworkb/=0) CALL error_write_surf_fa(hrec,nworkb)
532  END DO
533  ENDIF
534  !
535 !$OMP END SINGLE
536  !
537 #ifdef SFX_MPI
538  xtime_npio_write = xtime_npio_write + (mpi_wtime() - xtime0)
539 #endif
540  !
541 ENDIF
542 !
543 kresp = nworkb
544 !
545 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_FA:WRITE_SURFX2_FA',1,zhook_handle)
546 !
547 END SUBROUTINE write_surfx2_fa
548 !
549 ! #############################################################
550  SUBROUTINE write_surfn1_fa (&
551  hrec,kl,kfield,kresp,hcomment,hdir)
552 ! #############################################################
553 !
554 !!**** * - routine to write an integer array
555 !
556 !
557 !
558 !
559 USE modd_surfex_mpi, ONLY : nrank, npio, xtime_npio_write
560 !
561 USE modd_surfex_omp, ONLY : lwork0, nworkb
562 !
563 USE modd_io_surf_fa, ONLY : nunit_fa, nmask, nfull, cprefix1d, lfanocompact
564 !
565 USE mode_fasurfex
566 !
567 USE modi_io_buff
568 USE modi_error_write_surf_fa
570 !
571 USE yomhook ,ONLY : lhook, dr_hook
572 USE parkind1 ,ONLY : jprb
573 !
574 IMPLICIT NONE
575 !
576 #ifdef SFX_MPI
577 include "mpif.h"
578 #endif
579 !
580 !* 0.1 Declarations of arguments
581 !
582 !
583 !
584  CHARACTER(LEN=12), INTENT(IN) :: hrec ! name of the article to be read
585 INTEGER, INTENT(IN) :: kl ! number of points
586 INTEGER, DIMENSION(KL), INTENT(IN) :: kfield ! array containing the data field
587 INTEGER, INTENT(OUT):: kresp ! KRESP : return-code if a problem appears
588  CHARACTER(LEN=100), INTENT(IN) :: hcomment ! comment string
589  CHARACTER(LEN=1), INTENT(IN) :: hdir ! type of field :
590  ! 'H' : field with
591  ! horizontal spatial dim.
592  ! '-' : no horizontal dim.
593 !* 0.2 Declarations of local variables
594 !
595  CHARACTER(LEN=18) :: yname! Field Nam
596 INTEGER :: ingrib,inbpdg,inbcsp,istron,ipuila,idmopl
597 INTEGER, DIMENSION(MAX(NFULL,SIZE(KFIELD))) :: iwork ! work array read in the file
598 REAL :: xtime0
599 REAL(KIND=JPRB) :: zhook_handle
600 !
601 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_FA:WRITE_SURFN1_FA',0,zhook_handle)
602 !
603 !$OMP SINGLE
604 nworkb = 0
605 !
606  CALL io_buff(&
607  hrec,'W',lwork0)
608 !$OMP END SINGLE
609 !
610 IF (lwork0 .AND. lhook) CALL dr_hook('MODE_WRITE_SURF_FA:WRITE_SURFN1_FA',1,zhook_handle)
611 IF (lwork0) RETURN
612 !
613 IF (hdir/='H' .OR. hrec=="-") THEN
614  iwork(1:kl) = kfield
615 ELSE
616  CALL gather_and_write_mpi(kfield,iwork,nmask)
617 ENDIF
618 !
619 IF (nrank==npio) THEN
620  !
621 #ifdef SFX_MPI
622  xtime0 = mpi_wtime()
623 #endif
624  !
625 !$OMP SINGLE
626  !
627  IF(lfanocompact)THEN
628  CALL faveur(nworkb,nunit_fa,ingrib,inbpdg,inbcsp,istron,ipuila,idmopl)
629  ! -- Pour ecrire sans compactage
630  CALL fagote(nworkb,nunit_fa,-1,inbpdg,inbcsp,istron,ipuila,idmopl)
631  ENDIF
632  !
633  yname=trim(cprefix1d)//trim(hrec)
634  !
635  CALL faecr_i_d(nworkb,nunit_fa,yname,kl,iwork(1:kl))
636  IF (nworkb/=0) CALL error_write_surf_fa(hrec,nworkb)
637  !
638  IF(lfanocompact)THEN
639  ! On remet la valeur par defaut
640  CALL fagote(nworkb,nunit_fa,ingrib,inbpdg,inbcsp,istron,ipuila,idmopl)
641  ENDIF
642  !
643 !$OMP END SINGLE
644  !
645 #ifdef SFX_MPI
646  xtime_npio_write = xtime_npio_write + (mpi_wtime() - xtime0)
647 #endif
648  !
649 ENDIF
650 !
651 kresp = nworkb
652 !
653 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_FA:WRITE_SURFN1_FA',1,zhook_handle)
654 RETURN
655 !
656 END SUBROUTINE write_surfn1_fa
657 !
658 ! #############################################################
659  SUBROUTINE write_surfl1_fa (&
660  hrec,kl,ofield,kresp,hcomment,hdir)
661 ! #############################################################
662 !
663 !!**** * - routine to write a logical array
664 !
665 !
666 !
667 !
668 USE modd_surfex_mpi, ONLY : nrank, npio, xtime_npio_write
669 !
670 USE modd_surfex_omp, ONLY : lwork0, nworkb
671 !
672 USE modd_io_surf_fa, ONLY : nunit_fa, cprefix1d, lfanocompact
673 !
674 USE mode_fasurfex
675 !
676 USE modi_io_buff
677 USE modi_error_write_surf_fa
678 !
679 USE yomhook ,ONLY : lhook, dr_hook
680 USE parkind1 ,ONLY : jprb
681 !
682 IMPLICIT NONE
683 !
684 #ifdef SFX_MPI
685 include "mpif.h"
686 #endif
687 !
688 !* 0.1 Declarations of arguments
689 !
690 !
691 !
692  CHARACTER(LEN=12), INTENT(IN) :: hrec ! name of the article to be read
693 INTEGER, INTENT(IN) :: kl ! number of points
694 LOGICAL, DIMENSION(KL), INTENT(IN) :: ofield ! array containing the data field
695 INTEGER, INTENT(OUT):: kresp ! KRESP : return-code if a problem appears
696  CHARACTER(LEN=100), INTENT(IN) :: hcomment ! comment string
697  CHARACTER(LEN=1), INTENT(IN) :: hdir ! type of field :
698  ! 'H' : field with
699  ! horizontal spatial dim.
700  ! '-' : no horizontal dim.
701 !* 0.2 Declarations of local variables
702 !
703  CHARACTER(LEN=18):: yname ! Field Name
704 INTEGER :: ingrib,inbpdg,inbcsp,istron,ipuila,idmopl
705 REAL :: xtime0
706 REAL(KIND=JPRB) :: zhook_handle
707 !
708 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_FA:WRITE_SURFL1_FA',0,zhook_handle)
709 !
710 !$OMP SINGLE
711 nworkb=0
712 !
713  CALL io_buff(&
714  hrec,'W',lwork0)
715 !$OMP END SINGLE
716 !
717 IF (lwork0 .AND. lhook) CALL dr_hook('MODE_WRITE_SURF_FA:WRITE_SURFL1_FA',1,zhook_handle)
718 IF (lwork0) RETURN
719 !
720 IF (nrank==npio) THEN
721  !
722 #ifdef SFX_MPI
723  xtime0 = mpi_wtime()
724 #endif
725  !
726 !$OMP SINGLE
727  !
728  IF(lfanocompact)THEN
729  CALL faveur(nworkb,nunit_fa,ingrib,inbpdg,inbcsp,istron,ipuila,idmopl)
730  ! -- Pour ecrire sans compactage
731  CALL fagote(nworkb,nunit_fa,-1,inbpdg,inbcsp,istron,ipuila,idmopl)
732  ENDIF
733  !
734  yname=trim(cprefix1d)//trim(hrec)
735  CALL faecr_l_d(nworkb,nunit_fa,yname,kl,ofield)
736  IF (nworkb/=0) CALL error_write_surf_fa(hrec,nworkb)
737  !
738  IF(lfanocompact)THEN
739  ! On remet la valeur par defaut
740  CALL fagote(nworkb,nunit_fa,ingrib,inbpdg,inbcsp,istron,ipuila,idmopl)
741  ENDIF
742  !
743 !$OMP END SINGLE
744  !
745 #ifdef SFX_MPI
746  xtime_npio_write = xtime_npio_write + (mpi_wtime() - xtime0)
747 #endif
748  !
749 ENDIF
750 !
751 kresp = nworkb
752 !
753 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_FA:WRITE_SURFL1_FA',1,zhook_handle)
754 !
755 END SUBROUTINE write_surfl1_fa
756 !
757 ! #############################################################
758  SUBROUTINE write_surft0_fa (&
759  hrec,kyear,kmonth,kday,ptime,kresp,hcomment)
760 ! #############################################################
761 !
762 !!**** * - routine to write a date
763 !
764 !
765 !
766 !
767 USE modd_surfex_omp, ONLY : lwork0
768 !
769 USE modd_io_surf_fa, ONLY : cprefix1d, nunit_fa, lfanocompact
770 !
771 USE mode_fasurfex
772 !
773 USE modi_io_buff
774 USE modi_error_write_surf_fa
775 !
776 USE yomhook ,ONLY : lhook, dr_hook
777 USE parkind1 ,ONLY : jprb
778 !
779 IMPLICIT NONE
780 !
781 !* 0.1 Declarations of arguments
782 !
783 !
784 !
785  CHARACTER(LEN=12), INTENT(IN) :: hrec ! name of the article to be read
786 INTEGER, INTENT(IN) :: kyear ! year
787 INTEGER, INTENT(IN) :: kmonth ! month
788 INTEGER, INTENT(IN) :: kday ! day
789 REAL, INTENT(IN) :: ptime ! time
790 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
791  CHARACTER(LEN=100), INTENT(IN) :: hcomment ! comment string
792 
793 !* 0.2 Declarations of local variables
794 !
795  CHARACTER(LEN=18) :: yname ! Field Name
796 INTEGER :: iret
797 INTEGER :: ihour, imin, isec
798 INTEGER :: ingrib,inbpdg,inbcsp,istron,ipuila,idmopl
799 INTEGER, DIMENSION(3) :: itdate
800 REAL(KIND=JPRB) :: zhook_handle
801 !
802 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_FA:WRITE_SURFT0_FA',0,zhook_handle)
803 !
804 kresp=0
805 !
806 IF (hrec=='DTCUR') THEN
807 !
808  ihour = floor(ptime)/3600
809  imin = floor(ptime)/60 - ihour * 60
810  isec = nint(ptime) - ihour * 3600 - imin * 60
811  CALL fandar(iret,nunit_fa,(/ kyear, kmonth, kday, ihour, imin, isec, 0, 0, 0, 0, 0 /))
812 !
813 ELSE
814 !
815  CALL io_buff(&
816  hrec,'W',lwork0)
817  IF (lwork0 .AND. lhook) CALL dr_hook('MODE_WRITE_SURF_FA:WRITE_SURFT0_FA',1,zhook_handle)
818  IF (lwork0) RETURN
819 !
820 END IF
821 !
822 itdate(1) = kyear
823 itdate(2) = kmonth
824 itdate(3) = kday
825 !
826 IF(lfanocompact)THEN
827  CALL faveur(kresp,nunit_fa,ingrib,inbpdg,inbcsp,istron,ipuila,idmopl)
828  ! -- Pour ecrire sans compactage
829  CALL fagote(kresp,nunit_fa,-1,inbpdg,inbcsp,istron,ipuila,idmopl)
830 ENDIF
831 !
832 yname=trim(cprefix1d)//trim(hrec)//'%TDATE'
833  CALL faecr_i_d(kresp,nunit_fa,yname,3,itdate)
834 IF (kresp/=0) THEN
835  CALL error_write_surf_fa(hrec,kresp)
836 ENDIF
837 !
838 yname=trim(cprefix1d)//trim(hrec)//'%TIME'
839  CALL faecr_r(kresp,nunit_fa,yname,ptime)
840 IF (kresp/=0) THEN
841  CALL error_write_surf_fa(hrec,kresp)
842 ENDIF
843 !
844 IF(lfanocompact)THEN
845  ! On remet la valeur par defaut
846  CALL fagote(kresp,nunit_fa,ingrib,inbpdg,inbcsp,istron,ipuila,idmopl)
847 ENDIF
848 !
849 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_FA:WRITE_SURFT0_FA',1,zhook_handle)
850 !
851 END SUBROUTINE write_surft0_fa
852 !
853 ! #############################################################
854  SUBROUTINE write_surft2_fa (&
855  hrec,kl1,kl2,kyear,kmonth,kday,ptime,kresp,hcomment)
856 ! #############################################################
857 !
858 !!**** * - routine to write a date
859 !
860 !
861 !
862 !
863 USE modd_surfex_mpi, ONLY : nrank, npio, xtime_npio_write
864 !
865 USE modd_surfex_omp, ONLY : lwork0, nworkb
866 !
867 USE modd_io_surf_fa, ONLY : nunit_fa, cprefix1d, nluout
868 !
869 USE mode_fasurfex
870 !
871 USE modi_io_buff
872 USE modi_abor1_sfx
873 USE modi_error_write_surf_fa
874 !
875 USE yomhook ,ONLY : lhook, dr_hook
876 USE parkind1 ,ONLY : jprb
877 !
878 IMPLICIT NONE
879 !
880 #ifdef SFX_MPI
881 include "mpif.h"
882 #endif
883 !
884 !* 0.1 Declarations of arguments
885 !
886 !
887 !
888  CHARACTER(LEN=12), INTENT(IN) :: hrec ! name of the article to be read
889 INTEGER, INTENT(IN) :: kl1 ! number of points
890 INTEGER, INTENT(IN) :: kl2 ! 2nd dimension
891 INTEGER, DIMENSION(KL1,KL2), INTENT(IN) :: kyear ! year
892 INTEGER, DIMENSION(KL1,KL2), INTENT(IN) :: kmonth ! month
893 INTEGER, DIMENSION(KL1,KL2), INTENT(IN) :: kday ! day
894 REAL, DIMENSION(KL1,KL2), INTENT(IN) :: ptime ! time
895 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
896  CHARACTER(LEN=100), INTENT(IN) :: hcomment ! comment string
897 
898 !* 0.2 Declarations of local variables
899 !
900  CHARACTER(LEN=18):: yname ! Field Name
901 INTEGER, DIMENSION(3,SIZE(KYEAR,1),SIZE(KYEAR,2)) :: itdate
902 REAL :: xtime0
903 REAL(KIND=JPRB) :: zhook_handle
904 !
905 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_FA:WRITE_SURFT2_FA',0,zhook_handle)
906 !
907 !$OMP SINGLE
908 nworkb = 0
909 !
910  CALL io_buff(&
911  hrec,'W',lwork0)
912 !$OMP END SINGLE
913 !
914 IF (lwork0 .AND. lhook) CALL dr_hook('MODE_WRITE_SURF_FA:WRITE_SURFT2_FA',1,zhook_handle)
915 IF (lwork0) RETURN
916 !
917 IF (nrank==npio) THEN
918  !
919 #ifdef SFX_MPI
920  xtime0 = mpi_wtime()
921 #endif
922  !
923 !$OMP SINGLE
924  !
925  itdate(1,:,:) = kyear(:,:)
926  itdate(2,:,:) = kmonth(:,:)
927  itdate(3,:,:) = kday(:,:)
928  !
929 !$OMP END SINGLE
930  !
931  yname=trim(cprefix1d)//trim(hrec)
932  WRITE(nluout,*) ' WRITE_SURFT2_FA : time in 2 dimensions not yet implemented : YNAME=',yname,'ITDATE=',itdate
933  CALL abor1_sfx('MODE_WRITE_SURF_FA:WRITE_SURFT2_FA: time in 2 dimensions not yet implemented')
934  !
935 #ifdef SFX_MPI
936  xtime_npio_write = xtime_npio_write + (mpi_wtime() - xtime0)
937 #endif
938  !
939 ENDIF
940 !
941 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_FA:WRITE_SURFT2_FA',1,zhook_handle)
942 !
943 END SUBROUTINE write_surft2_fa
944 !
945 END MODULE mode_write_surf_fa
subroutine error_write_surf_fa(HREC, KRESP)
subroutine faecr_r(KREP, KN, CNOMC, PDATA)
subroutine write_surfx2_fa(HREC, KL1, KL2, PFIELD, KRESP, HCOMMENT, HDIR)
subroutine write_surfn1_fa(HREC, KL, KFIELD, KRESP, HCOMMENT, HDIR)
subroutine faecr_c(KREP, KN, CNOMC, KSIZE, CDATA)
subroutine write_surfl0_fa(HREC, OFIELD, KRESP, HCOMMENT)
subroutine faecr_i_d(KREP, KN, CNOMC, KSIZE, KDATA)
subroutine faecr_l_d(KREP, KN, CNOMC, KSIZE, LDATA)
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:6
subroutine write_surfx1_fa(HREC, KL, PFIELD, KRESP, HCOMMENT, HDIR)
subroutine write_surfc0_fa(HREC, HFIELD, KRESP, HCOMMENT)
subroutine wlog_mpi(HLOG, PLOG, KLOG, KLOG2, OLOG)
subroutine write_surfl1_fa(HREC, KL, OFIELD, KRESP, HCOMMENT, HDIR)
subroutine io_buff(HREC, HACTION, OKNOWN)
Definition: io_buff.F90:6
subroutine write_surfx0_fa(HREC, PFIELD, KRESP, HCOMMENT)
subroutine faecr_l(KREP, KN, CNOMC, LDATA)
subroutine write_surft0_fa(HREC, KYEAR, KMONTH, KDAY, PTIME, KRESP, HCOMMENT)
subroutine write_surfn0_fa(HREC, KFIELD, KRESP, HCOMMENT)
subroutine write_surft2_fa(HREC, KL1, KL2, KYEAR, KMONTH, KDAY, PTIME, KRESP, HCOMMENT)
subroutine faecr_i(KREP, KN, CNOMC, KDATA)