SURFEX v8.1
General documentation of Surfex
def_var_netcdf.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 ! #########
6  SUBROUTINE def_var_netcdf (HSELECT, &
7  KFILE_ID, HNAME, HLONG_NAME, KDIM_ID, HATT_TITLE, HATT_TEXT,&
8  KVAR_ID, KTYPE, KLEN, HATT_TITLE2, PATT_FLOAT,&
9  HATT_TITLE3, PATT_FLOAT2D)
10 !
11 !!
12 !! MODIFICATIONS
13 !! -------------
14 !! B. Decharme 07/2013 special case for time in netcdf output files
15 !-------------------------------------------------------------------------------
16 !
18 USE modd_surf_par, ONLY : xundef, nundef
19 !
20 !
21 USE yomhook ,ONLY : lhook, dr_hook
22 USE parkind1 ,ONLY : jprb
23 !
24 USE netcdf
25 !
26 IMPLICIT NONE
27 
28 !
29  CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: HSELECT
30 !
31 INTEGER, INTENT(IN) :: KFILE_ID
32  CHARACTER(LEN=*), INTENT(IN) :: HNAME
33  CHARACTER(LEN=*), INTENT(IN) :: HLONG_NAME
34 INTEGER, DIMENSION(:), INTENT(IN) :: KDIM_ID
35  CHARACTER(LEN=*),DIMENSION(:),OPTIONAL, INTENT(IN) :: HATT_TITLE,HATT_TEXT
36 INTEGER, OPTIONAL, INTENT(OUT) :: KVAR_ID
37 INTEGER, OPTIONAL, INTENT(IN) :: KTYPE
38 INTEGER, OPTIONAL, INTENT(IN) :: KLEN
39  CHARACTER(LEN=*),DIMENSION(:),OPTIONAL, INTENT(IN) :: HATT_TITLE2
40 REAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: PATT_FLOAT
41  CHARACTER(LEN=*),DIMENSION(:),OPTIONAL, INTENT(IN) :: HATT_TITLE3
42 REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PATT_FLOAT2D
43 !
44 ! ** local variables
45 !
46  CHARACTER(LEN=100) :: YNAME
47  CHARACTER(LEN=50) :: YPAS
48 INTEGER, DIMENSION(4) :: IRET
49 INTEGER :: JRET,IVAR_ID,IATT,JATT,ILEN,INDIM
50 INTEGER :: IFIELD,JFIELD,ISIZE
51 LOGICAL :: NOWRITE, GOPENED, GEXIST
52 REAL(KIND=JPRB) :: ZHOOK_HANDLE
53 !--------------------------------------
54 !
55 IF (lhook) CALL dr_hook('DEF_VAR_NETCDF',0,zhook_handle)
56 !
57 ! if output fields selection is active, test if this field is to be written
58 IF ( hname/='xx' .AND. hname/='yy' .AND. hname/='lon' .AND. &
59  hname/='lat' .AND. hname/='time' .AND. hname/='Projection_Type' .AND. &
60  hname/='longitude' .AND. hname/='latitude' .AND. SIZE(hselect)>0 ) THEN
61  ifield=count(hselect /= ' ')
62  nowrite=.true.
63  DO jfield=1,ifield
64  IF ( trim(hselect(jfield))==trim(hname) ) THEN
65  nowrite=.false.
66  ENDIF
67  ENDDO
68  IF ( nowrite .AND. lhook) CALL dr_hook('DEF_VAR_NETCDF',1,zhook_handle)
69  IF ( nowrite ) RETURN
70 ENDIF
71 !
72 !define variables in the netcdf file
73 indim=SIZE(kdim_id)
74 !
75 IF (PRESENT(ktype)) THEN
76  iret(1) = nf90_def_var(kfile_id,hname,ktype,kdim_id,ivar_id)
77 ELSE
78  iret(1) = nf90_def_var(kfile_id,hname,nf90_double,kdim_id,ivar_id)
79 ENDIF
80 !
81 IF (indim/=0) THEN
82  IF (PRESENT(ktype)) THEN
83  IF (ktype==nf90_double .OR. ktype==nf90_float) THEN
84  iret(2) = nf90_put_att(kfile_id,ivar_id,'_FillValue',xundef)
85  ELSEIF (ktype==nf90_int .OR. ktype==nf90_short) THEN
86  iret(2) = nf90_put_att(kfile_id,ivar_id,'_FillValue',nundef)
87  ELSEIF (ktype==nf90_char) THEN
88  IF (indim>1) iret(2) = nf90_put_att(kfile_id,ivar_id,'_FillValue',"")
89  ENDIF
90  ELSE
91  iret(2) = nf90_put_att(kfile_id,ivar_id,'_FillValue',xundef)
92  ENDIF
93 ENDIF
94 !
95 IF (PRESENT(ktype)) THEN
96  IF (ktype==nf90_char) THEN
97  IF (PRESENT(klen)) iret(3) = nf90_put_att(kfile_id,ivar_id,'len',klen)
98  ENDIF
99 ENDIF
100 !
101 IF (hlong_name.NE.'') iret(2) = nf90_put_att(kfile_id,ivar_id,'long_name',hlong_name)
102 !
103 !Write optional attribute
104 IF (PRESENT(hatt_title).AND.PRESENT(hatt_text)) THEN
105  iatt=SIZE(hatt_title)
106  IF (iatt .EQ. SIZE(hatt_text)) THEN
107  DO jatt=1,iatt
108  ilen=len_trim(hatt_text(jatt))
109  ypas=hatt_text(jatt)
110  jret = nf90_put_att(kfile_id,ivar_id,hatt_title(jatt),hatt_text(jatt))
111  ENDDO
112  ENDIF
113 ENDIF
114 !
115 !Write optional attribute
116 IF (PRESENT(hatt_title2).AND.PRESENT(patt_float)) THEN
117  iatt=SIZE(hatt_title2)
118  IF (iatt .EQ. SIZE(patt_float)) THEN
119  DO jatt=1,iatt
120  ilen=len_trim(hatt_title2(jatt))
121  ypas=hatt_title2(jatt)
122  jret = nf90_put_att(kfile_id,ivar_id,hatt_title2(jatt),patt_float(jatt))
123  ENDDO
124  ENDIF
125 ENDIF
126 !
127 !Write optional attribute
128 IF (PRESENT(hatt_title3).AND.PRESENT(patt_float2d)) THEN
129  iatt=SIZE(hatt_title3)
130  IF (iatt .EQ. SIZE(patt_float2d,1)) THEN
131  DO jatt=1,iatt
132  ilen=len_trim(hatt_title3(jatt))
133  ypas=hatt_title3(jatt)
134  jret = nf90_put_att(kfile_id,ivar_id,hatt_title3(jatt),patt_float2d(jatt,:))
135  ENDDO
136  ENDIF
137 ENDIF
138 !
139 IF (PRESENT(kvar_id)) kvar_id = ivar_id
140 !
141 IF (lhook) CALL dr_hook('DEF_VAR_NETCDF',1,zhook_handle)
142 !
143 END SUBROUTINE def_var_netcdf
character(len=28), save cfileout_nc
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
integer, parameter nundef
subroutine def_var_netcdf(HSELECT, KFILE_ID, HNAME, HLONG_NAME, KDIM_ID, H
logical lhook
Definition: yomhook.F90:15
static int count
Definition: memory_hook.c:21