LMDZ
mod_1D_amma_read.F90
Go to the documentation of this file.
2 
3 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4 !Declarations specifiques au cas AMMA
5  character*80 :: fich_amma
6 ! Option du cas AMMA ou on impose la discretisation verticale (Ap,Bp)
7  integer nlev_amma, nt_amma
8 
9 
12  real day_ju_ini_amma ! Julian day of amma first day
15  parameter(day_ini_amma=10) ! 10 = 10Juil2006
16  parameter(heure_ini_amma=0.) !0h en secondes
17  real dt_amma
18  parameter(dt_amma=1800.)
19 
20 !profils initiaux:
21  real, allocatable:: plev_amma(:)
22 
23  real, allocatable:: z_amma(:)
24  real, allocatable:: th_amma(:),q_amma(:)
25  real, allocatable:: u_amma(:)
26  real, allocatable:: v_amma(:)
27 
28  real, allocatable:: th_ammai(:),q_ammai(:)
29  real, allocatable:: u_ammai(:)
30  real, allocatable:: v_ammai(:)
31  real, allocatable:: vitw_ammai(:)
32  real, allocatable:: ht_ammai(:)
33  real, allocatable:: hq_ammai(:)
34  real, allocatable:: vt_ammai(:)
35  real, allocatable:: vq_ammai(:)
36 
37 !forcings
38  real, allocatable:: ht_amma(:,:)
39  real, allocatable:: hq_amma(:,:)
40  real, allocatable:: vitw_amma(:,:)
41  real, allocatable:: lat_amma(:),sens_amma(:)
42 
43 !champs interpoles
44  real, allocatable:: vitw_profamma(:)
45  real, allocatable:: ht_profamma(:)
46  real, allocatable:: hq_profamma(:)
48  real, allocatable:: vt_profamma(:)
49  real, allocatable:: vq_profamma(:)
50  real, allocatable:: th_profamma(:)
51  real, allocatable:: q_profamma(:)
52  real, allocatable:: u_profamma(:)
53  real, allocatable:: v_profamma(:)
54 
55 
56 CONTAINS
57 
58 SUBROUTINE read_1d_cases
59  implicit none
60 
61 #include "netcdf.inc"
62 
63  INTEGER nid,rid,ierr
64 
65  fich_amma='amma.nc'
66  print*,'fich_amma ',fich_amma
67  ierr = nf_open(fich_amma,nf_nowrite,nid)
68  print*,'fich_amma,NF_NOWRITE,nid ',fich_amma,nf_nowrite,nid
69  if (ierr.NE.nf_noerr) then
70  write(*,*) 'ERROR: GROS Pb opening forcings nc file '
71  write(*,*) nf_strerror(ierr)
72  stop ""
73  endif
74 !.......................................................................
75  ierr=nf_inq_dimid(nid,'lev',rid)
76  IF (ierr.NE.nf_noerr) THEN
77  print*, 'Oh probleme lecture dimension zz'
78  ENDIF
79  ierr=nf_inq_dimlen(nid,rid,nlev_amma)
80  print*,'OK nid,rid,nlev_amma',nid,rid,nlev_amma
81 !.......................................................................
82  ierr=nf_inq_dimid(nid,'time',rid)
83  print*,'nid,rid',nid,rid
84  nt_amma=0
85  IF (ierr.NE.nf_noerr) THEN
86  stop 'probleme lecture dimension sens'
87  ENDIF
88  ierr=nf_inq_dimlen(nid,rid,nt_amma)
89  print*,'nid,rid,nlev_amma',nid,rid,nt_amma
90 
91 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
92 !profils initiaux:
93  allocate(plev_amma(nlev_amma))
94 
95  allocate(z_amma(nlev_amma))
96  allocate(th_amma(nlev_amma),q_amma(nlev_amma))
97  allocate(u_amma(nlev_amma))
98  allocate(v_amma(nlev_amma))
99 
100 !forcings
101  allocate(ht_amma(nlev_amma,nt_amma))
102  allocate(hq_amma(nlev_amma,nt_amma))
103  allocate(vitw_amma(nlev_amma,nt_amma))
104  allocate(lat_amma(nt_amma),sens_amma(nt_amma))
105 
106 !profils initiaux:
107  allocate(th_ammai(nlev_amma),q_ammai(nlev_amma))
108  allocate(u_ammai(nlev_amma))
109  allocate(v_ammai(nlev_amma))
110  allocate(vitw_ammai(nlev_amma) )
111  allocate(ht_ammai(nlev_amma))
112  allocate(hq_ammai(nlev_amma))
113  allocate(vt_ammai(nlev_amma))
114  allocate(vq_ammai(nlev_amma))
115 
116 !champs interpoles
117  allocate(vitw_profamma(nlev_amma))
118  allocate(ht_profamma(nlev_amma))
119  allocate(hq_profamma(nlev_amma))
120  allocate(vt_profamma(nlev_amma))
121  allocate(vq_profamma(nlev_amma))
122  allocate(th_profamma(nlev_amma))
123  allocate(q_profamma(nlev_amma))
124  allocate(u_profamma(nlev_amma))
125  allocate(v_profamma(nlev_amma))
126 
127  print*,'Allocations OK'
128  call read_amma(nid,nlev_amma,nt_amma &
131 
132 END SUBROUTINE read_1d_cases
133 
134 
135 
136 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
137 SUBROUTINE deallocate_1d_cases
138 !profils initiaux:
139  deallocate(plev_amma)
140 
141  deallocate(z_amma)
142  deallocate(th_amma,q_amma)
143  deallocate(u_amma)
144  deallocate(v_amma)
145 
146  deallocate(th_ammai,q_ammai)
147  deallocate(u_ammai)
148  deallocate(v_ammai)
149  deallocate(vitw_ammai )
150  deallocate(ht_ammai)
151  deallocate(hq_ammai)
152  deallocate(vt_ammai)
153  deallocate(vq_ammai)
154 
155 !forcings
156  deallocate(ht_amma)
157  deallocate(hq_amma)
158  deallocate(vitw_amma)
159  deallocate(lat_amma,sens_amma)
160 
161 !champs interpoles
162  deallocate(vitw_profamma)
163  deallocate(ht_profamma)
164  deallocate(hq_profamma)
165  deallocate(vt_profamma)
166  deallocate(vq_profamma)
167  deallocate(th_profamma)
168  deallocate(q_profamma)
169  deallocate(u_profamma)
170  deallocate(v_profamma)
171 END SUBROUTINE deallocate_1d_cases
172 
173 
174 END MODULE mod_1d_amma_read
175 !=====================================================================
176  subroutine read_amma(nid,nlevel,ntime &
177  & ,zz,pp,temp,qv,u,v,dw &
178  & ,dt,dq,sens,flat)
180 !program reading forcings of the AMMA case study
181  implicit none
182 #include "netcdf.inc"
183 
184  integer ntime,nlevel
185 
186  real zz(nlevel)
187  real temp(nlevel),pp(nlevel)
188  real qv(nlevel),u(nlevel)
189  real v(nlevel)
190  real dw(nlevel,ntime)
191  real dt(nlevel,ntime)
192  real dq(nlevel,ntime)
193  real flat(ntime),sens(ntime)
194 
195 
196  integer nid, ierr,rid
197  integer nbvar3d
198  parameter(nbvar3d=30)
199  integer var3didin(nbvar3d)
200 
201  ierr=nf_inq_varid(nid,"zz",var3didin(1))
202  if(ierr/=nf_noerr) then
203  write(*,*) nf_strerror(ierr)
204  stop 'lev'
205  endif
206 
207 
208  ierr=nf_inq_varid(nid,"temp",var3didin(2))
209  if(ierr/=nf_noerr) then
210  write(*,*) nf_strerror(ierr)
211  stop 'temp'
212  endif
213 
214  ierr=nf_inq_varid(nid,"qv",var3didin(3))
215  if(ierr/=nf_noerr) then
216  write(*,*) nf_strerror(ierr)
217  stop 'qv'
218  endif
219 
220  ierr=nf_inq_varid(nid,"u",var3didin(4))
221  if(ierr/=nf_noerr) then
222  write(*,*) nf_strerror(ierr)
223  stop 'u'
224  endif
225 
226  ierr=nf_inq_varid(nid,"v",var3didin(5))
227  if(ierr/=nf_noerr) then
228  write(*,*) nf_strerror(ierr)
229  stop 'v'
230  endif
231 
232  ierr=nf_inq_varid(nid,"dw",var3didin(6))
233  if(ierr/=nf_noerr) then
234  write(*,*) nf_strerror(ierr)
235  stop 'dw'
236  endif
237 
238  ierr=nf_inq_varid(nid,"dt",var3didin(7))
239  if(ierr/=nf_noerr) then
240  write(*,*) nf_strerror(ierr)
241  stop 'dt'
242  endif
243 
244  ierr=nf_inq_varid(nid,"dq",var3didin(8))
245  if(ierr/=nf_noerr) then
246  write(*,*) nf_strerror(ierr)
247  stop 'dq'
248  endif
249 
250  ierr=nf_inq_varid(nid,"sens",var3didin(9))
251  if(ierr/=nf_noerr) then
252  write(*,*) nf_strerror(ierr)
253  stop 'sens'
254  endif
255 
256  ierr=nf_inq_varid(nid,"flat",var3didin(10))
257  if(ierr/=nf_noerr) then
258  write(*,*) nf_strerror(ierr)
259  stop 'flat'
260  endif
261 
262  ierr=nf_inq_varid(nid,"pp",var3didin(11))
263  if(ierr/=nf_noerr) then
264  write(*,*) nf_strerror(ierr)
265  endif
266 
267 !dimensions lecture
268 ! call catchaxis(nid,ntime,nlevel,time,z,ierr)
269 
270 #ifdef NC_DOUBLE
271  ierr = nf_get_var_double(nid,var3didin(1),zz)
272 #else
273  ierr = nf_get_var_real(nid,var3didin(1),zz)
274 #endif
275  if(ierr/=nf_noerr) then
276  write(*,*) nf_strerror(ierr)
277  stop "getvarup"
278  endif
279 ! write(*,*)'lecture z ok',zz
280 
281 #ifdef NC_DOUBLE
282  ierr = nf_get_var_double(nid,var3didin(2),temp)
283 #else
284  ierr = nf_get_var_real(nid,var3didin(2),temp)
285 #endif
286  if(ierr/=nf_noerr) then
287  write(*,*) nf_strerror(ierr)
288  stop "getvarup"
289  endif
290 ! write(*,*)'lecture th ok',temp
291 
292 #ifdef NC_DOUBLE
293  ierr = nf_get_var_double(nid,var3didin(3),qv)
294 #else
295  ierr = nf_get_var_real(nid,var3didin(3),qv)
296 #endif
297  if(ierr/=nf_noerr) then
298  write(*,*) nf_strerror(ierr)
299  stop "getvarup"
300  endif
301 ! write(*,*)'lecture qv ok',qv
302 
303 #ifdef NC_DOUBLE
304  ierr = nf_get_var_double(nid,var3didin(4),u)
305 #else
306  ierr = nf_get_var_real(nid,var3didin(4),u)
307 #endif
308  if(ierr/=nf_noerr) then
309  write(*,*) nf_strerror(ierr)
310  stop "getvarup"
311  endif
312 ! write(*,*)'lecture u ok',u
313 
314 #ifdef NC_DOUBLE
315  ierr = nf_get_var_double(nid,var3didin(5),v)
316 #else
317  ierr = nf_get_var_real(nid,var3didin(5),v)
318 #endif
319  if(ierr/=nf_noerr) then
320  write(*,*) nf_strerror(ierr)
321  stop "getvarup"
322  endif
323 ! write(*,*)'lecture v ok',v
324 
325 #ifdef NC_DOUBLE
326  ierr = nf_get_var_double(nid,var3didin(6),dw)
327 #else
328  ierr = nf_get_var_real(nid,var3didin(6),dw)
329 #endif
330  if(ierr/=nf_noerr) then
331  write(*,*) nf_strerror(ierr)
332  stop "getvarup"
333  endif
334 ! write(*,*)'lecture w ok',dw
335 
336 #ifdef NC_DOUBLE
337  ierr = nf_get_var_double(nid,var3didin(7),dt)
338 #else
339  ierr = nf_get_var_real(nid,var3didin(7),dt)
340 #endif
341  if(ierr/=nf_noerr) then
342  write(*,*) nf_strerror(ierr)
343  stop "getvarup"
344  endif
345 ! write(*,*)'lecture dt ok',dt
346 
347 #ifdef NC_DOUBLE
348  ierr = nf_get_var_double(nid,var3didin(8),dq)
349 #else
350  ierr = nf_get_var_real(nid,var3didin(8),dq)
351 #endif
352  if(ierr/=nf_noerr) then
353  write(*,*) nf_strerror(ierr)
354  stop "getvarup"
355  endif
356 ! write(*,*)'lecture dq ok',dq
357 
358 #ifdef NC_DOUBLE
359  ierr = nf_get_var_double(nid,var3didin(9),sens)
360 #else
361  ierr = nf_get_var_real(nid,var3didin(9),sens)
362 #endif
363  if(ierr/=nf_noerr) then
364  write(*,*) nf_strerror(ierr)
365  stop "getvarup"
366  endif
367 ! write(*,*)'lecture sens ok',sens
368 
369 #ifdef NC_DOUBLE
370  ierr = nf_get_var_double(nid,var3didin(10),flat)
371 #else
372  ierr = nf_get_var_real(nid,var3didin(10),flat)
373 #endif
374  if(ierr/=nf_noerr) then
375  write(*,*) nf_strerror(ierr)
376  stop "getvarup"
377  endif
378 ! write(*,*)'lecture flat ok',flat
379 
380 #ifdef NC_DOUBLE
381  ierr = nf_get_var_double(nid,var3didin(11),pp)
382 #else
383  ierr = nf_get_var_real(nid,var3didin(11),pp)
384 #endif
385  if(ierr/=nf_noerr) then
386  write(*,*) nf_strerror(ierr)
387  stop "getvarup"
388  endif
389 ! write(*,*)'lecture pp ok',pp
390 
391  return
392  end subroutine read_amma
393 !======================================================================
394  SUBROUTINE interp_amma_time(day,day1,annee_ref &
395  & ,year_ini_amma,day_ini_amma,nt_amma,dt_amma,nlev_amma &
396  & ,vitw_amma,ht_amma,hq_amma,lat_amma,sens_amma &
397  & ,vitw_prof,ht_prof,hq_prof,lat_prof,sens_prof)
398  implicit none
399 
400 !---------------------------------------------------------------------------------------
401 ! Time interpolation of a 2D field to the timestep corresponding to day
402 !
403 ! day: current julian day (e.g. 717538.2)
404 ! day1: first day of the simulation
405 ! nt_amma: total nb of data in the forcing (e.g. 48 for AMMA)
406 ! dt_amma: total time interval (in sec) between 2 forcing data (e.g. 30min for AMMA)
407 !---------------------------------------------------------------------------------------
408 
409 #include "compar1d.h"
410 
411 ! inputs:
412  integer annee_ref
413  integer nt_amma,nlev_amma
414  integer year_ini_amma
415  real day, day1,day_ini_amma,dt_amma
416  real vitw_amma(nlev_amma,nt_amma)
417  real ht_amma(nlev_amma,nt_amma)
418  real hq_amma(nlev_amma,nt_amma)
419  real lat_amma(nt_amma)
420  real sens_amma(nt_amma)
421 ! outputs:
422  real vitw_prof(nlev_amma)
423  real ht_prof(nlev_amma)
424  real hq_prof(nlev_amma)
425  real lat_prof,sens_prof
426 ! local:
427  integer it_amma1, it_amma2,k
428  real timeit,time_amma1,time_amma2,frac
429 
430 
431  if (forcing_type.eq.6) then
432 ! Check that initial day of the simulation consistent with AMMA case:
433  if (annee_ref.ne.2006) then
434  print*,'Pour AMMA, annee_ref doit etre 2006'
435  print*,'Changer annee_ref dans run.def'
436  stop
437  endif
438  if (annee_ref.eq.2006 .and. day1.lt.day_ini_amma) then
439  print*,'AMMA a débuté le 10 juillet 2006',day1,day_ini_amma
440  print*,'Changer dayref dans run.def'
441  stop
442  endif
443  if (annee_ref.eq.2006 .and. day1.gt.day_ini_amma+1) then
444  print*,'AMMA a fini le 11 juillet'
445  print*,'Changer dayref ou nday dans run.def'
446  stop
447  endif
448  endif
449 
450 ! Determine timestep relative to the 1st day of AMMA:
451 ! timeit=(day-day1)*86400.
452 ! if (annee_ref.eq.1992) then
453 ! timeit=(day-day_ini_toga)*86400.
454 ! else
455 ! timeit=(day+61.-1.)*86400. ! 61 days between Nov01 and Dec31 1992
456 ! endif
457  timeit=(day-day_ini_amma)*86400
458 
459 ! Determine the closest observation times:
460 ! it_amma1=INT(timeit/dt_amma)+1
461 ! it_amma2=it_amma1 + 1
462 ! time_amma1=(it_amma1-1)*dt_amma
463 ! time_amma2=(it_amma2-1)*dt_amma
464 
465  it_amma1=int(timeit/dt_amma)+1
466  IF (it_amma1 .EQ. nt_amma) THEN
467  it_amma2=it_amma1
468  ELSE
469  it_amma2=it_amma1 + 1
470  ENDIF
471  time_amma1=(it_amma1-1)*dt_amma
472  time_amma2=(it_amma2-1)*dt_amma
473 
474  if (it_amma1 .gt. nt_amma) then
475  write(*,*) 'PB-stop: day, it_amma1, it_amma2, timeit: ' &
476  & ,day,day_ini_amma,it_amma1,it_amma2,timeit/86400.
477  stop
478  endif
479 
480 ! time interpolation:
481  IF (it_amma1 .EQ. it_amma2) THEN
482  frac=0.
483  ELSE
484  frac=(time_amma2-timeit)/(time_amma2-time_amma1)
485  frac=max(frac,0.0)
486  ENDIF
487 
488  lat_prof = lat_amma(it_amma2) &
489  & -frac*(lat_amma(it_amma2)-lat_amma(it_amma1))
490  sens_prof = sens_amma(it_amma2) &
491  & -frac*(sens_amma(it_amma2)-sens_amma(it_amma1))
492 
493  do k=1,nlev_amma
494  vitw_prof(k) = vitw_amma(k,it_amma2) &
495  & -frac*(vitw_amma(k,it_amma2)-vitw_amma(k,it_amma1))
496  ht_prof(k) = ht_amma(k,it_amma2) &
497  & -frac*(ht_amma(k,it_amma2)-ht_amma(k,it_amma1))
498  hq_prof(k) = hq_amma(k,it_amma2) &
499  & -frac*(hq_amma(k,it_amma2)-hq_amma(k,it_amma1))
500  enddo
501 
502  return
503  END
504 
real, dimension(:), allocatable q_ammai
character *80 fich_amma
real, dimension(:), allocatable v_profamma
real, dimension(:), allocatable u_amma
real, dimension(:), allocatable ht_profamma
do llm!au dessus on relaxe vers profil init!on fait l hypothese que dans ce il n y a plus d eau liq au dessus!donc la relaxation en thetal et qt devient relaxation en tempe et qv l dq1 relax dq(l, 1)
real, dimension(:), allocatable hq_profamma
real, dimension(:), allocatable vt_profamma
subroutine read_amma(nid, nlevel, ntime, zz, pp, temp, qv, u, v, dw, dt, dq, sens, flat)
!$Id calend INTEGER itaufin INTEGER itau_phy INTEGER day_ref REAL dt
Definition: temps.h:15
!$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 ht_prof
real, dimension(:), allocatable sens_amma
real, dimension(:), allocatable th_ammai
real, dimension(:), allocatable th_profamma
real, dimension(:), allocatable q_profamma
real, dimension(:,:), allocatable hq_amma
real, dimension(:), allocatable vq_ammai
real, dimension(:), allocatable v_ammai
real, dimension(:), allocatable plev_amma
real, dimension(:,:), allocatable vitw_amma
real, dimension(:,:), allocatable ht_amma
real, dimension(:), allocatable u_ammai
real, dimension(:), allocatable q_amma
!$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 hq_prof
!$Header!integer nvarmx parameter(nfmx=10, imx=200, jmx=150, lmx=200, nvarmx=1000) real xd(imx
subroutine deallocate_1d_cases
!$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 u(l)
real, dimension(:), allocatable vitw_profamma
real, dimension(:), allocatable hq_ammai
real, dimension(:), allocatable v_amma
subroutine read_1d_cases
real, dimension(:), allocatable vitw_ammai
real, dimension(:), allocatable lat_amma
real, dimension(:), allocatable vt_ammai
real, dimension(:), allocatable th_amma
real, dimension(:), allocatable z_amma
real, dimension(:), allocatable ht_ammai
subroutine interp_amma_time(day, day1, annee_ref, year_ini_amma, day_ini_amma, nt_amma, dt_amma, nlev_amma, vitw_amma, ht_amma, hq_amma, lat_amma, sens_amma, vitw_prof, ht_prof, hq_prof, lat_prof, sens_prof)
!$Id flat
Definition: flux_arp.h:11
real, dimension(:), allocatable vq_profamma
real, dimension(:), allocatable u_profamma