LMDZ
grilles_gcm_netcdf_sub.F90
Go to the documentation of this file.
1 !
2 ! $Id: $
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
6 ! ce0l. This subroutine corresponds to the first
7 ! part in the program create_fausse_var.
8 !
9 SUBROUTINE grilles_gcm_netcdf_sub(masque,phis)
10 
11  IMPLICIT NONE
12 
13  include "dimensions.h"
14  include "paramet.h"
15  include "comconst.h"
16  include "comgeom.h"
17  include "comvert.h"
18  include "netcdf.inc"
19  include "serre.h"
20 
21 
22  REAL,DIMENSION(iip1,jjp1),INTENT(IN) :: masque ! masque terre/mer
23  REAL,DIMENSION(iip1,jjp1),INTENT(IN) :: phis ! geopotentiel au sol
24 
25  REAL temp(iim+1,jjm+1)
26  ! Attributs netcdf sortie
27  INTEGER ncid_out,rcode_out
28  INTEGER out_lonuid,out_lonvid,out_latuid,out_latvid,out_levid
29  INTEGER out_varid
30  INTEGER out_lonudim,out_lonvdim
31  INTEGER out_latudim,out_latvdim,out_dim(3)
32  INTEGER out_levdim
33 
34  INTEGER start(4),COUNT(4)
35 
36  INTEGER status,i,j
37  REAL rlatudeg(jjp1),rlatvdeg(jjm),rlevdeg(llm)
38  REAL rlonudeg(iip1),rlonvdeg(iip1)
39 
40  REAL dlon1(iip1),dlon2(iip1),dlat1(jjp1),dlat2(jjp1)
41  REAL acoslat,dxkm,dykm,resol(iip1,jjp1)
42  REAL,DIMENSION(iip1,jjp1) :: phis_loc
43  INTEGER masque_int(iip1,jjp1)
44  INTEGER :: phis_id
45  INTEGER :: area_id
46  INTEGER :: mask_id
47  INTEGER :: presnivs_id
48 
49  rad = 6400000
50  omeg = 7.272205e-05
51  g = 9.8
52  kappa = 0.285716
53  daysec = 86400
54  cpp = 1004.70885
55 
56  preff = 101325.
57  pa= 50000.
58 
59  CALL conf_gcm( 99, .true. )
60  CALL iniconst
61  CALL inigeom
62 
63  DO j=1,jjp1
64  rlatudeg(j)=rlatu(j)*180./pi
65  ENDDO
66  DO j=1,jjm
67  rlatvdeg(j)=rlatv(j)*180./pi
68  ENDDO
69 
70  DO i=1,iip1
71  rlonudeg(i)=rlonu(i)*180./pi + 360.
72  rlonvdeg(i)=rlonv(i)*180./pi + 360.
73  ENDDO
74 
75 
76  ! 2 ----- OUVERTURE DE LA SORTIE NETCDF
77  ! ---------------------------------------------------
78  ! CREATION OUTPUT
79  ! ouverture fichier netcdf de sortie out
80  status=nf_create('grilles_gcm.nc',nf_clobber,ncid_out)
81  CALL handle_err(status)
82  status=nf_def_dim(ncid_out,'lonu',iim+1,out_lonudim)
83  CALL handle_err(status)
84  status=nf_def_dim(ncid_out,'lonv',iim+1,out_lonvdim)
85  CALL handle_err(status)
86  status=nf_def_dim(ncid_out,'latu',jjm+1,out_latudim)
87  CALL handle_err(status)
88  status=nf_def_dim(ncid_out,'latv',jjm,out_latvdim)
89  CALL handle_err(status)
90 
91 
92  ! Longitudes en u
93  status=nf_def_var(ncid_out,'lonu',nf_float,1,out_lonudim, out_lonuid)
94  CALL handle_err(status)
95  status=nf_put_att_text(ncid_out,out_lonuid,'units', 12,'degrees_east')
96  status=nf_put_att_text(ncid_out,out_lonuid,'long_name',9,'Longitude en u')
97 
98  ! Longitudes en v
99  status=nf_def_var(ncid_out,'lonv',nf_float,1,out_lonvdim, out_lonvid)
100  CALL handle_err(status)
101  status=nf_put_att_text(ncid_out,out_lonvid,'units', 12,'degrees_east')
102  status=nf_put_att_text(ncid_out,out_lonvid,'long_name', 9,'Longitude en v')
103 
104  ! Latitude en u
105  status=nf_def_var(ncid_out,'latu',nf_float,1,out_latudim, out_latuid)
106  CALL handle_err(status)
107  status=nf_put_att_text(ncid_out,out_latuid,'units', 13,'degrees_north')
108  status=nf_put_att_text(ncid_out,out_latuid,'long_name', 8,'Latitude en u')
109 
110  ! Latitude en v
111  status=nf_def_var(ncid_out,'latv',nf_float,1,out_latvdim, out_latvid)
112  CALL handle_err(status)
113  status=nf_put_att_text(ncid_out,out_latvid,'units', 13,'degrees_north')
114  status=nf_put_att_text(ncid_out,out_latvid,'long_name', 8,'Latitude en v')
115 
116  ! ecriture de la grille u
117  out_dim(1)=out_lonudim
118  out_dim(2)=out_latudim
119  status=nf_def_var(ncid_out,'grille_u',nf_float,2,out_dim, out_varid)
120  CALL handle_err(status)
121  status=nf_put_att_text(ncid_out,out_varid,'units', 6,'Kelvin')
122  status=nf_put_att_text(ncid_out,out_varid,'long_name', 16,'Grille aux point u')
123 
124  ! ecriture de la grille v
125  out_dim(1)=out_lonvdim
126  out_dim(2)=out_latvdim
127  status=nf_def_var(ncid_out,'grille_v',nf_float,2,out_dim, out_varid)
128  CALL handle_err(status)
129  status=nf_put_att_text(ncid_out,out_varid,'units', 6,'Kelvin')
130  status=nf_put_att_text(ncid_out,out_varid,'long_name', 16,'Grille aux point v')
131 
132  ! ecriture de la grille u
133  out_dim(1)=out_lonvdim
134  out_dim(2)=out_latudim
135  status=nf_def_var(ncid_out,'grille_s',nf_float,2,out_dim, out_varid)
136  CALL handle_err(status)
137  status=nf_put_att_text(ncid_out,out_varid,'units', 6,'Kelvin')
138  status=nf_put_att_text(ncid_out,out_varid,'long_name',16,'Grille aux point u')
139 
140  status=nf_enddef(ncid_out)
141  write(*,*) "COUCOU 6"
142  CALL handle_err(status)
143  ! 5) ----- FERMETURE DES FICHIERS NETCDF------------------
144  ! --------------------------------------------------------
145  ! 3-b- Ecriture de la grille pour la sortie
146  ! rajoute l'ecriture de la grille
147 
148 #ifdef NC_DOUBLE
149  status=nf_put_vara_double(ncid_out,out_lonuid,1,iim+1,rlonudeg)
150  CALL handle_err(status)
151  status=nf_put_vara_double(ncid_out,out_lonvid,1,iim+1,rlonvdeg)
152  CALL handle_err(status)
153  status=nf_put_vara_double(ncid_out,out_latuid,1,jjm+1,rlatudeg)
154  CALL handle_err(status)
155  status=nf_put_vara_double(ncid_out,out_latvid,1,jjm,rlatvdeg)
156  CALL handle_err(status)
157 #else
158  status=nf_put_vara_real(ncid_out,out_lonuid,1,iim+1,rlonudeg)
159  CALL handle_err(status)
160  status=nf_put_vara_real(ncid_out,out_lonvid,1,iim+1,rlonvdeg)
161  CALL handle_err(status)
162  status=nf_put_vara_real(ncid_out,out_latuid,1,jjm+1,rlatudeg)
163  CALL handle_err(status)
164  status=nf_put_vara_real(ncid_out,out_latvid,1,jjm,rlatvdeg)
165  CALL handle_err(status)
166 #endif
167 
168  start(1)=1
169  start(2)=1
170  start(3)=1
171  start(4)=1
172 
173  count(1)=iim+1
174  count(2)=jjm+1
175  count(3)=1
176  count(4)=1
177 
178  DO j=1,jjm+1
179  DO i=1,iim+1
180  temp(i,j)=mod(i,2)+mod(j,2)
181  ENDDO
182  ENDDO
183 
184 #ifdef NC_DOUBLE
185  status=nf_put_vara_double(ncid_out,out_varid,start, count,temp)
186  CALL handle_err(status)
187 #else
188  status=nf_put_vara_real(ncid_out,out_varid,start, count,temp)
189  CALL handle_err(status)
190 #endif
191 
192  ! On re-ouvre le fichier pour rajouter 4 nouvelles variables necessaire pour INCA
193 ! lev - phis - aire - mask
194 ! rlevdeg(:) = presnivs
195  rlevdeg(:) = presnivs(:)
196  phis_loc(:,:) = phis(:,:)/g
197 
198 ! niveaux de pression verticaux
199  status = nf_redef(ncid_out)
200  CALL handle_err(status)
201  status=nf_def_dim(ncid_out,'lev',llm,out_levdim)
202  CALL handle_err(status)
203  status=nf_def_var(ncid_out,'presnivs',nf_float,1,out_levdim,&
204  presnivs_id)
205  CALL handle_err(status)
206 
207 ! fields
208  out_dim(1)=out_lonvdim
209  out_dim(2)=out_latudim
210 
211  status = nf_def_var(ncid_out,'phis',nf_float,2,out_dim,phis_id)
212  CALL handle_err(status)
213  status = nf_def_var(ncid_out,'aire',nf_float,2,out_dim,area_id)
214  CALL handle_err(status)
215  status = nf_def_var(ncid_out,'mask',nf_int ,2,out_dim,mask_id)
216  CALL handle_err(status)
217 
218  status=nf_enddef(ncid_out)
219  CALL handle_err(status)
220 
221  ! ecriture des variables
222 #ifdef NC_DOUBLE
223  status=nf_put_vara_double(ncid_out,presnivs_id,1,llm,rlevdeg)
224  CALL handle_err(status)
225 #else
226  status=nf_put_vara_real(ncid_out,out_levid,1,llm,rlevdeg)
227  CALL handle_err(status)
228 #endif
229 
230  start(1)=1
231  start(2)=1
232  start(3)=1
233  start(4)=0
234  count(1)=iip1
235  count(2)=jjp1
236  count(3)=1
237  count(4)=0
238 
239  status = nf_put_vara_double(ncid_out, phis_id,start,count, phis_loc)
240  CALL handle_err(status)
241  status = nf_put_vara_double(ncid_out, area_id,start,count, aire)
242  CALL handle_err(status)
243  masque_int(:,:) = nint(masque(:,:))
244  status = nf_put_vara_int(ncid_out, mask_id,start,count,masque_int)
245  CALL handle_err(status)
246 
247  ! fermeture du fichier netcdf
248  CALL ncclos(ncid_out,rcode_out)
249 
250 END SUBROUTINE grilles_gcm_netcdf_sub
251 
252 
253 
254 SUBROUTINE handle_err(status)
255  include "netcdf.inc"
256 
257  INTEGER status
258  IF (status.NE.nf_noerr) THEN
259  print *,nf_strerror(status)
260  CALL abort_gcm('grilles_gcm_netcdf','netcdf error',1)
261  ENDIF
262 END SUBROUTINE handle_err
263 
subroutine handle_err(status)
!$Id mode_top_bound COMMON comconstr g
Definition: comconst.h:7
subroutine grilles_gcm_netcdf_sub(masque, phis)
!$Id preff
Definition: comvert.h:8
!$Id mode_top_bound COMMON comconstr kappa
Definition: comconst.h:7
subroutine abort_gcm(modname, message, ierr)
Definition: abort_gcm.F:7
!$Id Turb_fcg_gcssold get_uvd hqturb_gcssold endif!large scale llm day day1 day day1 *dt_toga endif!time annee_ref dt_toga u_toga vq_toga w_prof vq_prof llm day day1 day day1 *dt_dice endif!time annee_ref dt_dice swup_dice vg_dice omega_dice tg_prof vg_profd w_profd omega_profd!do llm!print llm l llm
!$Id mode_top_bound COMMON comconstr && pi
Definition: comconst.h:7
!$Header!CDK comgeom COMMON comgeom aire
Definition: comgeom.h:25
!$Header!CDK comgeom COMMON comgeom rlatu
Definition: comgeom.h:25
!$Id presnivs(llm)
subroutine inigeom
Definition: inigeom.F:7
!$Id mode_top_bound COMMON comconstr rad
Definition: comconst.h:7
!$Header jjp1
Definition: paramet.h:14
!$Id mode_top_bound COMMON comconstr cpp
Definition: comconst.h:7
!$Id mode_top_bound COMMON comconstr daysec
Definition: comconst.h:7
subroutine conf_gcm(tapedef, etatinit)
Definition: conf_gcm.F90:5
!$Header!CDK comgeom COMMON comgeom rlonu
Definition: comgeom.h:25
!$Header!CDK comgeom COMMON comgeom rlatv
Definition: comgeom.h:25
!$Id && pa
Definition: comvert.h:8
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL true
c c zjulian c cym CALL iim cym klev iim
Definition: ini_bilKP_ave.h:24
subroutine iniconst
Definition: iniconst.F90:5
!$Header!CDK comgeom COMMON comgeom rlonv
Definition: comgeom.h:25