SURFEX v8.1
General documentation of Surfex
ol_write_coord.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 ol_write_coord (HSELECT, HFILE, KFILE_ID, KDDIM, HATT_TITLE, HNAME_DIM, &
6  HUNIT1, HUNIT2, KDIM1, HDATE, PX, PY, PLON, PLAT)
7 !
8 USE modd_diag_n, ONLY : diag_t
9 !
10 USE modn_io_offline, ONLY : lwrite_coord
11 !
12 USE modi_def_var_netcdf
13 !
14 USE yomhook ,ONLY : lhook, dr_hook
15 USE parkind1 ,ONLY : jprb
16 !
17 USE netcdf
18 !
19 IMPLICIT NONE
20 !
21  CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: HSELECT
22 !
23  CHARACTER(LEN=50), INTENT(IN) :: HFILE
24 INTEGER, INTENT(IN) :: KFILE_ID
25 INTEGER, DIMENSION(:), INTENT(IN) :: KDDIM
26  CHARACTER(LEN=100), DIMENSION(:), INTENT(IN) :: HATT_TITLE
27  CHARACTER(LEN=100), DIMENSION(:), INTENT(IN) :: HNAME_DIM
28  CHARACTER(LEN=13) , DIMENSION(:), INTENT(IN) :: HUNIT1, HUNIT2
29 INTEGER, INTENT(IN) :: KDIM1
30  CHARACTER(LEN=40),DIMENSION(:), INTENT(IN) :: HDATE
31 REAL,DIMENSION(:), INTENT(IN) :: PX, PY
32 REAL,DIMENSION(:), OPTIONAL, INTENT(IN) :: PLON, PLAT
33 !
34 REAL, DIMENSION(:,:), ALLOCATABLE :: ZLAT, ZLON
35  CHARACTER(LEN=100) :: YNAME1, YNAME2
36 INTEGER, DIMENSION(:), ALLOCATABLE :: ITEMP
37 INTEGER :: IVAR_ID, JRET, IDIM2, JJ
38 INTEGER :: INDIMS, ID1, ID2, ID3, ID4
39 REAL(KIND=JPRB) :: ZHOOK_HANDLE
40 !
41 IF (lhook) CALL dr_hook('OL_WRITE_COORD',0,zhook_handle)
42 !
43 yname1 = "longitude"
44 yname2 = "latitude"
45 IF (PRESENT(plat).AND.PRESENT(plon)) THEN
46  ALLOCATE(zlat(SIZE(plat),1),zlon(SIZE(plon),1))
47  zlat(:,1) = plat(:)
48  zlon(:,1) = plon(:)
49 ELSE
50  ALLOCATE(zlat(0,0),zlon(0,0))
51 ENDIF
52 !
53 id1 = 0
54 id2 = 0
55 IF ( lwrite_coord ) THEN
56  !
57  IF (SIZE(zlat)>0) THEN
58  CALL def_var_netcdf(hselect,kfile_id,trim(yname1),'',kddim(1:1),(/'units'/),(/'degree'/),kvar_id=id3)
59  CALL def_var_netcdf(hselect,kfile_id,trim(yname2),'',kddim(1:1),(/'units'/),(/'degree'/),kvar_id=id4)
60  ELSE
61  CALL def_var_netcdf(hselect,kfile_id,trim(hname_dim(2)),'',kddim(1:1),hatt_title,hunit1,kvar_id=id1)
62  CALL def_var_netcdf(hselect,kfile_id,trim(hname_dim(3)),'',kddim(1:1),hatt_title,hunit2,kvar_id=id2)
63  ENDIF
64  !
65 ELSEIF (kdim1.NE.0) THEN
66  !
67  CALL def_var_netcdf(hselect,kfile_id,trim(hname_dim(1)),'',kddim(1:1),hatt_title,hunit1,kvar_id=id1)
68  CALL def_var_netcdf(hselect,kfile_id,trim(hname_dim(2)),'',kddim(2:2),hatt_title,hunit2,kvar_id=id2)
69  !
70 ELSEIF (SIZE(zlat)>0) THEN
71  CALL def_var_netcdf(hselect,kfile_id,trim(yname1),'',kddim(1:1),(/'units'/),(/'degree'/),kvar_id=id3)
72  CALL def_var_netcdf(hselect,kfile_id,trim(yname2),'',kddim(1:1),(/'units'/),(/'degree'/),kvar_id=id4)
73 ENDIF
74 !
75 indims = SIZE(kddim)
76 IF (hname_dim(indims)=='time') CALL def_var_netcdf(hselect,kfile_id,'time','',kddim(indims:indims),hatt_title,hdate)
77 !
78 jret=nf90_enddef(kfile_id)
79 !
80 IF (id1/=0 .AND. id2/=0) THEN
81  jret = nf90_put_var(kfile_id, id1, px)
82  jret = nf90_put_var(kfile_id, id2, py)
83 ENDIF
84 !
85 IF (SIZE(zlat)>0) THEN
86  jret = nf90_put_var(kfile_id, id3, zlon)
87  jret = nf90_put_var(kfile_id, id4, zlat)
88 ENDIF
89 !
90 DEALLOCATE(zlat,zlon)
91 !
92 IF (lhook) CALL dr_hook('OL_WRITE_COORD',1,zhook_handle)
93 !
94 END SUBROUTINE ol_write_coord
integer, parameter jprb
Definition: parkind1.F90:32
subroutine def_var_netcdf(HSELECT, KFILE_ID, HNAME, HLONG_NAME, KDIM_ID, H
logical lhook
Definition: yomhook.F90:15
subroutine ol_write_coord(HSELECT, HFILE, KFILE_ID, KDDIM, HATT_TITLE, HNAME_DIM, HUNIT1, HUNIT2, KDIM1, HDATE, PX, PY, PLON, PLAT)