SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
mode_write_surf_lfi.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.
5 ! ######spl
7 !
8 #ifdef SFX_LFI
9 !
10 USE modi_get_luout
11 INTERFACE write_surf0_lfi
12  MODULE PROCEDURE write_surfx0_lfi
13  MODULE PROCEDURE write_surfn0_lfi
14  MODULE PROCEDURE write_surfl0_lfi
15  MODULE PROCEDURE write_surfc0_lfi
16 END INTERFACE
17 INTERFACE write_surfn_lfi
18  MODULE PROCEDURE write_surfx1_lfi
19  MODULE PROCEDURE write_surfn1_lfi
20  MODULE PROCEDURE write_surfl1_lfi
21  MODULE PROCEDURE write_surfx2_lfi
22 END INTERFACE
23 INTERFACE write_surft_lfi
24  MODULE PROCEDURE write_surft0_lfi
25  MODULE PROCEDURE write_surft1_lfi
26  MODULE PROCEDURE write_surft2_lfi
27 END INTERFACE
28 !
29  CONTAINS
30 !
31 ! #############################################################
32  SUBROUTINE write_surfx0_lfi (&
33  hrec,pfield,kresp,hcomment)
34 ! #############################################################
35 !
36 !!**** * - routine to write a real scalar
37 !
38 !
39 !
40 !
41 USE modd_surfex_omp, ONLY : lwork0
42 !
43 USE modd_io_surf_lfi, ONLY : cfileout_lfi, cluout_lfi
44 !
45 USE modi_io_buff
46 USE modi_fmwrit
47 USE modi_error_write_surf_lfi
48 !
49 USE yomhook ,ONLY : lhook, dr_hook
50 USE parkind1 ,ONLY : jprb
51 !
52 IMPLICIT NONE
53 !
54 !* 0.1 Declarations of arguments
55 !
56 !
57 !
58  CHARACTER(LEN=12), INTENT(IN) :: hrec ! name of the article to be read
59 REAL, INTENT(IN) :: pfield ! the real scalar to be read
60 INTEGER, INTENT(OUT):: kresp ! KRESP : return-code if a problem appears
61  CHARACTER(LEN=100), INTENT(IN) :: hcomment ! comment string
62 !
63 !* 0.2 Declarations of local variables
64 !
65 REAL(KIND=JPRB) :: zhook_handle
66 !
67 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_LFI:WRITE_SURFX0_LFI',0,zhook_handle)
68 !
69 kresp=0
70 !
71  CALL io_buff(&
72  hrec,'W',lwork0)
73 IF (lwork0 .AND. lhook) CALL dr_hook('MODE_WRITE_SURF_LFI:WRITE_SURFX0_LFI',1,zhook_handle)
74 IF (lwork0) RETURN
75 !
76  CALL fmwritx0(cfileout_lfi,hrec,cluout_lfi,1,pfield,4,100,hcomment,kresp)
77 !
78  CALL error_write_surf_lfi(hrec,kresp)
79 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_LFI:WRITE_SURFX0_LFI',1,zhook_handle)
80 !
81 END SUBROUTINE write_surfx0_lfi
82 !
83 ! #############################################################
84  SUBROUTINE write_surfn0_lfi (&
85  hrec,kfield,kresp,hcomment)
86 ! #############################################################
87 !
88 !!**** * - routine to write an integer
89 !
90 !
91 !
92 !
93 USE modd_surfex_omp, ONLY : lwork0
94 !
95 USE modd_io_surf_lfi, ONLY : cfileout_lfi, cluout_lfi, &
96  lmnh_compatible, niu, nib, nie, nju, njb, nje
97 !
98 USE modi_io_buff
99 USE modi_fmwrit
100 USE modi_error_write_surf_lfi
101 !
102 USE yomhook ,ONLY : lhook, dr_hook
103 USE parkind1 ,ONLY : jprb
104 !
105 IMPLICIT NONE
106 !
107 !* 0.1 Declarations of arguments
108 !
109 !
110 !
111  CHARACTER(LEN=12), INTENT(IN) :: hrec ! name of the article to be read
112 INTEGER, INTENT(IN) :: kfield ! the integer to be read
113 INTEGER, INTENT(OUT):: kresp ! KRESP : return-code if a problem appears
114  CHARACTER(LEN=100), INTENT(IN) :: hcomment ! comment string
115 !
116 !* 0.2 Declarations of local variables
117 !
118 REAL(KIND=JPRB) :: zhook_handle
119 !
120 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_LFI:WRITE_SURFN0_LFI',0,zhook_handle)
121 !
122 kresp=0
123 !
124 IF (lmnh_compatible .AND. hrec=='IMAX') THEN
125  niu = kfield+2
126  nib = 2
127  nie = kfield+1
128 END IF
129 IF (lmnh_compatible .AND. hrec=='JMAX') THEN
130  nju = kfield+2
131  njb = 2
132  nje = kfield+1
133 END IF
134 !
135  CALL io_buff(&
136  hrec,'W',lwork0)
137 IF (lwork0 .AND. lhook) CALL dr_hook('MODE_WRITE_SURF_LFI:WRITE_SURFN0_LFI',1,zhook_handle)
138 IF (lwork0) RETURN
139 !
140  CALL fmwritn0(cfileout_lfi,hrec,cluout_lfi,1,kfield,4,100,hcomment,kresp)
141 !
142  CALL error_write_surf_lfi(hrec,kresp)
143 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_LFI:WRITE_SURFN0_LFI',1,zhook_handle)
144 !
145 END SUBROUTINE write_surfn0_lfi
146 !
147 ! #############################################################
148  SUBROUTINE write_surfl0_lfi (&
149  hrec,ofield,kresp,hcomment)
150 ! #############################################################
151 !
152 !!**** * - routine to write a logical
153 !
154 !
155 !
156 !
157 USE modd_surfex_omp, ONLY : lwork0
158 !
159 USE modd_io_surf_lfi, ONLY : cfileout_lfi, cluout_lfi
160 !
161 USE modi_io_buff
162 USE modi_fmwrit
163 USE modi_error_write_surf_lfi
164 !
165 USE yomhook ,ONLY : lhook, dr_hook
166 USE parkind1 ,ONLY : jprb
167 !
168 IMPLICIT NONE
169 !
170 !* 0.1 Declarations of arguments
171 !
172 !
173 !
174  CHARACTER(LEN=12), INTENT(IN) :: hrec ! name of the article to be read
175 LOGICAL, INTENT(IN) :: ofield ! array containing the data field
176 INTEGER, INTENT(OUT):: kresp ! KRESP : return-code if a problem appears
177  CHARACTER(LEN=100), INTENT(IN) :: hcomment ! comment string
178 !
179 !* 0.2 Declarations of local variables
180 !
181 REAL(KIND=JPRB) :: zhook_handle
182 !
183 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_LFI:WRITE_SURFL0_LFI',0,zhook_handle)
184 !
185 kresp=0
186 !
187  CALL io_buff(&
188  hrec,'W',lwork0)
189 IF (lwork0 .AND. lhook) CALL dr_hook('MODE_WRITE_SURF_LFI:WRITE_SURFL0_LFI',1,zhook_handle)
190 IF (lwork0) RETURN
191 !
192  CALL fmwritl0(cfileout_lfi,hrec,cluout_lfi,1,ofield,4,100,hcomment,kresp)
193 !
194  CALL error_write_surf_lfi(hrec,kresp)
195 !
196 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_LFI:WRITE_SURFL0_LFI',1,zhook_handle)
197 !
198 END SUBROUTINE write_surfl0_lfi
199 !
200 ! #############################################################
201  SUBROUTINE write_surfc0_lfi (&
202  hrec,hfield,kresp,hcomment)
203 ! #############################################################
204 !
205 !!**** * - routine to write a character
206 !
207 !
208 !
209 !
210 USE modd_surfex_omp, ONLY : lwork0
211 !
212 USE modd_io_surf_lfi, ONLY : cfileout_lfi, cluout_lfi, lmnh_compatible, lcartesian
213 !
214 USE modi_io_buff
215 USE modi_fmwrit
216 USE modi_error_write_surf_lfi
217 !
218 USE yomhook ,ONLY : lhook, dr_hook
219 USE parkind1 ,ONLY : jprb
220 !
221 IMPLICIT NONE
222 !
223 !* 0.1 Declarations of arguments
224 !
225 !
226 !
227  CHARACTER(LEN=12), INTENT(IN) :: hrec ! name of the article to be read
228  CHARACTER(LEN=40), INTENT(IN) :: hfield ! the integer to be read
229 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
230  CHARACTER(LEN=100), INTENT(IN) :: hcomment ! comment string
231 !
232 !* 0.2 Declarations of local variables
233 !
234 REAL(KIND=JPRB) :: zhook_handle
235 !
236 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_LFI:WRITE_SURFC0_LFI',0,zhook_handle)
237 !
238 kresp=0
239 !
240  CALL io_buff(&
241  hrec,'W',lwork0)
242 IF (lwork0 .AND. lhook) CALL dr_hook('MODE_WRITE_SURF_LFI:WRITE_SURFC0_LFI',1,zhook_handle)
243 IF (lwork0) RETURN
244 !
245  CALL fmwritc0(cfileout_lfi,hrec,cluout_lfi,1,hfield,4,100,hcomment,kresp)
246 !
247 IF (hrec=="GRID_TYPE") lmnh_compatible = (hfield=="CARTESIAN " .OR. hfield=="CONF PROJ ")
248 IF (hrec=="GRID_TYPE" .AND. lmnh_compatible) lcartesian=(hfield=="CARTESIAN ")
249 !
250  CALL error_write_surf_lfi(hrec,kresp)
251 !
252 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_LFI:WRITE_SURFC0_LFI',1,zhook_handle)
253 !
254 END SUBROUTINE write_surfc0_lfi
255 !
256 ! #############################################################
257  SUBROUTINE write_surfx1_lfi (&
258  hrec,pfield,kresp,hcomment,hdir)
259 ! #############################################################
260 !
261 !!**** * - routine to fill a write 1D array for the externalised surface
262 !
263 !
264 !
265 !
266 USE modd_surfex_mpi, ONLY : nrank, npio, xtime_npio_write
267 !
268 USE modd_surfex_omp, ONLY : lwork0, nworkb
269 !
270 USE modd_io_surf_lfi, ONLY : cfileout_lfi, cluout_lfi, nmask, nfull, &
271  lmnh_compatible, niu, nib, nie, nju, njb, nje
272 !
273 USE modi_io_buff
274 USE modi_fmwrit
275 USE modi_error_write_surf_lfi
277 USE modi_get_surf_undef
278 !
279 USE yomhook ,ONLY : lhook, dr_hook
280 USE parkind1 ,ONLY : jprb
281 !
282 IMPLICIT NONE
283 !
284 #ifdef SFX_MPI
285 include "mpif.h"
286 #endif
287 !
288 !* 0.1 Declarations of arguments
289 !
290 !
291 !
292  CHARACTER(LEN=12), INTENT(IN) :: hrec ! name of the article to be read
293 REAL, DIMENSION(:), INTENT(IN) :: pfield ! array containing the data field
294 INTEGER, INTENT(OUT):: kresp ! KRESP : return-code if a problem appears
295  CHARACTER(LEN=100), INTENT(IN) :: hcomment ! comment string
296  CHARACTER(LEN=1), INTENT(IN) :: hdir ! type of field :
297  ! 'H' : field with
298  ! horizontal spatial dim.
299  ! '-' : no horizontal dim.
300 !* 0.2 Declarations of local variables
301 !
302  CHARACTER(LEN=20) :: yrec
303 INTEGER :: ji, jj
304 DOUBLE PRECISION :: xtime0
305 REAL :: zundef ! default value
306 REAL, DIMENSION(MAX(NFULL,SIZE(PFIELD))) :: zwork ! work array read in the file
307 REAL, DIMENSION(NIU,NJU) :: zwork2d ! work array read in a MNH file
308 REAL(KIND=JPRB) :: zhook_handle
309 !
310 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_LFI:WRITE_SURFX1_LFI',0,zhook_handle)
311 !
312 !$OMP BARRIER
313 !
314 !$OMP SINGLE
315 !
316 nworkb=0
317 !
318  CALL io_buff(&
319  hrec,'W',lwork0)
320 !
321 !$OMP END SINGLE
322 !
323 IF (lwork0 .AND. lhook) CALL dr_hook('MODE_WRITE_SURF_LFI:WRITE_SURFX1_LFI',1,zhook_handle)
324 IF (lwork0) RETURN
325 !
326 IF (hdir=='H') CALL gather_and_write_mpi(pfield,zwork,nmask)
327 !
328 IF (nrank==npio) THEN
329  !
330 !$OMP SINGLE
331  !
332 #ifdef SFX_MPI
333  xtime0 = mpi_wtime()
334 #endif
335  !
336  IF (hdir=='H') THEN
337  !
338  CALL get_surf_undef(zundef)
339  !
340  IF (.NOT. lmnh_compatible) THEN
341  CALL fmwritx1(cfileout_lfi,hrec,cluout_lfi,nfull,zwork,4,100,hcomment,nworkb)
342  CALL error_write_surf_lfi(hrec,nworkb)
343  ELSE
344  !
345  zwork2d(:,:) = zundef
346  DO jj=1,nje-njb+1
347  DO ji=1,nie-nib+1
348  zwork2d(nib+ji-1,njb+jj-1) = zwork(ji+(nie-nib+1)*(jj-1))
349  END DO
350  END DO
351  !
352  IF (hrec=='DX ' .OR. hrec=='XX ') THEN
353  yrec = 'XHAT'
354  CALL write_in_lfi_x1_for_mnh(hrec,yrec,zwork2d(nib:nie,njb),nworkb,hcomment,niu,nib,nie)
355  ELSEIF (hrec=='DY ' .OR. hrec=='YY ') THEN
356  yrec = 'YHAT'
357  CALL write_in_lfi_x1_for_mnh(hrec,yrec,zwork2d(nib,njb:nje),nworkb,hcomment,nju,njb,nje)
358  ELSEIF (njb==nje) THEN
359  yrec = hrec
360  CALL write_in_lfi_x1_for_mnh(hrec,yrec,zwork2d(:,njb),nworkb,hcomment,niu,nib,nie)
361  ELSEIF (nib==nie) THEN
362  yrec = hrec
363  CALL write_in_lfi_x1_for_mnh(hrec,yrec,zwork2d(nib,:),nworkb,hcomment,nju,njb,nje)
364  ELSE
365  CALL fmwritx2(cfileout_lfi,hrec,cluout_lfi,SIZE(zwork2d),zwork2d,4,100,hcomment,nworkb)
366  CALL error_write_surf_lfi(hrec,nworkb)
367  ENDIF
368  !
369  END IF
370  !
371  ELSE
372  CALL fmwritx1(cfileout_lfi,hrec,cluout_lfi,SIZE(pfield),pfield,4,100,hcomment,nworkb)
373  CALL error_write_surf_lfi(hrec,nworkb)
374  END IF
375  !
376 !$OMP END SINGLE
377  !
378 #ifdef SFX_MPI
379  xtime_npio_write = xtime_npio_write + (mpi_wtime() - xtime0)
380 #endif
381  !
382 ENDIF
383 !
384 kresp = nworkb
385 !
386 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_LFI:WRITE_SURFX1_LFI',1,zhook_handle)
387 !
388  CONTAINS
389 !
390 ! #############################################################
391  SUBROUTINE write_in_lfi_x1_for_mnh(HREC,HREC2,PFIELD,KRESP,HCOMMENT,KU,KB,KE)
392 ! #############################################################
393 !
394 !!**** * - routine to fill a write 2D array for the externalised surface
395 !
396 IMPLICIT NONE
397 !
398 !* 0.1 Declarations of arguments
399 !
400  CHARACTER(LEN=12), INTENT(IN) :: hrec ! name of the article to be read
401  CHARACTER(LEN=20), INTENT(IN) :: hrec2 ! name of the article to be read
402 REAL, DIMENSION(:), INTENT(IN) :: pfield ! array containing the data field
403 INTEGER, INTENT(OUT):: kresp ! KRESP : return-code if a problem appears
404  CHARACTER(LEN=100), INTENT(IN) :: hcomment ! comment string
405 INTEGER, INTENT(IN) :: ku
406 INTEGER, INTENT(IN) :: kb
407 INTEGER, INTENT(IN) :: ke
408 !
409 !* 0.2 Declarations of local variables
410 !
411 REAL, DIMENSION(KU) :: zwork ! 1D work array read in the file
412 REAL(KIND=JPRB) :: zhook_handle
413 !
414 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_LFI:WRITE_SURFX1_LFI:WRITE_IN_LFI_X1_FOR_MNH',0,zhook_handle)
415 !
416 zwork(:) = 0.
417 !
418 SELECT CASE(hrec)
419  !
420  CASE('DX ','DY ')
421  IF (kb/=ke) THEN
422  IF (lhook) CALL dr_hook('MODE_WRITE_SURF_LFI:WRITE_SURFX1_LFI:WRITE_IN_LFI_X1_FOR_MNH',1,zhook_handle)
423  RETURN
424  ENDIF
425  zwork(1) = - pfield(1)*0.5 ! 1D case
426  zwork(2) = pfield(1)*0.5
427  zwork(3) = pfield(1)*1.5
428  !
429  CASE('XX ','YY ')
430  IF (kb==ke) THEN
431  IF (lhook) CALL dr_hook('MODE_WRITE_SURF_LFI:WRITE_SURFX1_LFI:WRITE_IN_LFI_X1_FOR_MNH',1,zhook_handle)
432  RETURN
433  ENDIF
434  zwork(kb+1:ke) = 0.5 * pfield(1:ke-2) + 0.5 * pfield(2:ke-1)
435  zwork(kb) = 1.5 * pfield(1) - 0.5 * pfield(2)
436  zwork(kb-1) = 2. * zwork(kb) - zwork(kb+1)
437  zwork(ke+1) = 2. * zwork(ke) - zwork(ke-1)
438  CASE default
439  zwork(:) = pfield(:)
440  !
441 END SELECT
442 !
443  CALL fmwritx1(cfileout_lfi,hrec2,cluout_lfi,ku,zwork,4,100,hcomment,kresp)
444  CALL error_write_surf_lfi(hrec2,kresp)
445 !
446 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_LFI:WRITE_SURFX1_LFI:WRITE_IN_LFI_X1_FOR_MNH',1,zhook_handle)
447 END SUBROUTINE write_in_lfi_x1_for_mnh
448 !
449 END SUBROUTINE write_surfx1_lfi
450 !
451 ! #############################################################
452  SUBROUTINE write_surfx2_lfi (&
453  hrec,pfield,kresp,hcomment,hdir)
454 ! #############################################################
455 !
456 !!**** * - routine to fill a write 2D array for the externalised surface
457 !
458 !
459 !
460 !
461 USE modd_surfex_mpi, ONLY : nrank, npio, xtime_npio_write
462 USE modd_surfex_omp, ONLY : lwork0, nworkb
463 !
464 USE modd_io_surf_lfi, ONLY : cfileout_lfi, cluout_lfi, nmask, nfull, &
465  lmnh_compatible, niu, nib, nie, nju, njb, nje
466 !
467 USE modi_io_buff
468 USE modi_fmwrit
469 USE modi_error_write_surf_lfi
471 USE modi_get_surf_undef
472 !
473 USE yomhook ,ONLY : lhook, dr_hook
474 USE parkind1 ,ONLY : jprb
475 !
476 IMPLICIT NONE
477 !
478 #ifdef SFX_MPI
479 include "mpif.h"
480 #endif
481 !
482 !* 0.1 Declarations of arguments
483 !
484 !
485 !
486  CHARACTER(LEN=12), INTENT(IN) :: hrec ! name of the article to be read
487 REAL, DIMENSION(:,:), INTENT(IN) :: pfield ! array containing the data field
488 INTEGER, INTENT(OUT):: kresp ! KRESP : return-code if a problem appears
489  CHARACTER(LEN=100), INTENT(IN) :: hcomment ! comment string
490  CHARACTER(LEN=1), INTENT(IN) :: hdir ! type of field :
491  ! 'H' : field with
492  ! horizontal spatial dim.
493  ! '-' : no horizontal dim.
494 !* 0.2 Declarations of local variables
495 !
496 DOUBLE PRECISION :: xtime0
497 REAL :: zundef ! default value
498 REAL, DIMENSION(MAX(NFULL,SIZE(PFIELD,1)),SIZE(PFIELD,2)) :: zwork ! work array read in the file
499 REAL(KIND=JPRB) :: zhook_handle
500 !
501 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_LFI:WRITE_SURFX2_LFI',0,zhook_handle)
502 !
503 !$OMP BARRIER
504 !
505 !$OMP SINGLE
506 !
507 nworkb=0
508 !
509  CALL io_buff(&
510  hrec,'W',lwork0)
511 !
512 !$OMP END SINGLE
513 !
514 IF (lwork0 .AND. lhook) CALL dr_hook('MODE_WRITE_SURF_LFI:WRITE_SURFX2_LFI',1,zhook_handle)
515 IF (lwork0) RETURN
516 !
517 IF (hdir=='H') CALL gather_and_write_mpi(pfield,zwork,nmask)
518 !
519 IF (nrank==npio) THEN
520  !
521 #ifdef SFX_MPI
522  xtime0 = mpi_wtime()
523 #endif
524  !
525 !$OMP SINGLE
526  !
527  IF (hdir=='H') THEN
528  !
529  CALL get_surf_undef(zundef)
530  !
531  IF (.NOT. lmnh_compatible) THEN
532  CALL fmwritx2(cfileout_lfi,hrec,cluout_lfi,SIZE(zwork),zwork,4,100,hcomment,nworkb)
533  CALL error_write_surf_lfi(hrec,nworkb)
534  ELSE
535  CALL write_in_lfi_x2_for_mnh(hrec,zwork,nworkb,hcomment)
536  END IF
537  !
538  ELSE
539  CALL fmwritx2(cfileout_lfi,hrec,cluout_lfi,SIZE(pfield),pfield,4,100,hcomment,nworkb)
540  CALL error_write_surf_lfi(hrec,nworkb)
541  END IF
542  !
543 !$OMP END SINGLE
544  !
545 #ifdef SFX_MPI
546  xtime_npio_write = xtime_npio_write + (mpi_wtime() - xtime0)
547 #endif
548  !
549 ENDIF
550 !
551 kresp = nworkb
552 !
553 !if (HREC=='ALBVIS_ISBA') stop
554 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_LFI:WRITE_SURFX2_LFI',1,zhook_handle)
555 !
556  CONTAINS
557 !
558 ! #############################################################
559  SUBROUTINE write_in_lfi_x2_for_mnh(HREC,PFIELD,KRESP,HCOMMENT)
560 ! #############################################################
561 !
562 !!**** * - routine to fill a write 2D array for the externalised surface
563 !
564 USE yomhook ,ONLY : lhook, dr_hook
565 USE parkind1 ,ONLY : jprb
566 !
567 IMPLICIT NONE
568 !
569 !* 0.1 Declarations of arguments
570 !
571  CHARACTER(LEN=12), INTENT(IN) :: hrec ! name of the article to be read
572 REAL, DIMENSION(:,:), INTENT(IN) :: pfield ! array containing the data field
573 INTEGER, INTENT(OUT):: kresp ! KRESP : return-code if a problem appears
574  CHARACTER(LEN=100), INTENT(IN) :: hcomment ! comment string
575 !
576 !* 0.2 Declarations of local variables
577 !
578 INTEGER :: ji, jj
579 REAL :: zundef
580 REAL, DIMENSION(NIU,NJU,SIZE(PFIELD,2)) :: zwork3d ! work array read in a MNH file
581 REAL(KIND=JPRB) :: zhook_handle
582 !
583 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_LFI:WRITE_SURFX2_LFI:WRITE_IN_LFI_X2_FOR_MNH',0,zhook_handle)
584 !
585  CALL get_surf_undef(zundef)
586 !
587 zwork3d=zundef
588 DO jj=1,nje-njb+1
589  DO ji=1,nie-nib+1
590  zwork3d(nib+ji-1,njb+jj-1,:) = pfield(ji+(nie-nib+1)*(jj-1),:)
591  END DO
592 END DO
593 !
594 IF (nje==njb) THEN
595  CALL fmwritx2(cfileout_lfi,hrec,cluout_lfi,SIZE(zwork3d,3)*niu,zwork3d(:,nje,:),4,100,hcomment,kresp)
596 ELSEIF (nie==nib) THEN
597  CALL fmwritx2(cfileout_lfi,hrec,cluout_lfi,SIZE(zwork3d,3)*nju,zwork3d(nie,:,:),4,100,hcomment,kresp)
598 ELSE
599  CALL fmwritx3(cfileout_lfi,hrec,cluout_lfi,SIZE(zwork3d),zwork3d,4,100,hcomment,kresp)
600 ENDIF
601 !
602  CALL error_write_surf_lfi(hrec,kresp)
603 !
604 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_LFI:WRITE_SURFX2_LFI:WRITE_IN_LFI_X2_FOR_MNH',1,zhook_handle)
605 END SUBROUTINE write_in_lfi_x2_for_mnh
606 !
607 END SUBROUTINE write_surfx2_lfi
608 !
609 ! #############################################################
610  SUBROUTINE write_surfn1_lfi (&
611  hrec,kfield,kresp,hcomment,hdir)
612 ! #############################################################
613 !
614 !!**** * - routine to write an integer array
615 !
616 !
617 !
618 !
619 USE modd_surfex_mpi, ONLY : nrank, npio, xtime_npio_write
620 USE modd_surfex_omp, ONLY : lwork0, nworkb
621 !
622 USE modd_io_surf_lfi, ONLY : cfileout_lfi, cluout_lfi, nmask, nfull
623 !
624 USE modi_io_buff
625 USE modi_fmwrit
626 USE modi_error_write_surf_lfi
628 !
629 USE yomhook ,ONLY : lhook, dr_hook
630 USE parkind1 ,ONLY : jprb
631 !
632 IMPLICIT NONE
633 !
634 #ifdef SFX_MPI
635 include "mpif.h"
636 #endif
637 !
638 !* 0.1 Declarations of arguments
639 !
640 !
641 !
642  CHARACTER(LEN=12), INTENT(IN) :: hrec ! name of the article to be read
643 INTEGER, DIMENSION(:), INTENT(IN) :: kfield ! the integer to be read
644 INTEGER, INTENT(OUT):: kresp ! KRESP : return-code if a problem appears
645  CHARACTER(LEN=100), INTENT(IN) :: hcomment ! comment string
646  CHARACTER(LEN=1), INTENT(IN) :: hdir ! type of field :
647  ! 'H' : field with
648  ! horizontal spatial dim.
649  ! '-' : no horizontal dim.
650 !* 0.2 Declarations of local variables
651 !
652 INTEGER, DIMENSION(MAX(NFULL,SIZE(KFIELD))) :: iwork ! work array read in the file
653 DOUBLE PRECISION :: xtime0
654 REAL(KIND=JPRB) :: zhook_handle
655 !
656 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_LFI:WRITE_SURFN1_LFI',0,zhook_handle)
657 !
658 !$OMP SINGLE
659 !
660 nworkb=0
661 !
662  CALL io_buff(&
663  hrec,'W',lwork0)
664 !
665 !$OMP END SINGLE
666 !
667 IF (lwork0 .AND. lhook) CALL dr_hook('MODE_WRITE_SURF_LFI:WRITE_SURFN1_LFI',1,zhook_handle)
668 IF (lwork0) RETURN
669 !
670 IF (hdir=='H') CALL gather_and_write_mpi(kfield,iwork,nmask)
671 !
672 IF (nrank==npio) THEN
673  !
674 #ifdef SFX_MPI
675  xtime0 = mpi_wtime()
676 #endif
677  !
678 !$OMP SINGLE
679  !
680  IF (hdir=='H') THEN
681  CALL fmwritn1(cfileout_lfi,hrec,cluout_lfi,nfull,iwork,4,100,hcomment,nworkb)
682  ELSE
683  CALL fmwritn1(cfileout_lfi,hrec,cluout_lfi,SIZE(kfield),kfield,4,100,hcomment,nworkb)
684  END IF
685  !
686 !$OMP END SINGLE
687  !
688  CALL error_write_surf_lfi(hrec,nworkb)
689  !
690 #ifdef SFX_MPI
691  xtime_npio_write = xtime_npio_write + (mpi_wtime() - xtime0)
692 #endif
693  !
694 ENDIF
695 !
696 kresp = nworkb
697 !
698 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_LFI:WRITE_SURFN1_LFI',1,zhook_handle)
699 !
700 END SUBROUTINE write_surfn1_lfi
701 !
702 ! #############################################################
703  SUBROUTINE write_surfl1_lfi (&
704  hrec,ofield,kresp,hcomment,hdir)
705 ! #############################################################
706 !
707 !!**** * - routine to write a logical array
708 !
709 !
710 !
711 !
712 USE modd_surfex_mpi, ONLY : nrank, npio, xtime_npio_write
713 USE modd_surfex_omp, ONLY : lwork0, nworkb
714 !
715 USE modd_io_surf_lfi, ONLY : cfileout_lfi, cluout_lfi
716 !
717 USE modi_io_buff
718 USE modi_get_luout
719 USE modi_fmwrit
720 USE modi_abor1_sfx
721 USE modi_error_write_surf_lfi
722 !
723 USE yomhook ,ONLY : lhook, dr_hook
724 USE parkind1 ,ONLY : jprb
725 !
726 IMPLICIT NONE
727 !
728 #ifdef SFX_MPI
729 include "mpif.h"
730 #endif
731 !
732 !* 0.1 Declarations of arguments
733 !
734 !
735 !
736  CHARACTER(LEN=12), INTENT(IN) :: hrec ! name of the article to be read
737 LOGICAL, DIMENSION(:), INTENT(IN) :: ofield ! array containing the data field
738 INTEGER, INTENT(OUT):: kresp ! KRESP : return-code if a problem appears
739  CHARACTER(LEN=100), INTENT(IN) :: hcomment ! comment string
740  CHARACTER(LEN=1), INTENT(IN) :: hdir ! type of field :
741  ! 'H' : field with
742  ! horizontal spatial dim.
743  ! '-' : no horizontal dim.
744 !* 0.2 Declarations of local variables
745 !
746 INTEGER :: iluout ! listing logical unit
747 DOUBLE PRECISION :: xtime0
748 REAL(KIND=JPRB) :: zhook_handle
749 !
750 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_LFI:WRITE_SURFL1_LFI',0,zhook_handle)
751 !
752 !$OMP SINGLE
753 nworkb=0
754 !
755  CALL io_buff(&
756  hrec,'W',lwork0)
757 !$OMP END SINGLE
758 !
759 IF (lwork0 .AND. lhook) CALL dr_hook('MODE_WRITE_SURF_LFI:WRITE_SURFL1_LFI',1,zhook_handle)
760 IF (lwork0) RETURN
761 !
762 IF (nrank==npio) THEN
763  !
764 #ifdef SFX_MPI
765  xtime0 = mpi_wtime()
766 #endif
767  !
768  IF (hdir=='H') THEN
769  CALL get_luout('LFI ',iluout)
770  WRITE(iluout,*) 'Error: 1D logical vector for writing on an horizontal grid:'
771  WRITE(iluout,*) 'this option is not coded in WRITE_SURFL1_LFI'
772  CALL abor1_sfx('MODE_WRITE_SURF_LFI: 1D LOGICAL VECTOR FOR WRITING NOT CODED IN WRITE_SURFL1_LFI')
773  ELSE
774  !
775 !$OMP SINGLE
776  !
777  CALL fmwritl1(cfileout_lfi,hrec,cluout_lfi,SIZE(ofield),ofield,4,100,hcomment,nworkb)
778  !
779 !$OMP END SINGLE
780  !
781  CALL error_write_surf_lfi(hrec,nworkb)
782  END IF
783  !
784 #ifdef SFX_MPI
785  xtime_npio_write = xtime_npio_write + (mpi_wtime() - xtime0)
786 #endif
787  !
788 ENDIF
789 !
790 kresp = nworkb
791 !
792 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_LFI:WRITE_SURFL1_LFI',1,zhook_handle)
793 !
794 END SUBROUTINE write_surfl1_lfi
795 !
796 ! #############################################################
797  SUBROUTINE write_surft0_lfi (&
798  hrec,kyear,kmonth,kday,ptime,kresp,hcomment)
799 ! #############################################################
800 !
801 !!**** * - routine to write a date
802 !
803 !
804 !
805 !
806 USE modd_surfex_omp, ONLY : lwork0
807 !
808 USE modd_io_surf_lfi, ONLY : cfileout_lfi, cluout_lfi
809 !
810 USE modi_io_buff
811 USE modi_get_surf_undef
812 USE modi_fmwrit
813 USE modi_error_write_surf_lfi
814 !
815 USE yomhook ,ONLY : lhook, dr_hook
816 USE parkind1 ,ONLY : jprb
817 !
818 IMPLICIT NONE
819 !
820 !* 0.1 Declarations of arguments
821 !
822 !
823 !
824  CHARACTER(LEN=12), INTENT(IN) :: hrec ! name of the article to be read
825 INTEGER, INTENT(IN) :: kyear ! year
826 INTEGER, INTENT(IN) :: kmonth ! month
827 INTEGER, INTENT(IN) :: kday ! day
828 REAL, INTENT(IN) :: ptime ! time
829 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
830  CHARACTER(LEN=100), INTENT(IN) :: hcomment ! comment string
831 
832 !* 0.2 Declarations of local variables
833 !
834  CHARACTER(LEN=12) :: yrec ! Name of the article to be written
835 INTEGER, DIMENSION(3) :: itdate
836 REAL(KIND=JPRB) :: zhook_handle
837 !
838 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_LFI:WRITE_SURFT0_LFI',0,zhook_handle)
839 !
840 kresp=0
841 !
842  CALL io_buff(&
843  hrec,'W',lwork0)
844 IF (lwork0 .AND. lhook) CALL dr_hook('MODE_WRITE_SURF_LFI:WRITE_SURFT0_LFI',1,zhook_handle)
845 IF (lwork0) RETURN
846 !
847 itdate(1) = kyear
848 itdate(2) = kmonth
849 itdate(3) = kday
850 !
851 yrec=trim(hrec)//'%TDATE'
852  CALL fmwritn1(cfileout_lfi,yrec,cluout_lfi,3,itdate,4,100,hcomment,kresp)
853  CALL error_write_surf_lfi(hrec,kresp)
854 !
855 yrec=trim(hrec)//'%TIME'
856  CALL fmwritx0(cfileout_lfi,yrec,cluout_lfi,1,ptime,4,100,hcomment,kresp)
857  CALL error_write_surf_lfi(hrec,kresp)
858 !
859 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_LFI:WRITE_SURFT0_LFI',1,zhook_handle)
860 !
861 END SUBROUTINE write_surft0_lfi
862 !
863 ! #############################################################
864  SUBROUTINE write_surft1_lfi (&
865  hrec,kyear,kmonth,kday,ptime,kresp,hcomment)
866 ! #############################################################
867 !
868 !!**** * - routine to write a date
869 !
870 !
871 !
872 !
873 USE modd_surfex_mpi, ONLY : nrank, npio, xtime_npio_write
874 USE modd_surfex_omp, ONLY : lwork0, nworkb
875 !
876 USE modd_io_surf_lfi, ONLY : cfileout_lfi, cluout_lfi
877 !
878 USE modi_io_buff
879 USE modi_fmwrit
880 USE modi_error_write_surf_lfi
881 !
882 USE yomhook ,ONLY : lhook, dr_hook
883 USE parkind1 ,ONLY : jprb
884 !
885 IMPLICIT NONE
886 !
887 #ifdef SFX_MPI
888 include "mpif.h"
889 #endif
890 !
891 !* 0.1 Declarations of arguments
892 !
893 !
894 !
895  CHARACTER(LEN=12), INTENT(IN) :: hrec ! name of the article to be read
896 INTEGER, DIMENSION(:), INTENT(IN) :: kyear ! year
897 INTEGER, DIMENSION(:), INTENT(IN) :: kmonth ! month
898 INTEGER, DIMENSION(:), INTENT(IN) :: kday ! day
899 REAL, DIMENSION(:), INTENT(IN) :: ptime ! time
900 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
901  CHARACTER(LEN=100), INTENT(IN) :: hcomment ! comment string
902 
903 !* 0.2 Declarations of local variables
904 !
905  CHARACTER(LEN=12) :: yrec ! Name of the article to be written
906 INTEGER, DIMENSION(3,SIZE(KYEAR)) :: itdate
907 DOUBLE PRECISION :: xtime0
908 REAL(KIND=JPRB) :: zhook_handle
909 !
910 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_LFI:WRITE_SURFT1_LFI',0,zhook_handle)
911 !
912 !$OMP SINGLE
913 nworkb = 0
914 !
915  CALL io_buff(&
916  hrec,'W',lwork0)
917 !$OMP END SINGLE
918 !
919 IF (lwork0 .AND. lhook) CALL dr_hook('MODE_WRITE_SURF_LFI:WRITE_SURFT1_LFI',1,zhook_handle)
920 IF (lwork0) RETURN
921 !
922 IF (nrank==npio) THEN
923  !
924 #ifdef SFX_MPI
925  xtime0 = mpi_wtime()
926 #endif
927  !
928  kresp=0
929  !
930 !$OMP SINGLE
931  !
932  itdate(1,:) = kyear(:)
933  itdate(2,:) = kmonth(:)
934  itdate(3,:) = kday(:)
935  !
936  yrec=trim(hrec)//'%TDATE'
937  CALL fmwritn2(cfileout_lfi,yrec,cluout_lfi,SIZE(itdate),itdate,4,100,hcomment,nworkb)
938  !
939  yrec=trim(hrec)//'%TIME'
940  CALL fmwritx1(cfileout_lfi,yrec,cluout_lfi,SIZE(ptime),ptime,4,100,hcomment,nworkb)
941  !
942 !$OMP END SINGLE
943  !
944  CALL error_write_surf_lfi(hrec,nworkb)
945  !
946 #ifdef SFX_MPI
947  xtime_npio_write = xtime_npio_write + (mpi_wtime() - xtime0)
948 #endif
949  !
950 ENDIF
951 !
952 kresp = nworkb
953 !
954 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_LFI:WRITE_SURFT1_LFI',1,zhook_handle)
955 !
956 END SUBROUTINE write_surft1_lfi
957 !
958 ! #############################################################
959  SUBROUTINE write_surft2_lfi (&
960  hrec,kyear,kmonth,kday,ptime,kresp,hcomment)
961 ! #############################################################
962 !
963 !!**** * - routine to write a date
964 !
965 !
966 !
967 !
968 USE modd_surfex_mpi, ONLY : nrank, npio, xtime_npio_write
969 USE modd_surfex_omp, ONLY : lwork0, nworkb
970 !
971 USE modd_io_surf_lfi, ONLY : cfileout_lfi, cluout_lfi
972 !
973 USE modi_io_buff
974 USE modi_fmwrit
975 USE modi_error_write_surf_lfi
976 !
977 USE yomhook ,ONLY : lhook, dr_hook
978 USE parkind1 ,ONLY : jprb
979 !
980 IMPLICIT NONE
981 !
982 #ifdef SFX_MPI
983 include "mpif.h"
984 #endif
985 !
986 !* 0.1 Declarations of arguments
987 !
988 !
989 !
990  CHARACTER(LEN=12), INTENT(IN) :: hrec ! name of the article to be read
991 INTEGER, DIMENSION(:,:), INTENT(IN) :: kyear ! year
992 INTEGER, DIMENSION(:,:), INTENT(IN) :: kmonth ! month
993 INTEGER, DIMENSION(:,:), INTENT(IN) :: kday ! day
994 REAL, DIMENSION(:,:), INTENT(IN) :: ptime ! time
995 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
996  CHARACTER(LEN=100), INTENT(IN) :: hcomment ! comment string
997 
998 !* 0.2 Declarations of local variables
999 !
1000  CHARACTER(LEN=12) :: yrec ! Name of the article to be written
1001 DOUBLE PRECISION :: xtime0
1002 REAL(KIND=JPRB) :: zhook_handle
1003 !
1004 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_LFI:WRITE_SURFT2_LFI',0,zhook_handle)
1005 !
1006 !$OMP SINGLE
1007 nworkb = 0
1008 !
1009  CALL io_buff(&
1010  hrec,'W',lwork0)
1011 !$OMP END SINGLE
1012 !
1013 IF (lwork0 .AND. lhook) CALL dr_hook('MODE_WRITE_SURF_LFI:WRITE_SURFT2_LFI',1,zhook_handle)
1014 IF (lwork0) RETURN
1015 !
1016 IF (nrank==npio) THEN
1017  !
1018 #ifdef SFX_MPI
1019  xtime0 = mpi_wtime()
1020 #endif
1021  !
1022  kresp=0
1023  !
1024 !$OMP SINGLE
1025  !
1026  !
1027  yrec=trim(hrec)//'%YEAR'
1028  CALL fmwritn2(cfileout_lfi,yrec,cluout_lfi,SIZE(kyear),kyear,4,100,hcomment,nworkb)
1029  !
1030  yrec=trim(hrec)//'%MONTH'
1031  CALL fmwritn2(cfileout_lfi,yrec,cluout_lfi,SIZE(kmonth),kmonth,4,100,hcomment,nworkb)
1032  !
1033  yrec=trim(hrec)//'%DAY'
1034  CALL fmwritn2(cfileout_lfi,yrec,cluout_lfi,SIZE(kday),kday,4,100,hcomment,nworkb)
1035  !
1036  yrec=trim(hrec)//'%TIME'
1037  CALL fmwritx2(cfileout_lfi,yrec,cluout_lfi,SIZE(ptime),ptime,4,100,hcomment,nworkb)
1038  !
1039 !$OMP END SINGLE
1040  !
1041  CALL error_write_surf_lfi(hrec,nworkb)
1042  !
1043 #ifdef SFX_MPI
1044  xtime_npio_write = xtime_npio_write + (mpi_wtime() - xtime0)
1045 #endif
1046  !
1047 ENDIF
1048 !
1049 kresp = nworkb
1050 !
1051 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_LFI:WRITE_SURFT2_LFI',1,zhook_handle)
1052 !
1053 END SUBROUTINE write_surft2_lfi
1054 !
1055 #endif
1056 !
1057 END MODULE mode_write_surf_lfi
1058 !
1059 
subroutine write_surft2_lfi(HREC, KYEAR, KMONTH, KDAY, PTIME, KRESP, HCOMMENT)
subroutine write_surfx0_lfi(HREC, PFIELD, KRESP, HCOMMENT)
subroutine write_surfc0_lfi(HREC, HFIELD, KRESP, HCOMMENT)
subroutine get_surf_undef(PUNDEF)
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:6
subroutine write_surft0_lfi(HREC, KYEAR, KMONTH, KDAY, PTIME, KRESP, HCOMMENT)
subroutine write_surft1_lfi(HREC, KYEAR, KMONTH, KDAY, PTIME, KRESP, HCOMMENT)
subroutine get_luout(HPROGRAM, KLUOUT)
Definition: get_luout.F90:6
subroutine write_in_lfi_x2_for_mnh(HREC, PFIELD, KRESP, HCOMMENT)
subroutine write_surfl1_lfi(HREC, OFIELD, KRESP, HCOMMENT, HDIR)
subroutine io_buff(HREC, HACTION, OKNOWN)
Definition: io_buff.F90:6
subroutine write_surfx1_lfi(HREC, PFIELD, KRESP, HCOMMENT, HDIR)
subroutine write_surfl0_lfi(HREC, OFIELD, KRESP, HCOMMENT)
subroutine error_write_surf_lfi(HREC, KRESP)
subroutine write_in_lfi_x1_for_mnh(HREC, HREC2, PFIELD, KRESP, HCOMMENT, KU, KB, KE)
subroutine write_surfx2_lfi(HREC, PFIELD, KRESP, HCOMMENT, HDIR)
subroutine write_surfn1_lfi(HREC, KFIELD, KRESP, HCOMMENT, HDIR)
subroutine write_surfn0_lfi(HREC, KFIELD, KRESP, HCOMMENT)