SURFEX v8.1
General documentation of Surfex
sfx_xios_check_field_2d.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  SUBROUTINE sfx_xios_check_field_2d(U, HREC, HCOMMENT, OWRITE, PFIELD2, HAXIS)
6 !!
7 !!
8 !! PURPOSE
9 !! --------
10 !!
11 !! Ensure that a 2-dim field is already declared to Xios.
12 !!
13 !!
14 !! IMPLICIT ARGUMENTS :
15 !! --------------------
16 !!
17 !! YXIOS_DOMAIN
18 !!
19 !!
20 !! EXTERNAL
21 !! --------
22 !!
23 !! XIOS LIBRARY
24 !!
25 !!
26 !! REFERENCE
27 !! ---------
28 !!
29 !! XIOS Reference guide - Yann Meurdesoif - 10/10/2014 -
30 !! svn co -r 515 http://forge.ipsl.jussieu.fr/ioserver/svn/XIOS/branchs/xios-1.0 <dir>
31 !! cd <dir>/doc ; ....
32 !!
33 !! AUTHOR
34 !! ------
35 !!
36 !! S.Sénési, CNRM
37 !!
38 !! MODIFICATION
39 !! --------------
40 !!
41 !! Original 08/2015
42 !!
43 !-------------------------------------------------------------------------------
44 !
45 !* 0. DECLARATIONS
46 ! ------------
47 !
48 USE yomhook , ONLY : lhook, dr_hook
49 USE parkind1 , ONLY : jprb
50 !
51 USE modd_surf_atm_n, ONLY : surf_atm_t
52 !
53 #ifdef WXIOS
54 USE xios, ONLY : xios_set_field_attr, xios_is_defined_field_attr, &
55  xios_is_valid_axis, xios_get_axis_attr, xios_is_defined_axis_attr
56 USE modd_xios , ONLY : ypatch_dim_name
57 #endif
58 !
59 USE modi_set_axis
60 USE modi_sfx_xios_check_field
61 USE modi_abor1_sfx
62 !
63 IMPLICIT NONE
64 !
65 ! Arguments
66 !
67 TYPE(surf_atm_t) ,INTENT(INOUT):: U
68  CHARACTER(LEN=*) ,INTENT(IN) :: HREC ! name of the field to check
69  CHARACTER(LEN=100) ,INTENT(IN) :: HCOMMENT ! Comment string
70 LOGICAL ,INTENT(INOUT):: OWRITE ! set to .FALSE. if any issue re. Xios for this field
71 REAL,DIMENSION(:,:) ,INTENT(IN) :: PFIELD2 ! 2D field value
72  CHARACTER(LEN=*) ,INTENT(IN) , OPTIONAL :: HAXIS ! name of the additional axis
73 !
74 ! Local variables
75 !
76 LOGICAL :: LISDEF, LLWRITE, LDEFUNITS
77 LOGICAL :: LVALID_AXIS, LVERTICAL_AXIS
78  CHARACTER(LEN=100) :: YAXIS
79  CHARACTER(LEN=100) :: YUNITS
80 REAL(KIND=JPRB), DIMENSION(:),ALLOCATABLE :: ZAXIS
81 INTEGER :: IDIM ! for additonal dim
82  CHARACTER(LEN=3) :: YIDIM ! for additonal dim
83 REAL(KIND=JPRB) :: ZHOOK_HANDLE
84 !
85 IF (lhook) CALL dr_hook('SFX_XIOS_CHECK_FIELD_2D',0,zhook_handle)
86 !
87 #ifdef WXIOS
88 !$OMP SINGLE
89 !
90 ! Assume that every axis attribute is well defined as soon as the axis is defined
91  CALL xios_is_defined_field_attr(hrec,axis_ref=lisdef)
92 !
93 IF ( .NOT. lisdef ) THEN
94  IF (.NOT. PRESENT(haxis) .OR. (trim(haxis)=='')) THEN
95  yaxis='you_should_define_a_dim_for_'//hrec//'_in_xml_file_or_call_set_axis_in_code'
96  ELSE
97  yaxis=trim(haxis)
98  ENDIF
99  lvalid_axis=xios_is_valid_axis(yaxis)
100  !
101  IF (trim(haxis)/=trim(ypatch_dim_name)) THEN
102  IF (.NOT. lvalid_axis) THEN
103  ALLOCATE(zaxis(SIZE(pfield2,2)))
104  zaxis=(/(idim, idim=1,SIZE(pfield2,2))/)
105  CALL set_axis(yaxis,zaxis)
106  DEALLOCATE(zaxis)
107  ELSE
108  ! xxx il faut encore vérifier si le set_axis_attr des valeurs a été fait pour ce champ !!
109  ENDIF
110  CALL xios_set_field_attr(hrec, axis_ref=yaxis)
111  ELSE
112  ! Account for loop on pacthes
113  DO idim=1,SIZE(pfield2,2)
114  IF (idim < 10) THEN
115  WRITE(yidim,'(I1)') idim
116  ELSE
117  WRITE(yidim,'(I2)') idim
118  ENDIF
119  CALL sfx_xios_check_field(u, trim(hrec)//'_'//trim(yidim), hcomment, llwrite, pfield1=pfield2(:,idim))
120  owrite= owrite .AND. llwrite
121  END DO
122  ! Disable the writing as a mutli-dim array
123  CALL xios_set_field_attr(hrec, enabled=.false.)
124  ENDIF
125 ENDIF
126 !
127 !$OMP END SINGLE
128 #endif
129 IF (lhook) CALL dr_hook('SFX_XIOS_CHECK_FIELD_2D',1,zhook_handle)
130 ! ----------------------------------------------------------------------
131 !
132 END SUBROUTINE sfx_xios_check_field_2d
static const char * trim(const char *name, int *n)
Definition: drhook.c:2383
subroutine set_axis(HNAME, PVALUE, CDPOSITIVE, KSIZE, CDUNITS, PBOUNDS)
Definition: set_axis.F90:6
subroutine sfx_xios_check_field_2d(U, HREC, HCOMMENT, OWRITE, PFIELD2, HAXIS)
integer, parameter jprb
Definition: parkind1.F90:32
character(len=30) ypatch_dim_name
Definition: modd_xios.F90:63
logical lhook
Definition: yomhook.F90:15
subroutine sfx_xios_check_field(U, HREC, HCOMMENT, OWRITE, PFIELD1, PFIELD2, PFIELD3, HAXIS)