source: LMDZ6/trunk/libf/dyn3d_common/grilles_gcm_netcdf_sub.F90 @ 4270

Last change on this file since 4270 was 4259, checked in by lguez, 2 years ago

Replace nf_put_vara_type by nf90_put_var

The immediate motivation is a bug fix: nf_put_vara_type was called
with scalar instead of array actual arguments for dummy array
arguments start and count. Correcting this, we might as well take the
opportunity to use nf90_put_var, so we no longer need to test
NC_DOUBLE and we have half as many calls.

  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
File size: 7.0 KB
RevLine 
[1488]1!
[1984]2! $Id: $
[1488]3!
4! This subroutine creates the file grilles_gcm.nc containg longitudes and
5! latitudes in degrees for grid u and v. This subroutine is called from
[1984]6! ce0l. This subroutine corresponds to the first
[1488]7! part in the program create_fausse_var.
8!
[1511]9SUBROUTINE grilles_gcm_netcdf_sub(masque,phis)
[1488]10
[2597]11  USE comconst_mod, ONLY: cpp, kappa, g, omeg, daysec, rad, pi
[2600]12  USE comvert_mod, ONLY: presnivs, preff, pa
[4259]13  use netcdf, only: nf90_def_var, nf90_int, nf90_float, nf90_put_var
[2600]14 
[1488]15  IMPLICIT NONE
16
17  INCLUDE "dimensions.h"
18  INCLUDE "paramet.h"
19  INCLUDE "comgeom.h"
20  INCLUDE "netcdf.inc"
21
[1511]22
23  REAL,DIMENSION(iip1,jjp1),INTENT(IN)  :: masque ! masque terre/mer
24  REAL,DIMENSION(iip1,jjp1),INTENT(IN)  :: phis   ! geopotentiel au sol
25
[1488]26  REAL temp(iim+1,jjm+1)
27  ! Attributs netcdf sortie
28  INTEGER ncid_out,rcode_out
[4258]29  INTEGER out_lonuid,out_lonvid,out_latuid,out_latvid
[1488]30  INTEGER out_varid
31  INTEGER out_lonudim,out_lonvdim
32  INTEGER out_latudim,out_latvdim,out_dim(3)
[1511]33  INTEGER out_levdim
[1488]34
35  INTEGER start(4),COUNT(4)
36
37  INTEGER status,i,j
[1511]38  REAL rlatudeg(jjp1),rlatvdeg(jjm),rlevdeg(llm)
[1488]39  REAL rlonudeg(iip1),rlonvdeg(iip1)
40
41  REAL dlon1(iip1),dlon2(iip1),dlat1(jjp1),dlat2(jjp1)
42  REAL acoslat,dxkm,dykm,resol(iip1,jjp1)
[1511]43  REAL,DIMENSION(iip1,jjp1)  :: phis_loc
44  INTEGER masque_int(iip1,jjp1)
45  INTEGER :: phis_id
46  INTEGER :: area_id
47  INTEGER :: mask_id
[1984]48  INTEGER :: presnivs_id
[1511]49 
[1488]50  rad = 6400000
51  omeg = 7.272205e-05
52  g = 9.8
53  kappa = 0.285716
54  daysec = 86400
55  cpp = 1004.70885
56
57  preff = 101325.
58  pa= 50000.
59
[2221]60  CALL conf_gcm( 99, .TRUE. )
[1488]61  CALL iniconst
62  CALL inigeom
63
64  DO j=1,jjp1
65     rlatudeg(j)=rlatu(j)*180./pi
66  ENDDO
67  DO j=1,jjm
68     rlatvdeg(j)=rlatv(j)*180./pi
69  ENDDO
70
71  DO i=1,iip1
72     rlonudeg(i)=rlonu(i)*180./pi + 360.
73     rlonvdeg(i)=rlonv(i)*180./pi + 360.
74  ENDDO
75
76
77  !  2 ----- OUVERTURE DE LA SORTIE NETCDF
78  ! ---------------------------------------------------
79  ! CREATION OUTPUT
80  ! ouverture fichier netcdf de sortie out
[3803]81  status=NF_CREATE('grilles_gcm.nc',IOR(NF_CLOBBER,NF_64BIT_OFFSET),ncid_out)
[1984]82  CALL handle_err(status)
[1488]83  status=NF_DEF_DIM(ncid_out,'lonu',iim+1,out_lonudim)
[1984]84  CALL handle_err(status)
[1488]85  status=NF_DEF_DIM(ncid_out,'lonv',iim+1,out_lonvdim)
[1984]86  CALL handle_err(status)
[1488]87  status=NF_DEF_DIM(ncid_out,'latu',jjm+1,out_latudim)
[1984]88  CALL handle_err(status)
[1488]89  status=NF_DEF_DIM(ncid_out,'latv',jjm,out_latvdim)
[1984]90  CALL handle_err(status)
[1488]91
92
93  !   Longitudes en u
[4253]94  status=NF90_DEF_VAR(ncid_out,'lonu',NF90_FLOAT,out_lonudim, out_lonuid)
[1488]95  CALL handle_err(status)
96  status=NF_PUT_ATT_TEXT(ncid_out,out_lonuid,'units', 12,'degrees_east')
97  status=NF_PUT_ATT_TEXT(ncid_out,out_lonuid,'long_name',9,'Longitude en u')
98
99  !   Longitudes en v
[4253]100  status=NF90_DEF_VAR(ncid_out,'lonv',NF90_FLOAT,out_lonvdim, out_lonvid)
[1488]101  CALL handle_err(status)
102  status=NF_PUT_ATT_TEXT(ncid_out,out_lonvid,'units', 12,'degrees_east')
103  status=NF_PUT_ATT_TEXT(ncid_out,out_lonvid,'long_name', 9,'Longitude en v')
104
105  !   Latitude en u
[4253]106  status=NF90_DEF_VAR(ncid_out,'latu',NF90_FLOAT,out_latudim, out_latuid)
[1488]107  CALL handle_err(status)
108  status=NF_PUT_ATT_TEXT(ncid_out,out_latuid,'units', 13,'degrees_north')
109  status=NF_PUT_ATT_TEXT(ncid_out,out_latuid,'long_name', 8,'Latitude en u')
110
111  !  Latitude en v
[4253]112  status=NF90_DEF_VAR(ncid_out,'latv',NF90_FLOAT,out_latvdim, out_latvid)
[1488]113  CALL handle_err(status)
114  status=NF_PUT_ATT_TEXT(ncid_out,out_latvid,'units', 13,'degrees_north')
115  status=NF_PUT_ATT_TEXT(ncid_out,out_latvid,'long_name', 8,'Latitude en v')
116
117  !   ecriture de la grille u
118  out_dim(1)=out_lonudim
119  out_dim(2)=out_latudim
[4253]120  status=NF90_DEF_VAR(ncid_out,'grille_u',NF90_FLOAT,out_dim, out_varid)
[1488]121  CALL handle_err(status)
122  status=NF_PUT_ATT_TEXT(ncid_out,out_varid,'units', 6,'Kelvin')
123  status=NF_PUT_ATT_TEXT(ncid_out,out_varid,'long_name', 16,'Grille aux point u')
124
125  !   ecriture de la grille v
126  out_dim(1)=out_lonvdim
127  out_dim(2)=out_latvdim
[4253]128  status=NF90_DEF_VAR(ncid_out,'grille_v',NF90_FLOAT,out_dim, out_varid)
[1488]129  CALL handle_err(status)
130  status=NF_PUT_ATT_TEXT(ncid_out,out_varid,'units', 6,'Kelvin')
131  status=NF_PUT_ATT_TEXT(ncid_out,out_varid,'long_name', 16,'Grille aux point v')
132
133  !   ecriture de la grille u
134  out_dim(1)=out_lonvdim
135  out_dim(2)=out_latudim
[4253]136  status=NF90_DEF_VAR(ncid_out,'grille_s',NF90_FLOAT,out_dim, out_varid)
[1488]137  CALL handle_err(status)
138  status=NF_PUT_ATT_TEXT(ncid_out,out_varid,'units', 6,'Kelvin')
139  status=NF_PUT_ATT_TEXT(ncid_out,out_varid,'long_name',16,'Grille aux point u')
140
141  status=NF_ENDDEF(ncid_out)
[1984]142  write(*,*) "COUCOU 6"
143  CALL handle_err(status)
[1488]144  ! 5) ----- FERMETURE DES FICHIERS NETCDF------------------
145  ! --------------------------------------------------------
146  ! 3-b- Ecriture de la grille pour la sortie
147  ! rajoute l'ecriture de la grille
148
[4259]149  status=NF90_PUT_VAR(ncid_out,out_lonuid,rlonudeg,[1],[iim+1])
[1984]150  CALL handle_err(status)
[4259]151  status=NF90_PUT_VAR(ncid_out,out_lonvid,rlonvdeg,[1],[iim+1])
[1984]152  CALL handle_err(status)
[4259]153  status=NF90_PUT_VAR(ncid_out,out_latuid,rlatudeg,[1],[jjm+1])
[1984]154  CALL handle_err(status)
[4259]155  status=NF90_PUT_VAR(ncid_out,out_latvid,rlatvdeg,[1],[jjm])
[1984]156  CALL handle_err(status)
[1488]157
158  start(1)=1
159  start(2)=1
160  start(3)=1
161  start(4)=1
162
163  COUNT(1)=iim+1
164  COUNT(2)=jjm+1
165  COUNT(3)=1
166  COUNT(4)=1
167
168  DO j=1,jjm+1
169     DO i=1,iim+1
170        temp(i,j)=MOD(i,2)+MOD(j,2)
171     ENDDO
172  ENDDO
173
[4259]174  status=NF90_PUT_VAR(ncid_out,out_varid,temp,start, count)
[1984]175  CALL handle_err(status)
[1488]176
[1511]177  ! On re-ouvre le fichier pour rajouter 4 nouvelles variables necessaire pour INCA
178! lev - phis - aire - mask
[1984]179! rlevdeg(:) = presnivs
180  rlevdeg(:) = presnivs(:)
[1511]181  phis_loc(:,:) = phis(:,:)/g
[1488]182
[1511]183! niveaux de pression verticaux
184  status = NF_REDEF (ncid_out)
[1984]185  CALL handle_err(status)
[1511]186  status=NF_DEF_DIM(ncid_out,'lev',llm,out_levdim)
[1984]187  CALL handle_err(status)
[4253]188  status=NF90_DEF_VAR(ncid_out,'presnivs',NF90_FLOAT,out_levdim,&
[1984]189                    presnivs_id)
190  CALL handle_err(status)
[1511]191 
192! fields
193  out_dim(1)=out_lonvdim
194  out_dim(2)=out_latudim
195
[4253]196  status = nf90_def_var(ncid_out,'phis',NF90_FLOAT,out_dim,phis_id)
[1511]197  CALL handle_err(status)
[4253]198  status = nf90_def_var(ncid_out,'aire',NF90_FLOAT,out_dim,area_id)
[1511]199  CALL handle_err(status)
[4253]200  status = nf90_def_var(ncid_out,'mask',NF90_INT,out_dim,mask_id)
[1511]201  CALL handle_err(status)
202
203  status=NF_ENDDEF(ncid_out)
[1984]204  CALL handle_err(status)
[1511]205
206  ! ecriture des variables
[4259]207  status=NF90_PUT_VAR(ncid_out,presnivs_id,rlevdeg,[1],[llm])
[1984]208  CALL handle_err(status)
[1511]209
210  start(1)=1
211  start(2)=1
212  start(3)=1
213  start(4)=0
214  COUNT(1)=iip1
215  COUNT(2)=jjp1
216  COUNT(3)=1
217  COUNT(4)=0
218
[4259]219  status = nf90_put_var(ncid_out, phis_id, phis_loc,start,count)
[1984]220  CALL handle_err(status)
[4259]221  status = nf90_put_var(ncid_out, area_id, aire,start,count)
[1984]222  CALL handle_err(status)
[1511]223  masque_int(:,:) = nINT(masque(:,:))
[4259]224  status = nf90_put_var(ncid_out, mask_id,masque_int,start,count)
[1511]225  CALL handle_err(status)
226 
[1488]227  ! fermeture du fichier netcdf
228  CALL ncclos(ncid_out,rcode_out)
229
230END SUBROUTINE grilles_gcm_netcdf_sub
231
232
233
234SUBROUTINE handle_err(status)
235  INCLUDE "netcdf.inc"
236
237  INTEGER status
238  IF (status.NE.nf_noerr) THEN
239     PRINT *,NF_STRERROR(status)
240     CALL abort_gcm('grilles_gcm_netcdf','netcdf error',1)
241  ENDIF
242END SUBROUTINE handle_err
243
Note: See TracBrowser for help on using the repository browser.