SURFEX v8.1
General documentation of Surfex
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 USE netcdf
43 !
44 IMPLICIT NONE
45 !
46 !
47 #ifdef SFX_MPI
48 include 'mpif.h'
49 #endif
50 !
51 #ifndef AIX64
52 !$ INCLUDE 'omp_lib.h'
53 #endif
54 !
55 CONTAINS
56 !
57 !------------------------------------------------------------------
58 !
59 SUBROUTINE read_fz06(HFILE)
60 !
62 !
63 USE netcdf
64 !
65 IMPLICIT NONE
66 !
67 !* 1. declarations of arguments
68 !
69  CHARACTER(LEN=18), INTENT(IN) :: HFILE ! name of file
70  CHARACTER(LEN=5),DIMENSION(3),PARAMETER :: HVARNAME=(/'drdt0','tau ','kappa'/)
71 !
72 !* 2. declarations of local variables
73 !
74 INTEGER :: INFOMPI
75 INTEGER :: IERROR !error status
76 !
77 REAL(KIND=JPRB) :: ZHOOK_HANDLE
78 !
79 IF (lhook) CALL dr_hook('SNOWCRO_FLANNER',0,zhook_handle)
80 !
81 !* 3. Reading of field
82 !
83 ! Open netcdf file
84 !
85 IF (nrank==npio) THEN
86  ierror = nf90_open(hfile,nf90_nowrite,nid_file)
87  CALL handle_err_cdf(ierror,"can't open file "//trim(hfile))
88 ENDIF
89 !
90 IF (nproc>1) THEN
91 #ifdef SFX_MPI
92  CALL mpi_bcast(nid_file,kind(nid_file)/4,mpi_integer,npio,ncomm,infompi)
93 #endif
94 ENDIF
95 !
96  CALL read_var_fz06(nid_file,hvarname(1),xdrdt0)
97  CALL read_var_fz06(nid_file,hvarname(2),xtau)
98  CALL read_var_fz06(nid_file,hvarname(3),xkappa)
99 !
100 IF (nrank==npio) THEN
101  ! Close netcdf file
102  ierror=nf90_close(nid_file)
103 ENDIF
104 !
105 IF (lhook) CALL dr_hook('SNOWCRO_FLANNER',1,zhook_handle)
106 !
107 END SUBROUTINE read_fz06
108 !------------------------------------------------------------------
109 SUBROUTINE read_var_fz06(ID_FILE,HSURF,PVAR)
110 !
113 !
114 USE netcdf
115 !
116 IMPLICIT NONE
117 !
118 INTEGER,INTENT(IN) :: ID_FILE
119  CHARACTER(LEN=5),INTENT(IN) :: HSURF
120 REAL, DIMENSION(:,:,:), POINTER :: PVAR
121 !
122 INTEGER :: INFOMPI
123 INTEGER, DIMENSION(:), ALLOCATABLE :: IVARDIMSID
124 !
125 INTEGER :: IERROR !error status
126 !
127 IF (nrank==npio) THEN
128  ! Look for variable ID
129  ierror = nf90_inq_varid(id_file,trim(hsurf),nid_var)
130  CALL handle_err_cdf(ierror,"can't find variable "//trim(hsurf))
131  !
132  ! Number of dimensions
133  ierror = nf90_inquire_variable(id_file,nid_var,ndims=nvardims)
134  IF ( ierror/=nf90_noerr ) CALL handle_err_cdf(ierror,"can't get variable dimensions number")
135  !
136  ! Id of dimensions
137  ALLOCATE(ivardimsid(nvardims))
138  ierror = nf90_inquire_variable(id_file,nid_var,dimids=ivardimsid)
139  IF ( ierror/=nf90_noerr ) CALL handle_err_cdf(ierror,"can't get variable dimensions ids")
140  !
141  SELECT CASE (nvardims)
142  !
143  CASE (3)
144  ierror = nf90_inquire_dimension(id_file,ivardimsid(1),len=nlendim1)
145  IF ( ierror/=nf90_noerr ) CALL handle_err_cdf(ierror,"can't get variable dimensions lengths")
146  ierror = nf90_inquire_dimension(id_file,ivardimsid(2),len=nlendim2)
147  IF ( ierror/=nf90_noerr ) CALL handle_err_cdf(ierror,"can't get variable dimensions lengths")
148  ierror = nf90_inquire_dimension(id_file,ivardimsid(3),len=nlendim3)
149  IF ( ierror/=nf90_noerr ) CALL handle_err_cdf(ierror,"can't get variable dimensions lengths")
150  !
151  CASE DEFAULT
152  CALL abor1_sfx('SNOWCRO_FLANNER: incorrect number of dimensions for variable '//trim(hsurf))
153  !
154  END SELECT
155 ENDIF
156 !
157 IF (nproc>1) THEN
158 #ifdef SFX_MPI
159  CALL mpi_bcast(nlendim1,kind(nlendim1)/4,mpi_integer,npio,ncomm,infompi)
160  CALL mpi_bcast(nlendim2,kind(nlendim2)/4,mpi_integer,npio,ncomm,infompi)
161  CALL mpi_bcast(nlendim3,kind(nlendim3)/4,mpi_integer,npio,ncomm,infompi)
162 #endif
163 ENDIF
164 !
165 ALLOCATE(pvar(nlendim1,nlendim2,nlendim3))
166 !
167 IF (nrank==npio) THEN
168  ! Read 3D variable
169  ierror = nf90_get_var(id_file,nid_var,pvar)
170  CALL handle_err_cdf(ierror,"can't read variable "//trim(hsurf))
171 ENDIF
172 !
173 IF (nproc>1) THEN
174 #ifdef SFX_MPI
175  CALL mpi_bcast(pvar,kind(pvar)*SIZE(pvar)/4,mpi_real,npio,ncomm,infompi)
176 #endif
177 ENDIF
178 !
179 END SUBROUTINE read_var_fz06
180 !------------------------------------------------------------------
181 END MODULE mode_snowcro_flanner
static const char * trim(const char *name, int *n)
Definition: drhook.c:2383
subroutine read_var_fz06(ID_FILE, HSURF, PVAR)
subroutine handle_err_cdf(status, line)
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
real, dimension(:,:,:), pointer xdrdt0
integer, parameter jprb
Definition: parkind1.F90:32
real, dimension(:,:,:), pointer xkappa
subroutine read_fz06(HFILE)
logical lhook
Definition: yomhook.F90:15
real, dimension(:,:,:), pointer xtau