SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
mode_snowcro_flanner.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 !!**** SNOWCRO_FLANNER - read "drdt_bst_fit_60.nc" file, which containes parameters from Flanner and Zender, 2006
8 !!
9 !! PURPOSE
10 !! -------
11 !
12 !!** METHOD
13 !! ------
14 !!
15 !! REFERENCE
16 !! ---------
17 !!
18 !!
19 !! AUTHOR
20 !! ------
21 !! C. Carmagnola
22 !!
23 !! MODIFICATIONS
24 !! -------------
25 !! Original 01/2013
26 !
27 USE modd_surfex_omp, ONLY : nblock
28 USE modd_surfex_mpi, ONLY : nrank, npio, nproc, ncomm
29 !
30 USE modi_abor1_sfx
31 
32 USE mode_read_cdf
33 !
34 USE yomhook ,ONLY : lhook, dr_hook
35 USE parkind1 ,ONLY : jprb
36 !
37 !
38 #ifdef AIX64
39 !$ USE OMP_LIB
40 #endif
41 !
42 IMPLICIT NONE
43 !
44 include 'netcdf.inc'
45 !
46 #ifdef SFX_MPI
47 include 'mpif.h'
48 #endif
49 !
50 #ifndef AIX64
51 !$ INCLUDE 'omp_lib.h'
52 #endif
53 !
54  CONTAINS
55 !
56 !------------------------------------------------------------------
57 !
58 SUBROUTINE read_fz06(HFILE)
59 !
60 USE modd_snow_metamo, ONLY : nid_file, xdrdt0, xtau, xkappa
61 !
62 IMPLICIT NONE
63 !
64 !* 1. declarations of arguments
65 !
66  CHARACTER(LEN=18), INTENT(IN) :: hfile ! name of file
67  CHARACTER(LEN=5),DIMENSION(3),PARAMETER :: hvarname=(/'drdt0','tau ','kappa'/)
68 !
69 !* 2. declarations of local variables
70 !
71 INTEGER :: infompi
72 INTEGER :: ierror !error status
73 !
74 REAL(KIND=JPRB) :: zhook_handle
75 !
76 IF (lhook) CALL dr_hook('SNOWCRO_FLANNER',0,zhook_handle)
77 !
78 !* 3. Reading of field
79 !
80 ! Open netcdf file
81 !
82 IF (nrank==npio) THEN
83 !$OMP SINGLE
84  ierror = nf_open(hfile,nf_nowrite,nid_file)
85  CALL handle_err_cdf(ierror,"can't open file "//trim(hfile))
86 !$OMP END SINGLE
87 ENDIF
88 !
89 IF (nproc>1) THEN
90 #ifdef SFX_MPI
91 !$OMP SINGLE
92  CALL mpi_bcast(nid_file,kind(nid_file)/4,mpi_integer,npio,ncomm,infompi)
93 !$OMP END SINGLE
94 #endif
95 ENDIF
96 !
97  CALL read_var_fz06(nid_file,hvarname(1),xdrdt0)
98  CALL read_var_fz06(nid_file,hvarname(2),xtau)
99  CALL read_var_fz06(nid_file,hvarname(3),xkappa)
100 !
101 IF (nrank==npio) THEN
102 !$OMP SINGLE
103  ! Close netcdf file
104  ierror=nf_close(nid_file)
105 !$OMP END SINGLE
106 ENDIF
107 !
108 IF (lhook) CALL dr_hook('SNOWCRO_FLANNER',1,zhook_handle)
109 !
110 END SUBROUTINE read_fz06
111 !------------------------------------------------------------------
112 SUBROUTINE read_var_fz06(ID_FILE,HSURF,PVAR)
113 !
114 USE modd_snow_metamo, ONLY : nvardims, nlendim1, nlendim2, &
115  nlendim3, nid_var
116 !
117 IMPLICIT NONE
118 !
119 INTEGER,INTENT(IN) :: id_file
120  CHARACTER(LEN=5),INTENT(IN) :: hsurf
121 REAL, DIMENSION(:,:,:), POINTER :: pvar
122 !
123 INTEGER :: infompi
124 INTEGER, DIMENSION(:), ALLOCATABLE :: ivardimsid
125 !
126 INTEGER :: ierror !error status
127 !
128 IF (nrank==npio) THEN
129 !$OMP SINGLE
130  ! Look for variable ID
131  ierror = nf_inq_varid(id_file,trim(hsurf),nid_var)
132  CALL handle_err_cdf(ierror,"can't find variable "//trim(hsurf))
133  !
134  ! Number of dimensions
135  ierror = nf_inq_varndims(id_file,nid_var,nvardims)
136  IF ( ierror/=nf_noerr ) CALL handle_err_cdf(ierror,"can't get variable dimensions number")
137  !
138  ! Id of dimensions
139  ALLOCATE(ivardimsid(nvardims))
140  ierror = nf_inq_vardimid(id_file,nid_var,ivardimsid)
141  IF ( ierror/=nf_noerr ) CALL handle_err_cdf(ierror,"can't get variable dimensions ids")
142  !
143  SELECT CASE (nvardims)
144  !
145  CASE (3)
146  ierror = nf_inq_dimlen(id_file,ivardimsid(1),nlendim1)
147  IF ( ierror/=nf_noerr ) CALL handle_err_cdf(ierror,"can't get variable dimensions lengths")
148  ierror = nf_inq_dimlen(id_file,ivardimsid(2),nlendim2)
149  IF ( ierror/=nf_noerr ) CALL handle_err_cdf(ierror,"can't get variable dimensions lengths")
150  ierror = nf_inq_dimlen(id_file,ivardimsid(3),nlendim3)
151  IF ( ierror/=nf_noerr ) CALL handle_err_cdf(ierror,"can't get variable dimensions lengths")
152  !
153  CASE default
154  CALL abor1_sfx('SNOWCRO_FLANNER: incorrect number of dimensions for variable '//trim(hsurf))
155  !
156  END SELECT
157 !$OMP END SINGLE
158 ENDIF
159 !
160 IF (nproc>1) THEN
161 #ifdef SFX_MPI
162 !$OMP SINGLE
163  CALL mpi_bcast(nlendim1,kind(nlendim1)/4,mpi_integer,npio,ncomm,infompi)
164  CALL mpi_bcast(nlendim2,kind(nlendim2)/4,mpi_integer,npio,ncomm,infompi)
165  CALL mpi_bcast(nlendim3,kind(nlendim3)/4,mpi_integer,npio,ncomm,infompi)
166 !$OMP END SINGLE
167 #endif
168 ENDIF
169 !
170 !$OMP SINGLE
171 ALLOCATE(pvar(nlendim1,nlendim2,nlendim3))
172 !$OMP END SINGLE
173 !
174 IF (nrank==npio) THEN
175 !$OMP SINGLE
176  ! Read 3D variable
177  ierror = nf_get_var_double(id_file,nid_var,pvar)
178  CALL handle_err_cdf(ierror,"can't read variable "//trim(hsurf))
179 !$OMP END SINGLE
180 ENDIF
181 !
182 IF (nproc>1) THEN
183 #ifdef SFX_MPI
184 !$OMP SINGLE
185  CALL mpi_bcast(pvar,kind(pvar)*SIZE(pvar)/4,mpi_real,npio,ncomm,infompi)
186 !$OMP END SINGLE
187 #endif
188 ENDIF
189 !
190 END SUBROUTINE read_var_fz06
191 !------------------------------------------------------------------
192 END MODULE mode_snowcro_flanner
subroutine read_var_fz06(ID_FILE, HSURF, PVAR)
subroutine handle_err_cdf(status, line)
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:6
subroutine read_fz06(HFILE)