source: LMDZ6/trunk/libf/phylmd/dyn1d/old_1DUTILS_read_interp.h @ 5075

Last change on this file since 5075 was 5075, checked in by abarral, 7 weeks ago

[continued & end] replace netcdf by lmdz_netcdf.F90 wrapper
"use netcdf" is now only used in lmdz_netcdf.F90 (except ecrad and obsolete/)
<include "netcdf.inc"> is now likewise only used in lmdz_netcdf.F90.

systematically specify explicitely <USE lmdz_netcdf, ONLY:> (probably left some missing, to correct later on)

Further replacement of nf_put_* by nf90_put_* (same for _get_)

[minor] replace deprecated boolean operators along the way

File size: 108.4 KB
Line 
1!======================================================================
2      SUBROUTINE read_togacoare(fich_toga,nlev_toga,nt_toga                     &
3     &             ,ts_toga,plev_toga,t_toga,q_toga,u_toga,v_toga,w_toga        &
4     &             ,ht_toga,vt_toga,hq_toga,vq_toga)
5      implicit none
6
7!-------------------------------------------------------------------------
8! Read TOGA-COARE forcing data
9!-------------------------------------------------------------------------
10
11      integer nlev_toga,nt_toga
12      real ts_toga(nt_toga),plev_toga(nlev_toga,nt_toga)
13      real t_toga(nlev_toga,nt_toga),q_toga(nlev_toga,nt_toga)
14      real u_toga(nlev_toga,nt_toga),v_toga(nlev_toga,nt_toga)
15      real w_toga(nlev_toga,nt_toga)
16      real ht_toga(nlev_toga,nt_toga),vt_toga(nlev_toga,nt_toga)
17      real hq_toga(nlev_toga,nt_toga),vq_toga(nlev_toga,nt_toga)
18      character*80 fich_toga
19
20      integer k,ip
21      real bid
22
23      integer iy,im,id,ih
24     
25       real plev_min
26
27       plev_min = 55.  ! pas de tendance de vap. d eau au-dessus de 55 hPa
28
29      open(21,file=trim(fich_toga),form='formatted')
30      read(21,'(a)') 
31      do ip = 1, nt_toga
32      read(21,'(a)') 
33      read(21,'(a)') 
34      read(21,223) iy, im, id, ih, bid, ts_toga(ip), bid,bid,bid,bid
35      read(21,'(a)') 
36      read(21,'(a)') 
37
38       do k = 1, nlev_toga
39         read(21,230) plev_toga(k,ip), t_toga(k,ip), q_toga(k,ip)          &
40     &       ,u_toga(k,ip), v_toga(k,ip), w_toga(k,ip)                     &
41     &       ,ht_toga(k,ip), vt_toga(k,ip), hq_toga(k,ip), vq_toga(k,ip)
42
43! conversion in SI units:
44         t_toga(k,ip)=t_toga(k,ip)+273.15     ! K
45         q_toga(k,ip)=q_toga(k,ip)*0.001      ! kg/kg
46         w_toga(k,ip)=w_toga(k,ip)*100./3600. ! Pa/s
47! no water vapour tendency above 55 hPa
48         if (plev_toga(k,ip) .lt. plev_min) then
49          q_toga(k,ip) = 0.
50          hq_toga(k,ip) = 0.
51          vq_toga(k,ip) =0.
52         endif
53       enddo
54
55         ts_toga(ip)=ts_toga(ip)+273.15       ! K
56       enddo
57       close(21)
58
59  223 format(4i3,6f8.2)
60  230 format(6f9.3,4e11.3)
61
62          return
63          end
64
65!-------------------------------------------------------------------------
66      SUBROUTINE read_sandu(fich_sandu,nlev_sandu,nt_sandu,ts_sandu)
67      implicit none
68
69!-------------------------------------------------------------------------
70! Read I.SANDU case forcing data
71!-------------------------------------------------------------------------
72
73      integer nlev_sandu,nt_sandu
74      real ts_sandu(nt_sandu)
75      character*80 fich_sandu
76
77      integer ip
78      integer iy,im,id,ih
79
80      real plev_min
81
82      print*,'nlev_sandu',nlev_sandu
83      plev_min = 55000.  ! pas de tendance de vap. d eau au-dessus de 55 hPa
84
85      open(21,file=trim(fich_sandu),form='formatted')
86      read(21,'(a)')
87      do ip = 1, nt_sandu
88      read(21,'(a)')
89      read(21,'(a)')
90      read(21,223) iy, im, id, ih, ts_sandu(ip)
91      print *,'ts=',iy,im,id,ih,ip,ts_sandu(ip)
92      enddo
93      close(21)
94
95  223 format(4i3,f8.2)
96
97          return
98          end
99
100!=====================================================================
101!-------------------------------------------------------------------------
102      SUBROUTINE read_astex(fich_astex,nlev_astex,nt_astex,div_astex,      &
103     & ts_astex,ug_astex,vg_astex,ufa_astex,vfa_astex)
104      implicit none
105
106!-------------------------------------------------------------------------
107! Read Astex case forcing data
108!-------------------------------------------------------------------------
109
110      integer nlev_astex,nt_astex
111      real div_astex(nt_astex),ts_astex(nt_astex),ug_astex(nt_astex)
112      real vg_astex(nt_astex),ufa_astex(nt_astex),vfa_astex(nt_astex)
113      character*80 fich_astex
114
115      integer ip
116      integer iy,im,id,ih
117
118       real plev_min
119
120      print*,'nlev_astex',nlev_astex
121       plev_min = 55000.  ! pas de tendance de vap. d eau au-dessus de 55 hPa
122
123      open(21,file=trim(fich_astex),form='formatted')
124      read(21,'(a)')
125      read(21,'(a)')
126      do ip = 1, nt_astex
127      read(21,'(a)')
128      read(21,'(a)')
129      read(21,223) iy, im, id, ih, div_astex(ip),ts_astex(ip),             &
130     &ug_astex(ip),vg_astex(ip),ufa_astex(ip),vfa_astex(ip)
131      ts_astex(ip)=ts_astex(ip)+273.15
132      print *,'ts=',iy,im,id,ih,ip,div_astex(ip),ts_astex(ip),             &
133     &ug_astex(ip),vg_astex(ip),ufa_astex(ip),vg_astex(ip)
134      enddo
135      close(21)
136
137  223 format(4i3,e13.2,f7.2,f7.3,f7.2,f7.3,f7.2)
138
139          return
140          end
141!=====================================================================
142      subroutine read_twpice(fich_twpice,nlevel,ntime                       &
143     &     ,T_srf,plev,T,q,u,v,omega                                       &
144     &     ,T_adv_h,T_adv_v,q_adv_h,q_adv_v)
145
146!program reading forcings of the TWP-ICE experiment
147
148        use lmdz_netcdf, ONLY: nf_open,nf_nowrite,nf_noerr,nf_strerror,nf_inq_varid,nf90_get_var,&
149            nf_inq_dimid,nf_inq_dimlen
150
151
152      implicit none
153
154      integer ntime,nlevel
155      integer l,k
156      character*80 :: fich_twpice
157      real*8 time(ntime)
158      real*8 lat, lon, alt, phis
159      real*8 lev(nlevel)
160      real*8 plev(nlevel,ntime)
161
162      real*8 T(nlevel,ntime)
163      real*8 q(nlevel,ntime),u(nlevel,ntime)
164      real*8 v(nlevel,ntime)
165      real*8 omega(nlevel,ntime), div(nlevel,ntime)
166      real*8 T_adv_h(nlevel,ntime)
167      real*8 T_adv_v(nlevel,ntime), q_adv_h(nlevel,ntime)
168      real*8 q_adv_v(nlevel,ntime)
169      real*8 s(nlevel,ntime), s_adv_h(nlevel,ntime)
170      real*8 s_adv_v(nlevel,ntime)
171      real*8 p_srf_aver(ntime), p_srf_center(ntime)
172      real*8 T_srf(ntime)
173
174      integer nid, ierr
175      integer nbvar3d
176      parameter(nbvar3d=20)
177      integer var3didin(nbvar3d)
178
179      ierr = NF_OPEN(fich_twpice,NF_NOWRITE,nid)
180      if (ierr.NE.NF_NOERR) then
181         write(*,*) 'ERROR: Pb opening forcings cdf file '
182         write(*,*) NF_STRERROR(ierr)
183         stop ""
184      endif
185
186      ierr=NF_INQ_VARID(nid,"lat",var3didin(1))
187         if(ierr/=NF_NOERR) then
188           write(*,*) NF_STRERROR(ierr)
189           stop 'lat'
190         endif
191     
192       ierr=NF_INQ_VARID(nid,"lon",var3didin(2))
193         if(ierr/=NF_NOERR) then
194           write(*,*) NF_STRERROR(ierr)
195           stop 'lon'
196         endif
197
198       ierr=NF_INQ_VARID(nid,"alt",var3didin(3))
199         if(ierr/=NF_NOERR) then
200           write(*,*) NF_STRERROR(ierr)
201           stop 'alt'
202         endif
203
204      ierr=NF_INQ_VARID(nid,"phis",var3didin(4))
205         if(ierr/=NF_NOERR) then
206           write(*,*) NF_STRERROR(ierr)
207           stop 'phis'
208         endif
209
210      ierr=NF_INQ_VARID(nid,"T",var3didin(5))
211         if(ierr/=NF_NOERR) then
212           write(*,*) NF_STRERROR(ierr)
213           stop 'T'
214         endif
215
216      ierr=NF_INQ_VARID(nid,"q",var3didin(6))
217         if(ierr/=NF_NOERR) then
218           write(*,*) NF_STRERROR(ierr)
219           stop 'q'
220         endif
221
222      ierr=NF_INQ_VARID(nid,"u",var3didin(7))
223         if(ierr/=NF_NOERR) then
224           write(*,*) NF_STRERROR(ierr)
225           stop 'u'
226         endif
227
228      ierr=NF_INQ_VARID(nid,"v",var3didin(8))
229         if(ierr/=NF_NOERR) then
230           write(*,*) NF_STRERROR(ierr)
231           stop 'v'
232         endif
233
234      ierr=NF_INQ_VARID(nid,"omega",var3didin(9))
235         if(ierr/=NF_NOERR) then
236           write(*,*) NF_STRERROR(ierr)
237           stop 'omega'
238         endif
239
240      ierr=NF_INQ_VARID(nid,"div",var3didin(10))
241         if(ierr/=NF_NOERR) then
242           write(*,*) NF_STRERROR(ierr)
243           stop 'div'
244         endif
245
246      ierr=NF_INQ_VARID(nid,"T_adv_h",var3didin(11))
247         if(ierr/=NF_NOERR) then
248           write(*,*) NF_STRERROR(ierr)
249           stop 'T_adv_h'
250         endif
251
252      ierr=NF_INQ_VARID(nid,"T_adv_v",var3didin(12))
253         if(ierr/=NF_NOERR) then
254           write(*,*) NF_STRERROR(ierr)
255           stop 'T_adv_v'
256         endif
257
258      ierr=NF_INQ_VARID(nid,"q_adv_h",var3didin(13))
259         if(ierr/=NF_NOERR) then
260           write(*,*) NF_STRERROR(ierr)
261           stop 'q_adv_h'
262         endif
263
264      ierr=NF_INQ_VARID(nid,"q_adv_v",var3didin(14))
265         if(ierr/=NF_NOERR) then
266           write(*,*) NF_STRERROR(ierr)
267           stop 'q_adv_v'
268         endif
269
270      ierr=NF_INQ_VARID(nid,"s",var3didin(15))
271         if(ierr/=NF_NOERR) then
272           write(*,*) NF_STRERROR(ierr)
273           stop 's'
274         endif
275
276      ierr=NF_INQ_VARID(nid,"s_adv_h",var3didin(16))
277         if(ierr/=NF_NOERR) then
278           write(*,*) NF_STRERROR(ierr)
279           stop 's_adv_h'
280         endif
281   
282      ierr=NF_INQ_VARID(nid,"s_adv_v",var3didin(17))
283         if(ierr/=NF_NOERR) then
284           write(*,*) NF_STRERROR(ierr)
285           stop 's_adv_v'
286         endif
287
288      ierr=NF_INQ_VARID(nid,"p_srf_aver",var3didin(18))
289         if(ierr/=NF_NOERR) then
290           write(*,*) NF_STRERROR(ierr)
291           stop 'p_srf_aver'
292         endif
293
294      ierr=NF_INQ_VARID(nid,"p_srf_center",var3didin(19))
295         if(ierr/=NF_NOERR) then
296           write(*,*) NF_STRERROR(ierr)
297           stop 'p_srf_center'
298         endif
299
300      ierr=NF_INQ_VARID(nid,"T_srf",var3didin(20))
301         if(ierr/=NF_NOERR) then
302           write(*,*) NF_STRERROR(ierr)
303           stop 'T_srf'
304         endif
305
306!dimensions lecture
307      call catchaxis(nid,ntime,nlevel,time,lev,ierr)
308
309!pressure
310       do l=1,ntime
311       do k=1,nlevel
312          plev(k,l)=lev(k)
313       enddo
314       enddo
315         
316         ierr = NF90_GET_VAR(nid,var3didin(1),lat)
317         if(ierr/=NF_NOERR) then
318            write(*,*) NF_STRERROR(ierr)
319            stop "getvarup"
320         endif
321!         write(*,*)'lecture lat ok',lat
322
323         ierr = NF90_GET_VAR(nid,var3didin(2),lon)
324         if(ierr/=NF_NOERR) then
325            write(*,*) NF_STRERROR(ierr)
326            stop "getvarup"
327         endif
328!         write(*,*)'lecture lon ok',lon
329 
330         ierr = NF90_GET_VAR(nid,var3didin(3),alt)
331         if(ierr/=NF_NOERR) then
332            write(*,*) NF_STRERROR(ierr)
333            stop "getvarup"
334         endif
335!          write(*,*)'lecture alt ok',alt
336 
337         ierr = NF90_GET_VAR(nid,var3didin(4),phis)
338         if(ierr/=NF_NOERR) then
339            write(*,*) NF_STRERROR(ierr)
340            stop "getvarup"
341         endif
342!          write(*,*)'lecture phis ok',phis
343         
344         ierr = NF90_GET_VAR(nid,var3didin(5),T)
345         if(ierr/=NF_NOERR) then
346            write(*,*) NF_STRERROR(ierr)
347            stop "getvarup"
348         endif
349!         write(*,*)'lecture T ok'
350
351         ierr = NF90_GET_VAR(nid,var3didin(6),q)
352         if(ierr/=NF_NOERR) then
353            write(*,*) NF_STRERROR(ierr)
354            stop "getvarup"
355         endif
356!         write(*,*)'lecture q ok'
357!q in kg/kg
358       do l=1,ntime
359       do k=1,nlevel
360          q(k,l)=q(k,l)/1000.
361       enddo
362       enddo
363         ierr = NF90_GET_VAR(nid,var3didin(7),u)
364         if(ierr/=NF_NOERR) then
365            write(*,*) NF_STRERROR(ierr)
366            stop "getvarup"
367         endif
368!         write(*,*)'lecture u ok'
369
370         ierr = NF90_GET_VAR(nid,var3didin(8),v)
371         if(ierr/=NF_NOERR) then
372            write(*,*) NF_STRERROR(ierr)
373            stop "getvarup"
374         endif
375!         write(*,*)'lecture v ok'
376
377         ierr = NF90_GET_VAR(nid,var3didin(9),omega)
378         if(ierr/=NF_NOERR) then
379            write(*,*) NF_STRERROR(ierr)
380            stop "getvarup"
381         endif
382!         write(*,*)'lecture omega ok'
383!omega in mb/hour
384       do l=1,ntime
385       do k=1,nlevel
386          omega(k,l)=omega(k,l)*100./3600.
387       enddo
388       enddo
389
390         ierr = NF90_GET_VAR(nid,var3didin(10),div)
391         if(ierr/=NF_NOERR) then
392            write(*,*) NF_STRERROR(ierr)
393            stop "getvarup"
394         endif
395!         write(*,*)'lecture div ok'
396
397         ierr = NF90_GET_VAR(nid,var3didin(11),T_adv_h)
398         if(ierr/=NF_NOERR) then
399            write(*,*) NF_STRERROR(ierr)
400            stop "getvarup"
401         endif
402!         write(*,*)'lecture T_adv_h ok'
403!T adv in K/s
404       do l=1,ntime
405       do k=1,nlevel
406          T_adv_h(k,l)=T_adv_h(k,l)/3600.
407       enddo
408       enddo
409
410
411         ierr = NF90_GET_VAR(nid,var3didin(12),T_adv_v)
412         if(ierr/=NF_NOERR) then
413            write(*,*) NF_STRERROR(ierr)
414            stop "getvarup"
415         endif
416!         write(*,*)'lecture T_adv_v ok'
417!T adv in K/s
418       do l=1,ntime
419       do k=1,nlevel
420          T_adv_v(k,l)=T_adv_v(k,l)/3600.
421       enddo
422       enddo
423
424         ierr = NF90_GET_VAR(nid,var3didin(13),q_adv_h)
425         if(ierr/=NF_NOERR) then
426            write(*,*) NF_STRERROR(ierr)
427            stop "getvarup"
428         endif
429!         write(*,*)'lecture q_adv_h ok'
430!q adv in kg/kg/s
431       do l=1,ntime
432       do k=1,nlevel
433          q_adv_h(k,l)=q_adv_h(k,l)/1000./3600.
434       enddo
435       enddo
436
437
438         ierr = NF90_GET_VAR(nid,var3didin(14),q_adv_v)
439         if(ierr/=NF_NOERR) then
440            write(*,*) NF_STRERROR(ierr)
441            stop "getvarup"
442         endif
443!         write(*,*)'lecture q_adv_v ok'
444!q adv in kg/kg/s
445       do l=1,ntime
446       do k=1,nlevel
447          q_adv_v(k,l)=q_adv_v(k,l)/1000./3600.
448       enddo
449       enddo
450
451
452         ierr = NF90_GET_VAR(nid,var3didin(15),s)
453         if(ierr/=NF_NOERR) then
454            write(*,*) NF_STRERROR(ierr)
455            stop "getvarup"
456         endif
457
458         ierr = NF90_GET_VAR(nid,var3didin(16),s_adv_h)
459         if(ierr/=NF_NOERR) then
460            write(*,*) NF_STRERROR(ierr)
461            stop "getvarup"
462         endif
463
464         ierr = NF90_GET_VAR(nid,var3didin(17),s_adv_v)
465         if(ierr/=NF_NOERR) then
466            write(*,*) NF_STRERROR(ierr)
467            stop "getvarup"
468         endif
469
470         ierr = NF90_GET_VAR(nid,var3didin(18),p_srf_aver)
471         if(ierr/=NF_NOERR) then
472            write(*,*) NF_STRERROR(ierr)
473            stop "getvarup"
474         endif
475
476         ierr = NF90_GET_VAR(nid,var3didin(19),p_srf_center)
477         if(ierr/=NF_NOERR) then
478            write(*,*) NF_STRERROR(ierr)
479            stop "getvarup"
480         endif
481
482         ierr = NF90_GET_VAR(nid,var3didin(20),T_srf)
483         if(ierr/=NF_NOERR) then
484            write(*,*) NF_STRERROR(ierr)
485            stop "getvarup"
486         endif
487!         write(*,*)'lecture T_srf ok', T_srf
488
489         return 
490         end subroutine read_twpice
491!=====================================================================
492         subroutine catchaxis(nid,ttm,llm,time,lev,ierr)
493
494         use lmdz_netcdf, ONLY: nf_open,nf_nowrite,nf_noerr,nf_strerror,nf_inq_varid,nf90_get_var,&
495            nf_inq_dimid,nf_inq_dimlen
496
497         implicit none
498         integer nid,ttm,llm
499         real*8 time(ttm)
500         real*8 lev(llm)
501         integer ierr
502
503         integer timevar,levvar
504         integer timelen,levlen
505         integer timedimin,levdimin
506
507! Control & lecture on dimensions
508! ===============================
509         ierr=NF_INQ_DIMID(nid,"time",timedimin)
510         ierr=NF_INQ_VARID(nid,"time",timevar)
511         if (ierr.NE.NF_NOERR) then
512            write(*,*) 'ERROR: Field <time> is missing'
513            stop "" 
514         endif
515         ierr=NF_INQ_DIMLEN(nid,timedimin,timelen)
516
517         ierr=NF_INQ_DIMID(nid,"lev",levdimin)
518         ierr=NF_INQ_VARID(nid,"lev",levvar)
519         if (ierr.NE.NF_NOERR) then
520             write(*,*) 'ERROR: Field <lev> is lacking'
521             stop "" 
522         endif
523         ierr=NF_INQ_DIMLEN(nid,levdimin,levlen)
524
525         if((timelen/=ttm).or.(levlen/=llm)) then
526            write(*,*) 'ERROR: Not the good lenght for axis'
527            write(*,*) 'longitude: ',timelen,ttm+1
528            write(*,*) 'latitude: ',levlen,llm
529            stop "" 
530         endif
531
532         ierr = NF90_GET_VAR(nid,timevar,time)
533         ierr = NF90_GET_VAR(nid,levvar,lev)
534
535       return
536       end
537!=====================================================================
538
539       SUBROUTINE interp_sandu_vertical(play,nlev_sandu,plev_prof          &
540     &         ,t_prof,thl_prof,q_prof,u_prof,v_prof,w_prof                &
541     &         ,omega_prof,o3mmr_prof                                      &
542     &         ,t_mod,thl_mod,q_mod,u_mod,v_mod,w_mod                      &
543     &         ,omega_mod,o3mmr_mod,mxcalc)
544
545       implicit none
546
547      INCLUDE "dimensions.h"
548
549!-------------------------------------------------------------------------
550! Vertical interpolation of SANDUREF forcing data onto model levels
551!-------------------------------------------------------------------------
552
553       integer nlevmax
554       parameter (nlevmax=41)
555       integer nlev_sandu,mxcalc
556!       real play(llm), plev_prof(nlevmax)
557!       real t_prof(nlevmax),q_prof(nlevmax)
558!       real u_prof(nlevmax),v_prof(nlevmax), w_prof(nlevmax)
559!       real ht_prof(nlevmax),vt_prof(nlevmax)
560!       real hq_prof(nlevmax),vq_prof(nlevmax)
561
562       real play(llm), plev_prof(nlev_sandu)
563       real t_prof(nlev_sandu),thl_prof(nlev_sandu),q_prof(nlev_sandu)
564       real u_prof(nlev_sandu),v_prof(nlev_sandu), w_prof(nlev_sandu)
565       real omega_prof(nlev_sandu),o3mmr_prof(nlev_sandu)
566
567       real t_mod(llm),thl_mod(llm),q_mod(llm)
568       real u_mod(llm),v_mod(llm), w_mod(llm)
569       real omega_mod(llm),o3mmr_mod(llm)
570
571       integer l,k,k1,k2
572       real frac,frac1,frac2,fact
573
574       do l = 1, llm
575
576        if (play(l).ge.plev_prof(nlev_sandu)) then
577
578        mxcalc=l
579         k1=0
580         k2=0
581
582         if (play(l).le.plev_prof(1)) then
583
584         do k = 1, nlev_sandu-1
585          if (play(l).le.plev_prof(k).and. play(l).gt.plev_prof(k+1)) then
586            k1=k
587            k2=k+1
588          endif
589         enddo
590
591         if (k1.eq.0 .or. k2.eq.0) then
592          write(*,*) 'PB! k1, k2 = ',k1,k2
593          write(*,*) 'l,play(l) = ',l,play(l)/100
594         do k = 1, nlev_sandu-1
595          write(*,*) 'k,plev_prof(k) = ',k,plev_prof(k)/100
596         enddo
597         endif
598
599         frac = (plev_prof(k2)-play(l))/(plev_prof(k2)-plev_prof(k1))
600         t_mod(l)= t_prof(k2) - frac*(t_prof(k2)-t_prof(k1))
601         thl_mod(l)= thl_prof(k2) - frac*(thl_prof(k2)-thl_prof(k1))
602         q_mod(l)= q_prof(k2) - frac*(q_prof(k2)-q_prof(k1))
603         u_mod(l)= u_prof(k2) - frac*(u_prof(k2)-u_prof(k1))
604         v_mod(l)= v_prof(k2) - frac*(v_prof(k2)-v_prof(k1))
605         w_mod(l)= w_prof(k2) - frac*(w_prof(k2)-w_prof(k1))
606         omega_mod(l)=omega_prof(k2)-frac*(omega_prof(k2)-omega_prof(k1))
607         o3mmr_mod(l)=o3mmr_prof(k2)-frac*(o3mmr_prof(k2)-o3mmr_prof(k1))
608
609         else !play>plev_prof(1)
610
611         k1=1
612         k2=2
613         frac1 = (play(l)-plev_prof(k2))/(plev_prof(k1)-plev_prof(k2))
614         frac2 = (play(l)-plev_prof(k1))/(plev_prof(k1)-plev_prof(k2))
615         t_mod(l)= frac1*t_prof(k1) - frac2*t_prof(k2)
616         thl_mod(l)= frac1*thl_prof(k1) - frac2*thl_prof(k2)
617         q_mod(l)= frac1*q_prof(k1) - frac2*q_prof(k2)
618         u_mod(l)= frac1*u_prof(k1) - frac2*u_prof(k2)
619         v_mod(l)= frac1*v_prof(k1) - frac2*v_prof(k2)
620         w_mod(l)= frac1*w_prof(k1) - frac2*w_prof(k2)
621         omega_mod(l)= frac1*omega_prof(k1) - frac2*omega_prof(k2)
622         o3mmr_mod(l)= frac1*o3mmr_prof(k1) - frac2*o3mmr_prof(k2)
623
624         endif ! play.le.plev_prof(1)
625
626        else ! above max altitude of forcing file
627
628!jyg
629         fact=20.*(plev_prof(nlev_sandu)-play(l))/plev_prof(nlev_sandu) !jyg
630         fact = max(fact,0.)                                           !jyg
631         fact = exp(-fact)                                             !jyg
632         t_mod(l)= t_prof(nlev_sandu)                                   !jyg
633         thl_mod(l)= thl_prof(nlev_sandu)                                   !jyg
634         q_mod(l)= q_prof(nlev_sandu)*fact                              !jyg
635         u_mod(l)= u_prof(nlev_sandu)*fact                              !jyg
636         v_mod(l)= v_prof(nlev_sandu)*fact                              !jyg
637         w_mod(l)= w_prof(nlev_sandu)*fact                              !jyg
638         omega_mod(l)= omega_prof(nlev_sandu)*fact                      !jyg
639         o3mmr_mod(l)= o3mmr_prof(nlev_sandu)*fact                      !jyg
640
641        endif ! play
642
643       enddo ! l
644
645       do l = 1,llm
646!      print *,'t_mod(l),thl_mod(l),q_mod(l),u_mod(l),v_mod(l) ',
647!    $        l,t_mod(l),thl_mod(l),q_mod(l),u_mod(l),v_mod(l)
648       enddo
649
650          return
651          end
652!=====================================================================
653       SUBROUTINE interp_astex_vertical(play,nlev_astex,plev_prof          &
654     &         ,t_prof,thl_prof,qv_prof,ql_prof,qt_prof,u_prof,v_prof      &
655     &         ,w_prof,tke_prof,o3mmr_prof                                 &
656     &         ,t_mod,thl_mod,qv_mod,ql_mod,qt_mod,u_mod,v_mod,w_mod       &
657     &         ,tke_mod,o3mmr_mod,mxcalc)
658
659       implicit none
660
661      INCLUDE "dimensions.h"
662
663!-------------------------------------------------------------------------
664! Vertical interpolation of Astex forcing data onto model levels
665!-------------------------------------------------------------------------
666
667       integer nlevmax
668       parameter (nlevmax=41)
669       integer nlev_astex,mxcalc
670!       real play(llm), plev_prof(nlevmax)
671!       real t_prof(nlevmax),qv_prof(nlevmax)
672!       real u_prof(nlevmax),v_prof(nlevmax), w_prof(nlevmax)
673!       real ht_prof(nlevmax),vt_prof(nlevmax)
674!       real hq_prof(nlevmax),vq_prof(nlevmax)
675
676       real play(llm), plev_prof(nlev_astex)
677       real t_prof(nlev_astex),thl_prof(nlev_astex),qv_prof(nlev_astex)
678       real u_prof(nlev_astex),v_prof(nlev_astex), w_prof(nlev_astex)
679       real o3mmr_prof(nlev_astex),ql_prof(nlev_astex)
680       real qt_prof(nlev_astex),tke_prof(nlev_astex)
681
682       real t_mod(llm),thl_mod(llm),qv_mod(llm)
683       real u_mod(llm),v_mod(llm), w_mod(llm),tke_mod(llm)
684       real o3mmr_mod(llm),ql_mod(llm),qt_mod(llm)
685
686       integer l,k,k1,k2
687       real frac,frac1,frac2,fact
688
689       do l = 1, llm
690
691        if (play(l).ge.plev_prof(nlev_astex)) then
692
693        mxcalc=l
694         k1=0
695         k2=0
696
697         if (play(l).le.plev_prof(1)) then
698
699         do k = 1, nlev_astex-1
700          if (play(l).le.plev_prof(k).and. play(l).gt.plev_prof(k+1)) then
701            k1=k
702            k2=k+1
703          endif
704         enddo
705
706         if (k1.eq.0 .or. k2.eq.0) then
707          write(*,*) 'PB! k1, k2 = ',k1,k2
708          write(*,*) 'l,play(l) = ',l,play(l)/100
709         do k = 1, nlev_astex-1
710          write(*,*) 'k,plev_prof(k) = ',k,plev_prof(k)/100
711         enddo
712         endif
713
714         frac = (plev_prof(k2)-play(l))/(plev_prof(k2)-plev_prof(k1))
715         t_mod(l)= t_prof(k2) - frac*(t_prof(k2)-t_prof(k1))
716         thl_mod(l)= thl_prof(k2) - frac*(thl_prof(k2)-thl_prof(k1))
717         qv_mod(l)= qv_prof(k2) - frac*(qv_prof(k2)-qv_prof(k1))
718         ql_mod(l)= ql_prof(k2) - frac*(ql_prof(k2)-ql_prof(k1))
719         qt_mod(l)= qt_prof(k2) - frac*(qt_prof(k2)-qt_prof(k1))
720         u_mod(l)= u_prof(k2) - frac*(u_prof(k2)-u_prof(k1))
721         v_mod(l)= v_prof(k2) - frac*(v_prof(k2)-v_prof(k1))
722         w_mod(l)= w_prof(k2) - frac*(w_prof(k2)-w_prof(k1))
723         tke_mod(l)= tke_prof(k2) - frac*(tke_prof(k2)-tke_prof(k1))
724         o3mmr_mod(l)=o3mmr_prof(k2)-frac*(o3mmr_prof(k2)-o3mmr_prof(k1))
725
726         else !play>plev_prof(1)
727
728         k1=1
729         k2=2
730         frac1 = (play(l)-plev_prof(k2))/(plev_prof(k1)-plev_prof(k2))
731         frac2 = (play(l)-plev_prof(k1))/(plev_prof(k1)-plev_prof(k2))
732         t_mod(l)= frac1*t_prof(k1) - frac2*t_prof(k2)
733         thl_mod(l)= frac1*thl_prof(k1) - frac2*thl_prof(k2)
734         qv_mod(l)= frac1*qv_prof(k1) - frac2*qv_prof(k2)
735         ql_mod(l)= frac1*ql_prof(k1) - frac2*ql_prof(k2)
736         qt_mod(l)= frac1*qt_prof(k1) - frac2*qt_prof(k2)
737         u_mod(l)= frac1*u_prof(k1) - frac2*u_prof(k2)
738         v_mod(l)= frac1*v_prof(k1) - frac2*v_prof(k2)
739         w_mod(l)= frac1*w_prof(k1) - frac2*w_prof(k2)
740         tke_mod(l)= frac1*tke_prof(k1) - frac2*tke_prof(k2)
741         o3mmr_mod(l)= frac1*o3mmr_prof(k1) - frac2*o3mmr_prof(k2)
742
743         endif ! play.le.plev_prof(1)
744
745        else ! above max altitude of forcing file
746
747!jyg
748         fact=20.*(plev_prof(nlev_astex)-play(l))/plev_prof(nlev_astex) !jyg
749         fact = max(fact,0.)                                           !jyg
750         fact = exp(-fact)                                             !jyg
751         t_mod(l)= t_prof(nlev_astex)                                   !jyg
752         thl_mod(l)= thl_prof(nlev_astex)                                   !jyg
753         qv_mod(l)= qv_prof(nlev_astex)*fact                              !jyg
754         ql_mod(l)= ql_prof(nlev_astex)*fact                              !jyg
755         qt_mod(l)= qt_prof(nlev_astex)*fact                              !jyg
756         u_mod(l)= u_prof(nlev_astex)*fact                              !jyg
757         v_mod(l)= v_prof(nlev_astex)*fact                              !jyg
758         w_mod(l)= w_prof(nlev_astex)*fact                              !jyg
759         tke_mod(l)= tke_prof(nlev_astex)*fact                              !jyg
760         o3mmr_mod(l)= o3mmr_prof(nlev_astex)*fact                      !jyg
761
762        endif ! play
763
764       enddo ! l
765
766       do l = 1,llm
767!      print *,'t_mod(l),thl_mod(l),qv_mod(l),u_mod(l),v_mod(l) ',
768!    $        l,t_mod(l),thl_mod(l),qv_mod(l),u_mod(l),v_mod(l)
769       enddo
770
771          return
772          end
773
774!======================================================================
775      SUBROUTINE read_rico(fich_rico,nlev_rico,ps_rico,play                &
776     &             ,ts_rico,t_rico,q_rico,u_rico,v_rico,w_rico             &
777     &             ,dth_dyn,dqh_dyn)
778      implicit none
779
780!-------------------------------------------------------------------------
781! Read RICO forcing data
782!-------------------------------------------------------------------------
783      INCLUDE "dimensions.h"
784
785
786      integer nlev_rico
787      real ts_rico,ps_rico
788      real t_rico(llm),q_rico(llm)
789      real u_rico(llm),v_rico(llm)
790      real w_rico(llm)
791      real dth_dyn(llm)
792      real dqh_dyn(llm)
793     
794
795      real play(llm),zlay(llm)
796     
797
798      real prico(nlev_rico),zrico(nlev_rico)
799
800      character*80 fich_rico
801
802      integer k,l
803
804     
805      print*,fich_rico
806      open(21,file=trim(fich_rico),form='formatted')
807        do k=1,llm
808      zlay(k)=0.
809         enddo
810     
811        read(21,*) ps_rico,ts_rico
812        prico(1)=ps_rico
813        zrico(1)=0.0
814      do l=2,nlev_rico
815        read(21,*) k,prico(l),zrico(l)
816      enddo
817       close(21)
818
819      do k=1,llm
820        do l=1,80
821          if(prico(l)>play(k)) then
822              if(play(k)>prico(l+1)) then
823                zlay(k)=zrico(l)+(play(k)-prico(l)) *                      &
824     &              (zrico(l+1)-zrico(l))/(prico(l+1)-prico(l))
825              else 
826                zlay(k)=zrico(l)+(play(k)-prico(80))*                      &
827     &              (zrico(81)-zrico(80))/(prico(81)-prico(80))
828              endif
829          endif
830        enddo
831        print*,k,zlay(k)
832        ! U
833        if(0 < zlay(k) .and. zlay(k) < 4000) then
834          u_rico(k)=-9.9 + (-1.9 + 9.9)*zlay(k)/4000
835        elseif(4000 < zlay(k) .and. zlay(k) < 12000) then
836       u_rico(k)=  -1.9 + (30.0 + 1.9) /                                   &
837     &          (12000 - 4000) * (zlay(k) - 4000)
838        elseif(12000 < zlay(k) .and. zlay(k) < 13000) then
839          u_rico(k)=30.0
840        elseif(13000 < zlay(k) .and. zlay(k) < 20000) then
841          u_rico(k)=30.0 - (30.0) /                                        &
842     & (20000 - 13000) * (zlay(k) - 13000)
843        else
844          u_rico(k)=0.0
845        endif
846
847!Q_v
848        if(0 < zlay(k) .and. zlay(k) < 740) then
849          q_rico(k)=16.0 + (13.8 - 16.0) / (740) * zlay(k)
850        elseif(740 < zlay(k) .and. zlay(k) < 3260) then
851          q_rico(k)=13.8 + (2.4 - 13.8) /                                   &
852     &          (3260 - 740) * (zlay(k) - 740)
853        elseif(3260 < zlay(k) .and. zlay(k) < 4000) then
854          q_rico(k)=2.4 + (1.8 - 2.4) /                                    &
855     &               (4000 - 3260) * (zlay(k) - 3260)
856        elseif(4000 < zlay(k) .and. zlay(k) < 9000) then
857          q_rico(k)=1.8 + (0 - 1.8) /                                      &
858     &             (9000 - 4000) * (zlay(k) - 4000)
859        else
860          q_rico(k)=0.0
861        endif
862
863!T
864        if(0 < zlay(k) .and. zlay(k) < 740) then
865          t_rico(k)=299.2 + (292.0 - 299.2) / (740) * zlay(k)
866        elseif(740 < zlay(k) .and. zlay(k) < 4000) then
867          t_rico(k)=292.0 + (278.0 - 292.0) /                              &                       
868     &       (4000 - 740) * (zlay(k) - 740)
869        elseif(4000 < zlay(k) .and. zlay(k) < 15000) then
870          t_rico(k)=278.0 + (203.0 - 278.0) /                              &
871     &       (15000 - 4000) * (zlay(k) - 4000)
872        elseif(15000 < zlay(k) .and. zlay(k) < 17500) then
873          t_rico(k)=203.0 + (194.0 - 203.0) /                              & 
874     &       (17500 - 15000)* (zlay(k) - 15000)
875        elseif(17500 < zlay(k) .and. zlay(k) < 20000) then
876          t_rico(k)=194.0 + (206.0 - 194.0) /                              &
877     &       (20000 - 17500)* (zlay(k) - 17500)
878        elseif(20000 < zlay(k) .and. zlay(k) < 60000) then
879          t_rico(k)=206.0 + (270.0 - 206.0) /                              & 
880     &        (60000 - 20000)* (zlay(k) - 20000)
881        endif
882
883! W
884        if(0 < zlay(k) .and. zlay(k) < 2260 ) then
885          w_rico(k)=- (0.005/2260) * zlay(k)
886        elseif(2260 < zlay(k) .and. zlay(k) < 4000 ) then
887          w_rico(k)=- 0.005
888        elseif(4000 < zlay(k) .and. zlay(k) < 5000 ) then
889       w_rico(k)=- 0.005 + (0.005/ (5000 - 4000)) * (zlay(k) - 4000)
890        else
891          w_rico(k)=0.0
892        endif
893
894! dThrz+dTsw0+dTlw0
895        if(0 < zlay(k) .and. zlay(k) < 4000) then
896          dth_dyn(k)=- 2.51 / 86400 + (-2.18 + 2.51 )/                     &
897     &               (86400*4000) * zlay(k)
898        elseif(4000 < zlay(k) .and. zlay(k) < 5000) then
899          dth_dyn(k)=- 2.18 / 86400 + ( 2.18 ) /                           &
900     &           (86400*(5000 - 4000)) * (zlay(k) - 4000)
901        else
902          dth_dyn(k)=0.0
903        endif
904! dQhrz
905        if(0 < zlay(k) .and. zlay(k) < 3000) then
906          dqh_dyn(k)=-1.0 / 86400 + (0.345 + 1.0)/                         &
907     &                    (86400*3000) * (zlay(k))
908        elseif(3000 < zlay(k) .and. zlay(k) < 4000) then
909          dqh_dyn(k)=0.345 / 86400
910        elseif(4000 < zlay(k) .and. zlay(k) < 5000) then
911          dqh_dyn(k)=0.345 / 86400 +                                       &
912     &   (-0.345)/(86400 * (5000 - 4000)) * (zlay(k)-4000)
913        else
914          dqh_dyn(k)=0.0
915        endif
916
917!?        if(play(k)>6e4) then
918!?          ratqs0(1,k)=ratqsbas*(plev(1)-play(k))/(plev(1)-6e4)
919!?        elseif((play(k)>3e4).and.(play(k)<6e4)) then
920!?          ratqs0(1,k)=ratqsbas+(ratqshaut-ratqsbas)&
921!?                          *(6e4-play(k))/(6e4-3e4)
922!?        else
923!?          ratqs0(1,k)=ratqshaut
924!?        endif
925
926      enddo
927
928      do k=1,llm
929      q_rico(k)=q_rico(k)/1e3 
930      dqh_dyn(k)=dqh_dyn(k)/1e3
931      v_rico(k)=-3.8
932      enddo
933
934          return
935          end
936
937!======================================================================
938        SUBROUTINE interp_sandu_time(day,day1,annee_ref                    &
939     &             ,year_ini_sandu,day_ini_sandu,nt_sandu,dt_sandu         &
940     &             ,nlev_sandu,ts_sandu,ts_prof)
941        implicit none
942
943!---------------------------------------------------------------------------------------
944! Time interpolation of a 2D field to the timestep corresponding to day
945!
946! day: current julian day (e.g. 717538.2)
947! day1: first day of the simulation
948! nt_sandu: total nb of data in the forcing (e.g. 13 for Sanduref)
949! dt_sandu: total time interval (in sec) between 2 forcing data (e.g. 6h for Sanduref)
950!---------------------------------------------------------------------------------------
951! inputs:
952        integer annee_ref
953        integer nt_sandu,nlev_sandu
954        integer year_ini_sandu
955        real day, day1,day_ini_sandu,dt_sandu
956        real ts_sandu(nt_sandu)
957! outputs:
958        real ts_prof
959! local:
960        integer it_sandu1, it_sandu2
961        real timeit,time_sandu1,time_sandu2,frac
962! Check that initial day of the simulation consistent with SANDU period:
963       if (annee_ref.ne.2006 ) then
964        print*,'Pour SANDUREF, annee_ref doit etre 2006 '
965        print*,'Changer annee_ref dans run.def'
966        stop
967       endif
968!      if (annee_ref.eq.2006 .and. day1.lt.day_ini_sandu) then
969!       print*,'SANDUREF debute le 15 Juillet 2006 (jour julien=196)'
970!       print*,'Changer dayref dans run.def'
971!       stop
972!      endif
973
974! Determine timestep relative to the 1st day of TOGA-COARE:
975!       timeit=(day-day1)*86400.
976!       if (annee_ref.eq.1992) then
977!        timeit=(day-day_ini_sandu)*86400.
978!       else
979!        timeit=(day+61.-1.)*86400. ! 61 days between Nov01 and Dec31 1992
980!       endif
981      timeit=(day-day_ini_sandu)*86400
982
983! Determine the closest observation times:
984       it_sandu1=INT(timeit/dt_sandu)+1
985       it_sandu2=it_sandu1 + 1
986       time_sandu1=(it_sandu1-1)*dt_sandu
987       time_sandu2=(it_sandu2-1)*dt_sandu
988       print *,'timeit day day_ini_sandu',timeit,day,day_ini_sandu
989       print *,'it_sandu1,it_sandu2,time_sandu1,time_sandu2',              &
990     &          it_sandu1,it_sandu2,time_sandu1,time_sandu2
991
992       if (it_sandu1 .ge. nt_sandu) then
993        write(*,*) 'PB-stop: day, it_sandu1, it_sandu2, timeit: '          &
994     &        ,day,it_sandu1,it_sandu2,timeit/86400.
995        stop
996       endif
997
998! time interpolation:
999       frac=(time_sandu2-timeit)/(time_sandu2-time_sandu1)
1000       frac=max(frac,0.0)
1001
1002       ts_prof = ts_sandu(it_sandu2)                                       &
1003     &          -frac*(ts_sandu(it_sandu2)-ts_sandu(it_sandu1))
1004
1005         print*,                                                           &
1006     &'day,annee_ref,day_ini_sandu,timeit,it_sandu1,it_sandu2,SST:',       &
1007     &day,annee_ref,day_ini_sandu,timeit/86400.,it_sandu1,                  &
1008     &it_sandu2,ts_prof
1009
1010        return
1011        END
1012!=====================================================================
1013!-------------------------------------------------------------------------
1014      SUBROUTINE read_armcu(fich_armcu,nlev_armcu,nt_armcu,                &
1015     & sens,flat,adv_theta,rad_theta,adv_qt)
1016      implicit none
1017
1018!-------------------------------------------------------------------------
1019! Read ARM_CU case forcing data
1020!-------------------------------------------------------------------------
1021
1022      integer nlev_armcu,nt_armcu
1023      real sens(nt_armcu),flat(nt_armcu)
1024      real adv_theta(nt_armcu),rad_theta(nt_armcu),adv_qt(nt_armcu)
1025      character*80 fich_armcu
1026
1027      integer ip
1028
1029      integer iy,im,id,ih,in
1030
1031      print*,'nlev_armcu',nlev_armcu
1032
1033      open(21,file=trim(fich_armcu),form='formatted')
1034      read(21,'(a)')
1035      do ip = 1, nt_armcu
1036      read(21,'(a)')
1037      read(21,'(a)')
1038      read(21,223) iy, im, id, ih, in, sens(ip),flat(ip),                  &
1039     &             adv_theta(ip),rad_theta(ip),adv_qt(ip)
1040      print *,'forcages=',iy,im,id,ih,in, sens(ip),flat(ip),               &
1041     &             adv_theta(ip),rad_theta(ip),adv_qt(ip)
1042      enddo
1043      close(21)
1044
1045  223 format(5i3,5f8.3)
1046
1047          return
1048          end
1049
1050!=====================================================================
1051       SUBROUTINE interp_toga_vertical(play,nlev_toga,plev_prof            &
1052     &         ,t_prof,q_prof,u_prof,v_prof,w_prof                         &
1053     &         ,ht_prof,vt_prof,hq_prof,vq_prof                            &
1054     &         ,t_mod,q_mod,u_mod,v_mod,w_mod                              &
1055     &         ,ht_mod,vt_mod,hq_mod,vq_mod,mxcalc)
1056 
1057       implicit none
1058 
1059      INCLUDE "dimensions.h"
1060
1061!-------------------------------------------------------------------------
1062! Vertical interpolation of TOGA-COARE forcing data onto model levels
1063!-------------------------------------------------------------------------
1064 
1065       integer nlevmax
1066       parameter (nlevmax=41)
1067       integer nlev_toga,mxcalc
1068!       real play(llm), plev_prof(nlevmax) 
1069!       real t_prof(nlevmax),q_prof(nlevmax)
1070!       real u_prof(nlevmax),v_prof(nlevmax), w_prof(nlevmax)
1071!       real ht_prof(nlevmax),vt_prof(nlevmax)
1072!       real hq_prof(nlevmax),vq_prof(nlevmax)
1073 
1074       real play(llm), plev_prof(nlev_toga) 
1075       real t_prof(nlev_toga),q_prof(nlev_toga)
1076       real u_prof(nlev_toga),v_prof(nlev_toga), w_prof(nlev_toga)
1077       real ht_prof(nlev_toga),vt_prof(nlev_toga)
1078       real hq_prof(nlev_toga),vq_prof(nlev_toga)
1079 
1080       real t_mod(llm),q_mod(llm)
1081       real u_mod(llm),v_mod(llm), w_mod(llm)
1082       real ht_mod(llm),vt_mod(llm)
1083       real hq_mod(llm),vq_mod(llm)
1084 
1085       integer l,k,k1,k2
1086       real frac,frac1,frac2,fact
1087 
1088       do l = 1, llm
1089
1090        if (play(l).ge.plev_prof(nlev_toga)) then
1091 
1092        mxcalc=l
1093         k1=0
1094         k2=0
1095
1096         if (play(l).le.plev_prof(1)) then
1097
1098         do k = 1, nlev_toga-1
1099          if (play(l).le.plev_prof(k).and. play(l).gt.plev_prof(k+1)) then
1100            k1=k
1101            k2=k+1
1102          endif
1103         enddo
1104
1105         if (k1.eq.0 .or. k2.eq.0) then
1106          write(*,*) 'PB! k1, k2 = ',k1,k2
1107          write(*,*) 'l,play(l) = ',l,play(l)/100
1108         do k = 1, nlev_toga-1
1109          write(*,*) 'k,plev_prof(k) = ',k,plev_prof(k)/100
1110         enddo
1111         endif
1112
1113         frac = (plev_prof(k2)-play(l))/(plev_prof(k2)-plev_prof(k1))
1114         t_mod(l)= t_prof(k2) - frac*(t_prof(k2)-t_prof(k1))
1115         q_mod(l)= q_prof(k2) - frac*(q_prof(k2)-q_prof(k1))
1116         u_mod(l)= u_prof(k2) - frac*(u_prof(k2)-u_prof(k1))
1117         v_mod(l)= v_prof(k2) - frac*(v_prof(k2)-v_prof(k1))
1118         w_mod(l)= w_prof(k2) - frac*(w_prof(k2)-w_prof(k1))
1119         ht_mod(l)= ht_prof(k2) - frac*(ht_prof(k2)-ht_prof(k1))
1120         vt_mod(l)= vt_prof(k2) - frac*(vt_prof(k2)-vt_prof(k1))
1121         hq_mod(l)= hq_prof(k2) - frac*(hq_prof(k2)-hq_prof(k1))
1122         vq_mod(l)= vq_prof(k2) - frac*(vq_prof(k2)-vq_prof(k1))
1123     
1124         else !play>plev_prof(1)
1125
1126         k1=1
1127         k2=2
1128         frac1 = (play(l)-plev_prof(k2))/(plev_prof(k1)-plev_prof(k2))
1129         frac2 = (play(l)-plev_prof(k1))/(plev_prof(k1)-plev_prof(k2))
1130         t_mod(l)= frac1*t_prof(k1) - frac2*t_prof(k2)
1131         q_mod(l)= frac1*q_prof(k1) - frac2*q_prof(k2)
1132         u_mod(l)= frac1*u_prof(k1) - frac2*u_prof(k2)
1133         v_mod(l)= frac1*v_prof(k1) - frac2*v_prof(k2)
1134         w_mod(l)= frac1*w_prof(k1) - frac2*w_prof(k2)
1135         ht_mod(l)= frac1*ht_prof(k1) - frac2*ht_prof(k2)
1136         vt_mod(l)= frac1*vt_prof(k1) - frac2*vt_prof(k2)
1137         hq_mod(l)= frac1*hq_prof(k1) - frac2*hq_prof(k2)
1138         vq_mod(l)= frac1*vq_prof(k1) - frac2*vq_prof(k2)
1139
1140         endif ! play.le.plev_prof(1)
1141
1142        else ! above max altitude of forcing file
1143 
1144!jyg
1145         fact=20.*(plev_prof(nlev_toga)-play(l))/plev_prof(nlev_toga) !jyg
1146         fact = max(fact,0.)                                           !jyg
1147         fact = exp(-fact)                                             !jyg
1148         t_mod(l)= t_prof(nlev_toga)                                   !jyg
1149         q_mod(l)= q_prof(nlev_toga)*fact                              !jyg
1150         u_mod(l)= u_prof(nlev_toga)*fact                              !jyg
1151         v_mod(l)= v_prof(nlev_toga)*fact                              !jyg
1152         w_mod(l)= 0.0                                                 !jyg
1153         ht_mod(l)= ht_prof(nlev_toga)                                 !jyg
1154         vt_mod(l)= vt_prof(nlev_toga)                                 !jyg
1155         hq_mod(l)= hq_prof(nlev_toga)*fact                            !jyg
1156         vq_mod(l)= vq_prof(nlev_toga)*fact                            !jyg
1157 
1158        endif ! play
1159 
1160       enddo ! l
1161
1162!       do l = 1,llm
1163!       print *,'t_mod(l),q_mod(l),ht_mod(l),hq_mod(l) ',
1164!     $        l,t_mod(l),q_mod(l),ht_mod(l),hq_mod(l)
1165!       enddo
1166 
1167          return
1168          end
1169 
1170!=====================================================================
1171       SUBROUTINE interp_case_vertical(play,nlev_cas,plev_prof_cas            &
1172     &         ,t_prof_cas,q_prof_cas,u_prof_cas,v_prof_cas,ug_prof_cas,vg_prof_cas,vitw_prof_cas                         &
1173     &         ,du_prof_cas,hu_prof_cas,vu_prof_cas,dv_prof_cas,hv_prof_cas,vv_prof_cas           &
1174     &         ,dt_prof_cas,ht_prof_cas,vt_prof_cas,dtrad_prof_cas,dq_prof_cas,hq_prof_cas,vq_prof_cas                            &
1175     &         ,t_mod_cas,q_mod_cas,u_mod_cas,v_mod_cas,ug_mod_cas,vg_mod_cas,w_mod_cas                              &
1176     &         ,du_mod_cas,hu_mod_cas,vu_mod_cas,dv_mod_cas,hv_mod_cas,vv_mod_cas               &
1177     &         ,dt_mod_cas,ht_mod_cas,vt_mod_cas,dtrad_mod_cas,dq_mod_cas,hq_mod_cas,vq_mod_cas,mxcalc)
1178 
1179       implicit none
1180 
1181       INCLUDE "dimensions.h"
1182
1183!-------------------------------------------------------------------------
1184! Vertical interpolation of TOGA-COARE forcing data onto mod_casel levels
1185!-------------------------------------------------------------------------
1186 
1187       integer nlevmax
1188       parameter (nlevmax=41)
1189       integer nlev_cas,mxcalc
1190!       real play(llm), plev_prof(nlevmax) 
1191!       real t_prof(nlevmax),q_prof(nlevmax)
1192!       real u_prof(nlevmax),v_prof(nlevmax), w_prof(nlevmax)
1193!       real ht_prof(nlevmax),vt_prof(nlevmax)
1194!       real hq_prof(nlevmax),vq_prof(nlevmax)
1195 
1196       real play(llm), plev_prof_cas(nlev_cas) 
1197       real t_prof_cas(nlev_cas),q_prof_cas(nlev_cas)
1198       real u_prof_cas(nlev_cas),v_prof_cas(nlev_cas)
1199       real ug_prof_cas(nlev_cas),vg_prof_cas(nlev_cas), vitw_prof_cas(nlev_cas)
1200       real du_prof_cas(nlev_cas),hu_prof_cas(nlev_cas),vu_prof_cas(nlev_cas)
1201       real dv_prof_cas(nlev_cas),hv_prof_cas(nlev_cas),vv_prof_cas(nlev_cas)
1202       real dt_prof_cas(nlev_cas),ht_prof_cas(nlev_cas),vt_prof_cas(nlev_cas),dtrad_prof_cas(nlev_cas)
1203       real dq_prof_cas(nlev_cas),hq_prof_cas(nlev_cas),vq_prof_cas(nlev_cas)
1204 
1205       real t_mod_cas(llm),q_mod_cas(llm)
1206       real u_mod_cas(llm),v_mod_cas(llm)
1207       real ug_mod_cas(llm),vg_mod_cas(llm), w_mod_cas(llm)
1208       real du_mod_cas(llm),hu_mod_cas(llm),vu_mod_cas(llm)
1209       real dv_mod_cas(llm),hv_mod_cas(llm),vv_mod_cas(llm)
1210       real dt_mod_cas(llm),ht_mod_cas(llm),vt_mod_cas(llm),dtrad_mod_cas(llm)
1211       real dq_mod_cas(llm),hq_mod_cas(llm),vq_mod_cas(llm)
1212 
1213       integer l,k,k1,k2
1214       real frac,frac1,frac2,fact
1215 
1216       do l = 1, llm
1217
1218        if (play(l).ge.plev_prof_cas(nlev_cas)) then
1219 
1220        mxcalc=l
1221         k1=0
1222         k2=0
1223
1224         if (play(l).le.plev_prof_cas(1)) then
1225
1226         do k = 1, nlev_cas-1
1227          if (play(l).le.plev_prof_cas(k).and. play(l).gt.plev_prof_cas(k+1)) then
1228            k1=k
1229            k2=k+1
1230          endif
1231         enddo
1232
1233         if (k1.eq.0 .or. k2.eq.0) then
1234          write(*,*) 'PB! k1, k2 = ',k1,k2
1235          write(*,*) 'l,play(l) = ',l,play(l)/100
1236         do k = 1, nlev_cas-1
1237          write(*,*) 'k,plev_prof_cas(k) = ',k,plev_prof_cas(k)/100
1238         enddo
1239         endif
1240
1241         frac = (plev_prof_cas(k2)-play(l))/(plev_prof_cas(k2)-plev_prof_cas(k1))
1242         t_mod_cas(l)= t_prof_cas(k2) - frac*(t_prof_cas(k2)-t_prof_cas(k1))
1243         q_mod_cas(l)= q_prof_cas(k2) - frac*(q_prof_cas(k2)-q_prof_cas(k1))
1244         u_mod_cas(l)= u_prof_cas(k2) - frac*(u_prof_cas(k2)-u_prof_cas(k1))
1245         v_mod_cas(l)= v_prof_cas(k2) - frac*(v_prof_cas(k2)-v_prof_cas(k1))
1246         ug_mod_cas(l)= ug_prof_cas(k2) - frac*(ug_prof_cas(k2)-ug_prof_cas(k1))
1247         vg_mod_cas(l)= vg_prof_cas(k2) - frac*(vg_prof_cas(k2)-vg_prof_cas(k1))
1248         w_mod_cas(l)= vitw_prof_cas(k2) - frac*(vitw_prof_cas(k2)-vitw_prof_cas(k1))
1249         du_mod_cas(l)= du_prof_cas(k2) - frac*(du_prof_cas(k2)-du_prof_cas(k1))
1250         hu_mod_cas(l)= hu_prof_cas(k2) - frac*(hu_prof_cas(k2)-hu_prof_cas(k1))
1251         vu_mod_cas(l)= vu_prof_cas(k2) - frac*(vu_prof_cas(k2)-vu_prof_cas(k1))
1252         dv_mod_cas(l)= dv_prof_cas(k2) - frac*(dv_prof_cas(k2)-dv_prof_cas(k1))
1253         hv_mod_cas(l)= hv_prof_cas(k2) - frac*(hv_prof_cas(k2)-hv_prof_cas(k1))
1254         vv_mod_cas(l)= vv_prof_cas(k2) - frac*(vv_prof_cas(k2)-vv_prof_cas(k1))
1255         dt_mod_cas(l)= dt_prof_cas(k2) - frac*(dt_prof_cas(k2)-dt_prof_cas(k1))
1256         ht_mod_cas(l)= ht_prof_cas(k2) - frac*(ht_prof_cas(k2)-ht_prof_cas(k1))
1257         vt_mod_cas(l)= vt_prof_cas(k2) - frac*(vt_prof_cas(k2)-vt_prof_cas(k1))
1258         dq_mod_cas(l)= dq_prof_cas(k2) - frac*(dq_prof_cas(k2)-dq_prof_cas(k1))
1259         hq_mod_cas(l)= hq_prof_cas(k2) - frac*(hq_prof_cas(k2)-hq_prof_cas(k1))
1260         vq_mod_cas(l)= vq_prof_cas(k2) - frac*(vq_prof_cas(k2)-vq_prof_cas(k1))
1261         dtrad_mod_cas(l)= dtrad_prof_cas(k2) - frac*(dtrad_prof_cas(k2)-dtrad_prof_cas(k1))
1262     
1263         else !play>plev_prof_cas(1)
1264
1265         k1=1
1266         k2=2
1267         frac1 = (play(l)-plev_prof_cas(k2))/(plev_prof_cas(k1)-plev_prof_cas(k2))
1268         frac2 = (play(l)-plev_prof_cas(k1))/(plev_prof_cas(k1)-plev_prof_cas(k2))
1269         t_mod_cas(l)= frac1*t_prof_cas(k1) - frac2*t_prof_cas(k2)
1270         q_mod_cas(l)= frac1*q_prof_cas(k1) - frac2*q_prof_cas(k2)
1271         u_mod_cas(l)= frac1*u_prof_cas(k1) - frac2*u_prof_cas(k2)
1272         v_mod_cas(l)= frac1*v_prof_cas(k1) - frac2*v_prof_cas(k2)
1273         ug_mod_cas(l)= frac1*ug_prof_cas(k1) - frac2*ug_prof_cas(k2)
1274         vg_mod_cas(l)= frac1*vg_prof_cas(k1) - frac2*vg_prof_cas(k2)
1275         w_mod_cas(l)= frac1*vitw_prof_cas(k1) - frac2*vitw_prof_cas(k2)
1276         du_mod_cas(l)= frac1*du_prof_cas(k1) - frac2*du_prof_cas(k2)
1277         hu_mod_cas(l)= frac1*hu_prof_cas(k1) - frac2*hu_prof_cas(k2)
1278         vu_mod_cas(l)= frac1*vu_prof_cas(k1) - frac2*vu_prof_cas(k2)
1279         dv_mod_cas(l)= frac1*dv_prof_cas(k1) - frac2*dv_prof_cas(k2)
1280         hv_mod_cas(l)= frac1*hv_prof_cas(k1) - frac2*hv_prof_cas(k2)
1281         vv_mod_cas(l)= frac1*vv_prof_cas(k1) - frac2*vv_prof_cas(k2)
1282         dt_mod_cas(l)= frac1*dt_prof_cas(k1) - frac2*dt_prof_cas(k2)
1283         ht_mod_cas(l)= frac1*ht_prof_cas(k1) - frac2*ht_prof_cas(k2)
1284         vt_mod_cas(l)= frac1*vt_prof_cas(k1) - frac2*vt_prof_cas(k2)
1285         dq_mod_cas(l)= frac1*dq_prof_cas(k1) - frac2*dq_prof_cas(k2)
1286         hq_mod_cas(l)= frac1*hq_prof_cas(k1) - frac2*hq_prof_cas(k2)
1287         vq_mod_cas(l)= frac1*vq_prof_cas(k1) - frac2*vq_prof_cas(k2)
1288         dtrad_mod_cas(l)= frac1*dtrad_prof_cas(k1) - frac2*dtrad_prof_cas(k2)
1289
1290         endif ! play.le.plev_prof_cas(1)
1291
1292        else ! above max altitude of forcing file
1293 
1294!jyg
1295         fact=20.*(plev_prof_cas(nlev_cas)-play(l))/plev_prof_cas(nlev_cas) !jyg
1296         fact = max(fact,0.)                                           !jyg
1297         fact = exp(-fact)                                             !jyg
1298         t_mod_cas(l)= t_prof_cas(nlev_cas)                                   !jyg
1299         q_mod_cas(l)= q_prof_cas(nlev_cas)*fact                              !jyg
1300         u_mod_cas(l)= u_prof_cas(nlev_cas)*fact                              !jyg
1301         v_mod_cas(l)= v_prof_cas(nlev_cas)*fact                              !jyg
1302         ug_mod_cas(l)= ug_prof_cas(nlev_cas)*fact                              !jyg
1303         vg_mod_cas(l)= vg_prof_cas(nlev_cas)*fact                              !jyg
1304         w_mod_cas(l)= 0.0                                                 !jyg
1305         du_mod_cas(l)= du_prof_cas(nlev_cas)*fact
1306         hu_mod_cas(l)= hu_prof_cas(nlev_cas)*fact                            !jyg
1307         vu_mod_cas(l)= vu_prof_cas(nlev_cas)*fact                            !jyg
1308         dv_mod_cas(l)= dv_prof_cas(nlev_cas)*fact
1309         hv_mod_cas(l)= hv_prof_cas(nlev_cas)*fact                            !jyg
1310         vv_mod_cas(l)= vv_prof_cas(nlev_cas)*fact                            !jyg
1311         dt_mod_cas(l)= dt_prof_cas(nlev_cas) 
1312         ht_mod_cas(l)= ht_prof_cas(nlev_cas)                                 !jyg
1313         vt_mod_cas(l)= vt_prof_cas(nlev_cas)                                 !jyg
1314         dq_mod_cas(l)= dq_prof_cas(nlev_cas)*fact
1315         hq_mod_cas(l)= hq_prof_cas(nlev_cas)*fact                            !jyg
1316         vq_mod_cas(l)= vq_prof_cas(nlev_cas)*fact                            !jyg
1317         dtrad_mod_cas(l)= dtrad_prof_cas(nlev_cas)*fact                      !jyg
1318 
1319        endif ! play
1320 
1321       enddo ! l
1322
1323!       do l = 1,llm
1324!       print *,'t_mod_cas(l),q_mod_cas(l),ht_mod_cas(l),hq_mod_cas(l) ',
1325!     $        l,t_mod_cas(l),q_mod_cas(l),ht_mod_cas(l),hq_mod_cas(l)
1326!       enddo
1327 
1328          return
1329          end
1330!***************************************************************************** 
1331!=====================================================================
1332       SUBROUTINE interp_dice_vertical(play,nlev_dice,nt_dice,plev_prof   &
1333     &         ,th_prof,qv_prof,u_prof,v_prof,o3_prof                     &
1334     &         ,ht_prof,hq_prof,hu_prof,hv_prof,w_prof,omega_prof         &
1335     &         ,th_mod,qv_mod,u_mod,v_mod,o3_mod                          &
1336     &         ,ht_mod,hq_mod,hu_mod,hv_mod,w_mod,omega_mod,mxcalc)
1337 
1338       implicit none
1339 
1340       INCLUDE "dimensions.h"
1341
1342!-------------------------------------------------------------------------
1343! Vertical interpolation of Dice forcing data onto model levels
1344!-------------------------------------------------------------------------
1345 
1346       integer nlevmax
1347       parameter (nlevmax=41)
1348       integer nlev_dice,mxcalc,nt_dice
1349 
1350       real play(llm), plev_prof(nlev_dice) 
1351       real th_prof(nlev_dice),qv_prof(nlev_dice)
1352       real u_prof(nlev_dice),v_prof(nlev_dice) 
1353       real o3_prof(nlev_dice)
1354       real ht_prof(nlev_dice),hq_prof(nlev_dice)
1355       real hu_prof(nlev_dice),hv_prof(nlev_dice)
1356       real w_prof(nlev_dice),omega_prof(nlev_dice)
1357 
1358       real th_mod(llm),qv_mod(llm)
1359       real u_mod(llm),v_mod(llm), o3_mod(llm)
1360       real ht_mod(llm),hq_mod(llm)
1361       real hu_mod(llm),hv_mod(llm),w_mod(llm),omega_mod(llm)
1362 
1363       integer l,k,k1,k2,kp
1364       real aa,frac,frac1,frac2,fact
1365 
1366       do l = 1, llm
1367
1368        if (play(l).ge.plev_prof(nlev_dice)) then
1369 
1370        mxcalc=l
1371         k1=0
1372         k2=0
1373
1374         if (play(l).le.plev_prof(1)) then
1375
1376         do k = 1, nlev_dice-1
1377          if (play(l).le.plev_prof(k) .and. play(l).gt.plev_prof(k+1)) then
1378            k1=k
1379            k2=k+1
1380          endif
1381         enddo
1382
1383         if (k1.eq.0 .or. k2.eq.0) then
1384          write(*,*) 'PB! k1, k2 = ',k1,k2
1385          write(*,*) 'l,play(l) = ',l,play(l)/100
1386         do k = 1, nlev_dice-1
1387          write(*,*) 'k,plev_prof(k) = ',k,plev_prof(k)/100
1388         enddo
1389         endif
1390
1391         frac = (plev_prof(k2)-play(l))/(plev_prof(k2)-plev_prof(k1))
1392         th_mod(l)= th_prof(k2) - frac*(th_prof(k2)-th_prof(k1))
1393         qv_mod(l)= qv_prof(k2) - frac*(qv_prof(k2)-qv_prof(k1))
1394         u_mod(l)= u_prof(k2) - frac*(u_prof(k2)-u_prof(k1))
1395         v_mod(l)= v_prof(k2) - frac*(v_prof(k2)-v_prof(k1))
1396         o3_mod(l)= o3_prof(k2) - frac*(o3_prof(k2)-o3_prof(k1))
1397         ht_mod(l)= ht_prof(k2) - frac*(ht_prof(k2)-ht_prof(k1))
1398         hq_mod(l)= hq_prof(k2) - frac*(hq_prof(k2)-hq_prof(k1))
1399         hu_mod(l)= hu_prof(k2) - frac*(hu_prof(k2)-hu_prof(k1))
1400         hv_mod(l)= hv_prof(k2) - frac*(hv_prof(k2)-hv_prof(k1))
1401         w_mod(l)= w_prof(k2) - frac*(w_prof(k2)-w_prof(k1))
1402         omega_mod(l)= omega_prof(k2) - frac*(omega_prof(k2)-omega_prof(k1))
1403     
1404         else !play>plev_prof(1)
1405
1406         k1=1
1407         k2=2
1408         frac1 = (play(l)-plev_prof(k2))/(plev_prof(k1)-plev_prof(k2))
1409         frac2 = (play(l)-plev_prof(k1))/(plev_prof(k1)-plev_prof(k2))
1410         th_mod(l)= frac1*th_prof(k1) - frac2*th_prof(k2)
1411         qv_mod(l)= frac1*qv_prof(k1) - frac2*qv_prof(k2)
1412         u_mod(l)= frac1*u_prof(k1) - frac2*u_prof(k2)
1413         v_mod(l)= frac1*v_prof(k1) - frac2*v_prof(k2)
1414         o3_mod(l)= frac1*o3_prof(k1) - frac2*o3_prof(k2)
1415         ht_mod(l)= frac1*ht_prof(k1) - frac2*ht_prof(k2)
1416         hq_mod(l)= frac1*hq_prof(k1) - frac2*hq_prof(k2)
1417         hu_mod(l)= frac1*hu_prof(k1) - frac2*hu_prof(k2)
1418         hv_mod(l)= frac1*hv_prof(k1) - frac2*hv_prof(k2)
1419         w_mod(l)= frac1*w_prof(k1) - frac2*w_prof(k2)
1420         omega_mod(l)= frac1*omega_prof(k1) - frac2*omega_prof(k2)
1421
1422         endif ! play.le.plev_prof(1)
1423
1424        else ! above max altitude of forcing file
1425 
1426!jyg
1427         fact=20.*(plev_prof(nlev_dice)-play(l))/plev_prof(nlev_dice) !jyg
1428         fact = max(fact,0.)                                           !jyg
1429         fact = exp(-fact)                                             !jyg
1430         th_mod(l)= th_prof(nlev_dice)                                 !jyg
1431         qv_mod(l)= qv_prof(nlev_dice)*fact                            !jyg
1432         u_mod(l)= u_prof(nlev_dice)*fact                              !jyg
1433         v_mod(l)= v_prof(nlev_dice)*fact                              !jyg
1434         o3_mod(l)= o3_prof(nlev_dice)*fact                            !jyg
1435         ht_mod(l)= ht_prof(nlev_dice)                                 !jyg
1436         hq_mod(l)= hq_prof(nlev_dice)*fact                            !jyg
1437         hu_mod(l)= hu_prof(nlev_dice)                                 !jyg
1438         hv_mod(l)= hv_prof(nlev_dice)                                 !jyg
1439         w_mod(l)= 0.                                                  !jyg
1440         omega_mod(l)= 0.                                              !jyg
1441 
1442        endif ! play
1443 
1444       enddo ! l
1445
1446!       do l = 1,llm
1447!       print *,'t_mod(l),q_mod(l),ht_mod(l),hq_mod(l) ',
1448!     $        l,t_mod(l),q_mod(l),ht_mod(l),hq_mod(l)
1449!       enddo
1450 
1451          return
1452          end
1453
1454!======================================================================
1455        SUBROUTINE interp_astex_time(day,day1,annee_ref                    &
1456     &             ,year_ini_astex,day_ini_astex,nt_astex,dt_astex         &
1457     &             ,nlev_astex,div_astex,ts_astex,ug_astex,vg_astex        &
1458     &             ,ufa_astex,vfa_astex,div_prof,ts_prof,ug_prof,vg_prof   &
1459     &             ,ufa_prof,vfa_prof)
1460        implicit none
1461
1462!---------------------------------------------------------------------------------------
1463! Time interpolation of a 2D field to the timestep corresponding to day
1464!
1465! day: current julian day (e.g. 717538.2)
1466! day1: first day of the simulation
1467! nt_astex: total nb of data in the forcing (e.g. 41 for Astex)
1468! dt_astex: total time interval (in sec) between 2 forcing data (e.g. 1h for Astex)
1469!---------------------------------------------------------------------------------------
1470
1471! inputs:
1472        integer annee_ref
1473        integer nt_astex,nlev_astex
1474        integer year_ini_astex
1475        real day, day1,day_ini_astex,dt_astex
1476        real div_astex(nt_astex),ts_astex(nt_astex),ug_astex(nt_astex)
1477        real vg_astex(nt_astex),ufa_astex(nt_astex),vfa_astex(nt_astex)
1478! outputs:
1479        real div_prof,ts_prof,ug_prof,vg_prof,ufa_prof,vfa_prof
1480! local:
1481        integer it_astex1, it_astex2
1482        real timeit,time_astex1,time_astex2,frac
1483
1484! Check that initial day of the simulation consistent with ASTEX period:
1485       if (annee_ref.ne.1992 ) then
1486        print*,'Pour Astex, annee_ref doit etre 1992 '
1487        print*,'Changer annee_ref dans run.def'
1488        stop
1489       endif
1490       if (annee_ref.eq.1992 .and. day1.lt.day_ini_astex) then
1491        print*,'Astex debute le 13 Juin 1992 (jour julien=165)'
1492        print*,'Changer dayref dans run.def'
1493        stop
1494       endif
1495
1496! Determine timestep relative to the 1st day of TOGA-COARE:
1497!       timeit=(day-day1)*86400.
1498!       if (annee_ref.eq.1992) then
1499!        timeit=(day-day_ini_astex)*86400.
1500!       else
1501!        timeit=(day+2.-1.)*86400. ! 2 days between Jun13 and Jun15 1992
1502!       endif
1503      timeit=(day-day_ini_astex)*86400
1504
1505! Determine the closest observation times:
1506       it_astex1=INT(timeit/dt_astex)+1
1507       it_astex2=it_astex1 + 1
1508       time_astex1=(it_astex1-1)*dt_astex
1509       time_astex2=(it_astex2-1)*dt_astex
1510       print *,'timeit day day_ini_astex',timeit,day,day_ini_astex
1511       print *,'it_astex1,it_astex2,time_astex1,time_astex2',              &
1512     &          it_astex1,it_astex2,time_astex1,time_astex2
1513
1514       if (it_astex1 .ge. nt_astex) then
1515        write(*,*) 'PB-stop: day, it_astex1, it_astex2, timeit: '          &
1516     &        ,day,it_astex1,it_astex2,timeit/86400.
1517        stop
1518       endif
1519
1520! time interpolation:
1521       frac=(time_astex2-timeit)/(time_astex2-time_astex1)
1522       frac=max(frac,0.0)
1523
1524       div_prof = div_astex(it_astex2)                                     &
1525     &          -frac*(div_astex(it_astex2)-div_astex(it_astex1))
1526       ts_prof = ts_astex(it_astex2)                                        &
1527     &          -frac*(ts_astex(it_astex2)-ts_astex(it_astex1))
1528       ug_prof = ug_astex(it_astex2)                                       &
1529     &          -frac*(ug_astex(it_astex2)-ug_astex(it_astex1))
1530       vg_prof = vg_astex(it_astex2)                                       &
1531     &          -frac*(vg_astex(it_astex2)-vg_astex(it_astex1))
1532       ufa_prof = ufa_astex(it_astex2)                                     &
1533     &          -frac*(ufa_astex(it_astex2)-ufa_astex(it_astex1))
1534       vfa_prof = vfa_astex(it_astex2)                                     &
1535     &          -frac*(vfa_astex(it_astex2)-vfa_astex(it_astex1))
1536
1537         print*,                                                           &
1538     &'day,annee_ref,day_ini_astex,timeit,it_astex1,it_astex2,SST:',       &
1539     &day,annee_ref,day_ini_astex,timeit/86400.,it_astex1,                 &
1540     &it_astex2,div_prof,ts_prof,ug_prof,vg_prof,ufa_prof,vfa_prof
1541
1542        return
1543        END
1544
1545!======================================================================
1546        SUBROUTINE interp_toga_time(day,day1,annee_ref                     &
1547     &             ,year_ini_toga,day_ini_toga,nt_toga,dt_toga,nlev_toga   &
1548     &             ,ts_toga,plev_toga,t_toga,q_toga,u_toga,v_toga,w_toga   &
1549     &             ,ht_toga,vt_toga,hq_toga,vq_toga                        &
1550     &             ,ts_prof,plev_prof,t_prof,q_prof,u_prof,v_prof,w_prof   &
1551     &             ,ht_prof,vt_prof,hq_prof,vq_prof)
1552        implicit none
1553
1554!---------------------------------------------------------------------------------------
1555! Time interpolation of a 2D field to the timestep corresponding to day
1556!
1557! day: current julian day (e.g. 717538.2)
1558! day1: first day of the simulation
1559! nt_toga: total nb of data in the forcing (e.g. 480 for TOGA-COARE)
1560! dt_toga: total time interval (in sec) between 2 forcing data (e.g. 6h for TOGA-COARE)
1561!---------------------------------------------------------------------------------------
1562
1563        INCLUDE "compar1d.h"
1564
1565! inputs:
1566        integer annee_ref
1567        integer nt_toga,nlev_toga
1568        integer year_ini_toga
1569        real day, day1,day_ini_toga,dt_toga
1570        real ts_toga(nt_toga)
1571        real plev_toga(nlev_toga,nt_toga),t_toga(nlev_toga,nt_toga)
1572        real q_toga(nlev_toga,nt_toga),u_toga(nlev_toga,nt_toga)
1573        real v_toga(nlev_toga,nt_toga),w_toga(nlev_toga,nt_toga)
1574        real ht_toga(nlev_toga,nt_toga),vt_toga(nlev_toga,nt_toga)
1575        real hq_toga(nlev_toga,nt_toga),vq_toga(nlev_toga,nt_toga)
1576! outputs:
1577        real ts_prof
1578        real plev_prof(nlev_toga),t_prof(nlev_toga)
1579        real q_prof(nlev_toga),u_prof(nlev_toga)
1580        real v_prof(nlev_toga),w_prof(nlev_toga)
1581        real ht_prof(nlev_toga),vt_prof(nlev_toga)
1582        real hq_prof(nlev_toga),vq_prof(nlev_toga)
1583! local:
1584        integer it_toga1, it_toga2,k
1585        real timeit,time_toga1,time_toga2,frac
1586
1587
1588        if (forcing_type.eq.2) then
1589! Check that initial day of the simulation consistent with TOGA-COARE period:
1590       if (annee_ref.ne.1992 .and. annee_ref.ne.1993) then
1591        print*,'Pour TOGA-COARE, annee_ref doit etre 1992 ou 1993'
1592        print*,'Changer annee_ref dans run.def'
1593        stop
1594       endif
1595       if (annee_ref.eq.1992 .and. day1.lt.day_ini_toga) then
1596        print*,'TOGA-COARE a debute le 1er Nov 1992 (jour julien=306)'
1597        print*,'Changer dayref dans run.def'
1598        stop
1599       endif
1600       if (annee_ref.eq.1993 .and. day1.gt.day_ini_toga+119) then
1601        print*,'TOGA-COARE a fini le 28 Feb 1993 (jour julien=59)'
1602        print*,'Changer dayref ou nday dans run.def'
1603        stop
1604       endif
1605
1606       else if (forcing_type.eq.4) then
1607
1608! Check that initial day of the simulation consistent with TWP-ICE period:
1609       if (annee_ref.ne.2006) then
1610        print*,'Pour TWP-ICE, annee_ref doit etre 2006'
1611        print*,'Changer annee_ref dans run.def'
1612        stop
1613       endif
1614       if (annee_ref.eq.2006 .and. day1.lt.day_ini_toga) then
1615        print*,'TWP-ICE a debute le 17 Jan 2006 (jour julien=17)'
1616        print*,'Changer dayref dans run.def'
1617        stop
1618       endif
1619       if (annee_ref.eq.2006 .and. day1.gt.day_ini_toga+26) then
1620        print*,'TWP-ICE a fini le 12 Feb 2006 (jour julien=43)'
1621        print*,'Changer dayref ou nday dans run.def'
1622        stop
1623       endif
1624
1625       endif
1626
1627! Determine timestep relative to the 1st day of TOGA-COARE:
1628!       timeit=(day-day1)*86400.
1629!       if (annee_ref.eq.1992) then
1630!        timeit=(day-day_ini_toga)*86400.
1631!       else
1632!        timeit=(day+61.-1.)*86400. ! 61 days between Nov01 and Dec31 1992
1633!       endif
1634      timeit=(day-day_ini_toga)*86400
1635
1636! Determine the closest observation times:
1637       it_toga1=INT(timeit/dt_toga)+1
1638       it_toga2=it_toga1 + 1
1639       time_toga1=(it_toga1-1)*dt_toga
1640       time_toga2=(it_toga2-1)*dt_toga
1641
1642       if (it_toga1 .ge. nt_toga) then
1643        write(*,*) 'PB-stop: day, it_toga1, it_toga2, timeit: '            &
1644     &        ,day,it_toga1,it_toga2,timeit/86400.
1645        stop
1646       endif
1647
1648! time interpolation:
1649       frac=(time_toga2-timeit)/(time_toga2-time_toga1)
1650       frac=max(frac,0.0)
1651
1652       ts_prof = ts_toga(it_toga2)                                         &
1653     &          -frac*(ts_toga(it_toga2)-ts_toga(it_toga1))
1654
1655!        print*,
1656!     :'day,annee_ref,day_ini_toga,timeit,it_toga1,it_toga2,SST:',
1657!     :day,annee_ref,day_ini_toga,timeit/86400.,it_toga1,it_toga2,ts_prof
1658
1659       do k=1,nlev_toga
1660        plev_prof(k) = 100.*(plev_toga(k,it_toga2)                         &
1661     &          -frac*(plev_toga(k,it_toga2)-plev_toga(k,it_toga1)))
1662        t_prof(k) = t_toga(k,it_toga2)                                     &
1663     &          -frac*(t_toga(k,it_toga2)-t_toga(k,it_toga1))
1664        q_prof(k) = q_toga(k,it_toga2)                                     &
1665     &          -frac*(q_toga(k,it_toga2)-q_toga(k,it_toga1))
1666        u_prof(k) = u_toga(k,it_toga2)                                     &
1667     &          -frac*(u_toga(k,it_toga2)-u_toga(k,it_toga1))
1668        v_prof(k) = v_toga(k,it_toga2)                                     &
1669     &          -frac*(v_toga(k,it_toga2)-v_toga(k,it_toga1))
1670        w_prof(k) = w_toga(k,it_toga2)                                     &
1671     &          -frac*(w_toga(k,it_toga2)-w_toga(k,it_toga1))
1672        ht_prof(k) = ht_toga(k,it_toga2)                                   &
1673     &          -frac*(ht_toga(k,it_toga2)-ht_toga(k,it_toga1))
1674        vt_prof(k) = vt_toga(k,it_toga2)                                   &
1675     &          -frac*(vt_toga(k,it_toga2)-vt_toga(k,it_toga1))
1676        hq_prof(k) = hq_toga(k,it_toga2)                                   &
1677     &          -frac*(hq_toga(k,it_toga2)-hq_toga(k,it_toga1))
1678        vq_prof(k) = vq_toga(k,it_toga2)                                   &
1679     &          -frac*(vq_toga(k,it_toga2)-vq_toga(k,it_toga1))
1680        enddo
1681
1682        return
1683        END
1684
1685!======================================================================
1686        SUBROUTINE interp_dice_time(day,day1,annee_ref                    &
1687     &             ,year_ini_dice,day_ini_dice,nt_dice,dt_dice            &
1688     &             ,nlev_dice,shf_dice,lhf_dice,lwup_dice,swup_dice       &
1689     &             ,tg_dice,ustar_dice,psurf_dice,ug_dice,vg_dice         &
1690     &             ,ht_dice,hq_dice,hu_dice,hv_dice,w_dice,omega_dice     &
1691     &             ,shf_prof,lhf_prof,lwup_prof,swup_prof,tg_prof         &
1692     &             ,ustar_prof,psurf_prof,ug_prof,vg_prof                 &
1693     &             ,ht_prof,hq_prof,hu_prof,hv_prof,w_prof,omega_prof)
1694        implicit none
1695
1696!---------------------------------------------------------------------------------------
1697! Time interpolation of a 2D field to the timestep corresponding to day
1698!
1699! day: current julian day (e.g. 717538.2)
1700! day1: first day of the simulation
1701! nt_dice: total nb of data in the forcing (e.g. 145 for Dice)
1702! dt_dice: total time interval (in sec) between 2 forcing data (e.g. 30min. for Dice)
1703!---------------------------------------------------------------------------------------
1704
1705        INCLUDE "compar1d.h"
1706
1707! inputs:
1708        integer annee_ref
1709        integer nt_dice,nlev_dice
1710        integer year_ini_dice
1711        real day, day1,day_ini_dice,dt_dice
1712        real shf_dice(nt_dice),lhf_dice(nt_dice),lwup_dice(nt_dice)
1713        real swup_dice(nt_dice),tg_dice(nt_dice),ustar_dice(nt_dice)
1714        real psurf_dice(nt_dice),ug_dice(nt_dice),vg_dice(nt_dice)
1715        real ht_dice(nlev_dice,nt_dice),hq_dice(nlev_dice,nt_dice)
1716        real hu_dice(nlev_dice,nt_dice),hv_dice(nlev_dice,nt_dice)
1717        real w_dice(nlev_dice,nt_dice),omega_dice(nlev_dice,nt_dice)
1718! outputs:
1719        real tg_prof,shf_prof,lhf_prof,lwup_prof,swup_prof
1720        real ustar_prof,psurf_prof,ug_prof,vg_prof
1721        real ht_prof(nlev_dice),hq_prof(nlev_dice)
1722        real hu_prof(nlev_dice),hv_prof(nlev_dice)
1723        real w_prof(nlev_dice),omega_prof(nlev_dice)
1724! local:
1725        integer it_dice1, it_dice2,k
1726        real timeit,time_dice1,time_dice2,frac
1727
1728
1729        if (forcing_type.eq.7) then
1730! Check that initial day of the simulation consistent with Dice period:
1731       print *,'annee_ref=',annee_ref
1732       print *,'day1=',day1
1733       print *,'day_ini_dice=',day_ini_dice
1734       if (annee_ref.ne.1999) then
1735        print*,'Pour Dice, annee_ref doit etre 1999'
1736        print*,'Changer annee_ref dans run.def'
1737        stop
1738       endif
1739       if (annee_ref.eq.1999 .and. day1.gt.day_ini_dice) then
1740        print*,'Dice a debute le 23 Oct 1999 (jour julien=296)'
1741        print*,'Changer dayref dans run.def',day1,day_ini_dice
1742        stop
1743       endif
1744       if (annee_ref.eq.1999 .and. day1.gt.day_ini_dice+2) then
1745        print*,'Dice a fini le 25 Oct 1999 (jour julien=298)'
1746        print*,'Changer dayref ou nday dans run.def',day1,day_ini_dice
1747        stop
1748       endif
1749
1750       endif
1751
1752! Determine timestep relative to the 1st day of TOGA-COARE:
1753!       timeit=(day-day1)*86400.
1754!       if (annee_ref.eq.1992) then
1755!        timeit=(day-day_ini_dice)*86400.
1756!       else
1757!        timeit=(day+61.-1.)*86400. ! 61 days between Nov01 and Dec31 1992
1758!       endif
1759      timeit=(day-day_ini_dice)*86400
1760
1761! Determine the closest observation times:
1762       it_dice1=INT(timeit/dt_dice)+1
1763       it_dice2=it_dice1 + 1
1764       time_dice1=(it_dice1-1)*dt_dice
1765       time_dice2=(it_dice2-1)*dt_dice
1766
1767       if (it_dice1 .ge. nt_dice) then
1768        write(*,*) 'PB-stop: day, it_dice1, it_dice2, timeit: ',day,it_dice1,it_dice2,timeit/86400.
1769        stop
1770       endif
1771
1772! time interpolation:
1773       frac=(time_dice2-timeit)/(time_dice2-time_dice1)
1774       frac=max(frac,0.0)
1775
1776       shf_prof = shf_dice(it_dice2)-frac*(shf_dice(it_dice2)-shf_dice(it_dice1))
1777       lhf_prof = lhf_dice(it_dice2)-frac*(lhf_dice(it_dice2)-lhf_dice(it_dice1))
1778       lwup_prof = lwup_dice(it_dice2)-frac*(lwup_dice(it_dice2)-lwup_dice(it_dice1))
1779       swup_prof = swup_dice(it_dice2)-frac*(swup_dice(it_dice2)-swup_dice(it_dice1))
1780       tg_prof = tg_dice(it_dice2)-frac*(tg_dice(it_dice2)-tg_dice(it_dice1))
1781       ustar_prof = ustar_dice(it_dice2)-frac*(ustar_dice(it_dice2)-ustar_dice(it_dice1))
1782       psurf_prof = psurf_dice(it_dice2)-frac*(psurf_dice(it_dice2)-psurf_dice(it_dice1))
1783       ug_prof = ug_dice(it_dice2)-frac*(ug_dice(it_dice2)-ug_dice(it_dice1))
1784       vg_prof = vg_dice(it_dice2)-frac*(vg_dice(it_dice2)-vg_dice(it_dice1))
1785
1786!        print*,
1787!     :'day,annee_ref,day_ini_dice,timeit,it_dice1,it_dice2,SST:',
1788!     :day,annee_ref,day_ini_dice,timeit/86400.,it_dice1,it_dice2,ts_prof
1789
1790       do k=1,nlev_dice
1791        ht_prof(k) = ht_dice(k,it_dice2)-frac*(ht_dice(k,it_dice2)-ht_dice(k,it_dice1))
1792        hq_prof(k) = hq_dice(k,it_dice2)-frac*(hq_dice(k,it_dice2)-hq_dice(k,it_dice1))
1793        hu_prof(k) = hu_dice(k,it_dice2)-frac*(hu_dice(k,it_dice2)-hu_dice(k,it_dice1))
1794        hv_prof(k) = hv_dice(k,it_dice2)-frac*(hv_dice(k,it_dice2)-hv_dice(k,it_dice1))
1795        w_prof(k) = w_dice(k,it_dice2)-frac*(w_dice(k,it_dice2)-w_dice(k,it_dice1))
1796        omega_prof(k) = omega_dice(k,it_dice2)-frac*(omega_dice(k,it_dice2)-omega_dice(k,it_dice1))
1797        enddo
1798
1799        return
1800        END
1801
1802!======================================================================
1803        SUBROUTINE interp_gabls4_time(day,day1,annee_ref                              &
1804     &             ,year_ini_gabls4,day_ini_gabls4,nt_gabls4,dt_gabls4,nlev_gabls4    &
1805     &             ,ug_gabls4,vg_gabls4,ht_gabls4,hq_gabls4,tg_gabls4                          &
1806     &             ,ug_prof,vg_prof,ht_prof,hq_prof,tg_prof)
1807        implicit none
1808
1809!---------------------------------------------------------------------------------------
1810! Time interpolation of a 2D field to the timestep corresponding to day
1811!
1812! day: current julian day
1813! day1: first day of the simulation
1814! nt_gabls4: total nb of data in the forcing (e.g. 37 for gabls4)
1815! dt_gabls4: total time interval (in sec) between 2 forcing data (e.g. 60min. for gabls4)
1816!---------------------------------------------------------------------------------------
1817
1818        INCLUDE "compar1d.h"
1819
1820! inputs:
1821        integer annee_ref
1822        integer nt_gabls4,nlev_gabls4
1823        integer year_ini_gabls4
1824        real day, day1,day_ini_gabls4,dt_gabls4
1825        real ug_gabls4(nlev_gabls4,nt_gabls4),vg_gabls4(nlev_gabls4,nt_gabls4)
1826        real ht_gabls4(nlev_gabls4,nt_gabls4),hq_gabls4(nlev_gabls4,nt_gabls4)
1827        real tg_gabls4(nt_gabls4), tg_prof
1828! outputs:
1829        real ug_prof(nlev_gabls4),vg_prof(nlev_gabls4)
1830        real ht_prof(nlev_gabls4),hq_prof(nlev_gabls4)
1831! local:
1832        integer it_gabls41, it_gabls42,k
1833        real timeit,time_gabls41,time_gabls42,frac
1834
1835
1836
1837! Check that initial day of the simulation consistent with gabls4 period:
1838       if (forcing_type.eq.8 ) then
1839       print *,'annee_ref=',annee_ref
1840       print *,'day1=',day1
1841       print *,'day_ini_gabls4=',day_ini_gabls4
1842       if (annee_ref.ne.2009) then
1843        print*,'Pour gabls4, annee_ref doit etre 2009'
1844        print*,'Changer annee_ref dans run.def'
1845        stop
1846       endif
1847       if (annee_ref.eq.2009 .and. day1.gt.day_ini_gabls4) then
1848        print*,'gabls4 a debute le 11 dec 2009 (jour julien=345)'
1849        print*,'Changer dayref dans run.def',day1,day_ini_gabls4
1850        stop
1851       endif
1852       if (annee_ref.eq.2009 .and. day1.gt.day_ini_gabls4+2) then
1853        print*,'gabls4 a fini le 12 dec 2009 (jour julien=346)'
1854        print*,'Changer dayref ou nday dans run.def',day1,day_ini_gabls4
1855        stop
1856       endif
1857       endif
1858
1859      timeit=(day-day_ini_gabls4)*86400
1860       print *,'day,day_ini_gabls4=',day,day_ini_gabls4
1861       print *,'nt_gabls4,dt,timeit=',nt_gabls4,dt_gabls4,timeit
1862
1863! Determine the closest observation times:
1864       it_gabls41=INT(timeit/dt_gabls4)+1
1865       it_gabls42=it_gabls41 + 1
1866       time_gabls41=(it_gabls41-1)*dt_gabls4
1867       time_gabls42=(it_gabls42-1)*dt_gabls4
1868
1869       if (it_gabls41 .ge. nt_gabls4) then
1870        write(*,*) 'PB-stop: day, it_gabls41, it_gabls42, timeit: ',day,it_gabls41,it_gabls42,timeit/86400.
1871        stop
1872       endif
1873
1874! time interpolation:
1875       frac=(time_gabls42-timeit)/(time_gabls42-time_gabls41)
1876       frac=max(frac,0.0)
1877
1878
1879       do k=1,nlev_gabls4
1880        ug_prof(k) = ug_gabls4(k,it_gabls42)-frac*(ug_gabls4(k,it_gabls42)-ug_gabls4(k,it_gabls41))
1881        vg_prof(k) = vg_gabls4(k,it_gabls42)-frac*(vg_gabls4(k,it_gabls42)-vg_gabls4(k,it_gabls41))
1882        ht_prof(k) = ht_gabls4(k,it_gabls42)-frac*(ht_gabls4(k,it_gabls42)-ht_gabls4(k,it_gabls41))
1883        hq_prof(k) = hq_gabls4(k,it_gabls42)-frac*(hq_gabls4(k,it_gabls42)-hq_gabls4(k,it_gabls41))
1884        enddo
1885        tg_prof=tg_gabls4(it_gabls42)-frac*(tg_gabls4(it_gabls42)-tg_gabls4(it_gabls41))
1886        return
1887        END
1888
1889!======================================================================
1890        SUBROUTINE interp_armcu_time(day,day1,annee_ref                    &
1891     &             ,year_ini_armcu,day_ini_armcu,nt_armcu,dt_armcu         &
1892     &             ,nlev_armcu,fs_armcu,fl_armcu,at_armcu,rt_armcu         &
1893     &             ,aqt_armcu,fs_prof,fl_prof,at_prof,rt_prof,aqt_prof)
1894        implicit none
1895
1896!---------------------------------------------------------------------------------------
1897! Time interpolation of a 2D field to the timestep corresponding to day
1898!
1899! day: current julian day (e.g. 717538.2)
1900! day1: first day of the simulation
1901! nt_armcu: total nb of data in the forcing (e.g. 31 for armcu)
1902! dt_armcu: total time interval (in sec) between 2 forcing data (e.g. 1/2h for armcu)
1903! fs= sensible flux
1904! fl= latent flux
1905! at,rt,aqt= advective and radiative tendencies
1906!---------------------------------------------------------------------------------------
1907
1908! inputs:
1909        integer annee_ref
1910        integer nt_armcu,nlev_armcu
1911        integer year_ini_armcu
1912        real day, day1,day_ini_armcu,dt_armcu
1913        real fs_armcu(nt_armcu),fl_armcu(nt_armcu),at_armcu(nt_armcu)
1914        real rt_armcu(nt_armcu),aqt_armcu(nt_armcu)
1915! outputs:
1916        real fs_prof,fl_prof,at_prof,rt_prof,aqt_prof
1917! local:
1918        integer it_armcu1, it_armcu2,k
1919        real timeit,time_armcu1,time_armcu2,frac
1920
1921! Check that initial day of the simulation consistent with ARMCU period:
1922       if (annee_ref.ne.1997 ) then
1923        print*,'Pour ARMCU, annee_ref doit etre 1997 '
1924        print*,'Changer annee_ref dans run.def'
1925        stop
1926       endif
1927
1928      timeit=(day-day_ini_armcu)*86400
1929
1930! Determine the closest observation times:
1931       it_armcu1=INT(timeit/dt_armcu)+1
1932       it_armcu2=it_armcu1 + 1
1933       time_armcu1=(it_armcu1-1)*dt_armcu
1934       time_armcu2=(it_armcu2-1)*dt_armcu
1935       print *,'timeit day day_ini_armcu',timeit,day,day_ini_armcu
1936       print *,'it_armcu1,it_armcu2,time_armcu1,time_armcu2',              &
1937     &          it_armcu1,it_armcu2,time_armcu1,time_armcu2
1938
1939       if (it_armcu1 .ge. nt_armcu) then
1940        write(*,*) 'PB-stop: day, it_armcu1, it_armcu2, timeit: '          &
1941     &        ,day,it_armcu1,it_armcu2,timeit/86400.
1942        stop
1943       endif
1944
1945! time interpolation:
1946       frac=(time_armcu2-timeit)/(time_armcu2-time_armcu1)
1947       frac=max(frac,0.0)
1948
1949       fs_prof = fs_armcu(it_armcu2)                                       &
1950     &          -frac*(fs_armcu(it_armcu2)-fs_armcu(it_armcu1))
1951       fl_prof = fl_armcu(it_armcu2)                                       &
1952     &          -frac*(fl_armcu(it_armcu2)-fl_armcu(it_armcu1))
1953       at_prof = at_armcu(it_armcu2)                                       &
1954     &          -frac*(at_armcu(it_armcu2)-at_armcu(it_armcu1))
1955       rt_prof = rt_armcu(it_armcu2)                                       &
1956     &          -frac*(rt_armcu(it_armcu2)-rt_armcu(it_armcu1))
1957       aqt_prof = aqt_armcu(it_armcu2)                                       &
1958     &          -frac*(aqt_armcu(it_armcu2)-aqt_armcu(it_armcu1))
1959
1960         print*,                                                           &
1961     &'day,annee_ref,day_ini_armcu,timeit,it_armcu1,it_armcu2,SST:',       &
1962     &day,annee_ref,day_ini_armcu,timeit/86400.,it_armcu1,                 &
1963     &it_armcu2,fs_prof,fl_prof,at_prof,rt_prof,aqt_prof
1964
1965        return
1966        END
1967
1968!=====================================================================
1969      subroutine readprofiles(nlev_max,kmax,ntrac,height,                  &
1970     &           thlprof,qtprof,uprof,                                     &
1971     &           vprof,e12prof,ugprof,vgprof,                              &
1972     &           wfls,dqtdxls,dqtdyls,dqtdtls,                             &
1973     &           thlpcar,tracer,nt1,nt2)
1974      implicit none
1975
1976        integer nlev_max,kmax,kmax2,ntrac
1977        logical :: llesread = .true.
1978
1979        real height(nlev_max),thlprof(nlev_max),qtprof(nlev_max),          &
1980     &       uprof(nlev_max),vprof(nlev_max),e12prof(nlev_max),            &
1981     &       ugprof(nlev_max),vgprof(nlev_max),wfls(nlev_max),             &
1982     &       dqtdxls(nlev_max),dqtdyls(nlev_max),dqtdtls(nlev_max),        &
1983     &           thlpcar(nlev_max),tracer(nlev_max,ntrac)
1984
1985        real height1(nlev_max)
1986
1987        integer, parameter :: ilesfile=1
1988        integer :: ierr,k,itrac,nt1,nt2
1989
1990        if(.not.(llesread)) return
1991
1992       open (ilesfile,file='prof.inp.001',status='old',iostat=ierr)
1993        if (ierr /= 0) stop 'ERROR:Prof.inp does not exist'
1994        read (ilesfile,*) kmax
1995        do k=1,kmax
1996          read (ilesfile,*) height1(k),thlprof(k),qtprof (k),               &
1997     &                      uprof (k),vprof  (k),e12prof(k)
1998        enddo
1999        close(ilesfile)
2000
2001       open(ilesfile,file='lscale.inp.001',status='old',iostat=ierr)
2002        if (ierr /= 0) stop 'ERROR:Lscale.inp does not exist'
2003        read (ilesfile,*) kmax2
2004        if (kmax .ne. kmax2) then
2005          print *, 'fichiers prof.inp et lscale.inp incompatibles :'
2006          print *, 'nbre de niveaux : ',kmax,' et ',kmax2
2007          stop 'lecture profiles'
2008        endif
2009        do k=1,kmax
2010          read (ilesfile,*) height(k),ugprof(k),vgprof(k),wfls(k),         &
2011     &                      dqtdxls(k),dqtdyls(k),dqtdtls(k),thlpcar(k)
2012        end do
2013        do k=1,kmax
2014          if (height(k) .ne. height1(k)) then
2015            print *, 'fichiers prof.inp et lscale.inp incompatibles :'
2016            print *, 'les niveaux different : ',k,height1(k), height(k)
2017            stop
2018          endif
2019        end do
2020        close(ilesfile)
2021
2022       open(ilesfile,file='trac.inp.001',status='old',iostat=ierr)
2023        if (ierr /= 0) then
2024            print*,'WARNING : trac.inp does not exist'
2025        else
2026        read (ilesfile,*) kmax2,nt1,nt2
2027        if (nt2>ntrac) then
2028          stop 'Augmenter le nombre de traceurs dans traceur.def'
2029        endif
2030        if (kmax .ne. kmax2) then
2031          print *, 'fichiers prof.inp et lscale.inp incompatibles :'
2032          print *, 'nbre de niveaux : ',kmax,' et ',kmax2
2033          stop 'lecture profiles'
2034        endif
2035        do k=1,kmax
2036          read (ilesfile,*) height(k),(tracer(k,itrac),itrac=nt1,nt2)
2037        end do
2038        close(ilesfile)
2039        endif
2040
2041        return
2042        end
2043!======================================================================
2044      subroutine readprofile_sandu(nlev_max,kmax,height,pprof,tprof,       &
2045     &       thlprof,qprof,uprof,vprof,wprof,omega,o3mmr)
2046!======================================================================
2047      implicit none
2048
2049        integer nlev_max,kmax
2050        logical :: llesread = .true.
2051
2052        real height(nlev_max),pprof(nlev_max),tprof(nlev_max)
2053        real thlprof(nlev_max)
2054        real qprof(nlev_max),uprof(nlev_max),vprof(nlev_max)
2055        real wprof(nlev_max),omega(nlev_max),o3mmr(nlev_max)
2056
2057        integer, parameter :: ilesfile=1
2058        integer :: k,ierr
2059
2060        if(.not.(llesread)) return
2061
2062       open (ilesfile,file='prof.inp.001',status='old',iostat=ierr)
2063        if (ierr /= 0) stop 'ERROR:Prof.inp does not exist'
2064        read (ilesfile,*) kmax
2065        do k=1,kmax
2066          read (ilesfile,*) height(k),pprof(k),  tprof(k),thlprof(k),      &
2067     &                      qprof (k),uprof(k),  vprof(k),  wprof(k),      &
2068     &                      omega (k),o3mmr(k)
2069        enddo
2070        close(ilesfile)
2071
2072        return
2073        end
2074
2075!======================================================================
2076      subroutine readprofile_astex(nlev_max,kmax,height,pprof,tprof,       &
2077     &    thlprof,qvprof,qlprof,qtprof,uprof,vprof,wprof,tkeprof,o3mmr)
2078!======================================================================
2079      implicit none
2080
2081        integer nlev_max,kmax
2082        logical :: llesread = .true.
2083
2084        real height(nlev_max),pprof(nlev_max),tprof(nlev_max),             &
2085     &  thlprof(nlev_max),qlprof(nlev_max),qtprof(nlev_max),               &
2086     &  qvprof(nlev_max),uprof(nlev_max),vprof(nlev_max),                  &
2087     &  wprof(nlev_max),tkeprof(nlev_max),o3mmr(nlev_max)
2088
2089        integer, parameter :: ilesfile=1
2090        integer :: ierr,k
2091
2092        if(.not.(llesread)) return
2093
2094       open (ilesfile,file='prof.inp.001',status='old',iostat=ierr)
2095        if (ierr /= 0) stop 'ERROR:Prof.inp does not exist'
2096        read (ilesfile,*) kmax
2097        do k=1,kmax
2098          read (ilesfile,*) height(k),pprof(k),  tprof(k),thlprof(k),      &
2099     &                qvprof (k),qlprof (k),qtprof (k),                    &
2100     &                uprof(k),  vprof(k),  wprof(k),tkeprof(k),o3mmr(k)
2101        enddo
2102        close(ilesfile)
2103
2104        return
2105        end
2106
2107
2108
2109!======================================================================
2110      subroutine readprofile_armcu(nlev_max,kmax,height,pprof,uprof,       &
2111     &       vprof,thetaprof,tprof,qvprof,rvprof,aprof,bprof)
2112!======================================================================
2113      implicit none
2114
2115        integer nlev_max,kmax
2116        logical :: llesread = .true.
2117
2118        real height(nlev_max),pprof(nlev_max),tprof(nlev_max)
2119        real thetaprof(nlev_max),rvprof(nlev_max)
2120        real qvprof(nlev_max),uprof(nlev_max),vprof(nlev_max)
2121        real aprof(nlev_max+1),bprof(nlev_max+1)
2122
2123        integer, parameter :: ilesfile=1
2124        integer, parameter :: ifile=2
2125        integer :: ierr,jtot,k
2126
2127        if(.not.(llesread)) return
2128
2129! Read profiles at full levels
2130       IF(nlev_max.EQ.19) THEN
2131       open (ilesfile,file='prof.inp.19',status='old',iostat=ierr)
2132       print *,'On ouvre prof.inp.19'
2133       ELSE
2134       open (ilesfile,file='prof.inp.40',status='old',iostat=ierr)
2135       print *,'On ouvre prof.inp.40'
2136       ENDIF
2137        if (ierr /= 0) stop 'ERROR:Prof.inp does not exist'
2138        read (ilesfile,*) kmax
2139        do k=1,kmax
2140          read (ilesfile,*) height(k)    ,pprof(k),  uprof(k), vprof(k),   &
2141     &                      thetaprof(k) ,tprof(k), qvprof(k),rvprof(k)
2142        enddo
2143        close(ilesfile)
2144
2145! Vertical coordinates half levels for eta-coordinates (plev = alpha + beta * psurf) 
2146       IF(nlev_max.EQ.19) THEN
2147       open (ifile,file='proh.inp.19',status='old',iostat=ierr)
2148       print *,'On ouvre proh.inp.19'
2149       if (ierr /= 0) stop 'ERROR:Proh.inp.19 does not exist'
2150       ELSE
2151       open (ifile,file='proh.inp.40',status='old',iostat=ierr)
2152       print *,'On ouvre proh.inp.40'
2153       if (ierr /= 0) stop 'ERROR:Proh.inp.40 does not exist'
2154       ENDIF
2155        read (ifile,*) kmax
2156        do k=1,kmax
2157          read (ifile,*) jtot,aprof(k),bprof(k)
2158        enddo
2159        close(ifile)
2160
2161        return
2162        end
2163
2164!=====================================================================
2165      subroutine read_fire(fich_fire,nlevel,ntime                          &
2166     &     ,zz,thl,qt,u,v,tke                                              &
2167     &     ,ug,vg,wls,dqtdx,dqtdy,dqtdt,thl_rad)
2168
2169!program reading forcings of the FIRE case study
2170
2171
2172      use lmdz_netcdf, ONLY: nf_open,nf_nowrite,nf_noerr,nf_strerror,nf_inq_varid,nf90_get_var,&
2173            nf_inq_dimid,nf_inq_dimlen
2174      implicit none
2175
2176      integer ntime,nlevel
2177      character*80 :: fich_fire
2178      real*8 zz(nlevel)
2179
2180      real*8 thl(nlevel)
2181      real*8 qt(nlevel),u(nlevel)
2182      real*8 v(nlevel),tke(nlevel)
2183      real*8 ug(nlevel,ntime),vg(nlevel,ntime),wls(nlevel,ntime)
2184      real*8 dqtdx(nlevel,ntime),dqtdy(nlevel,ntime)
2185      real*8 dqtdt(nlevel,ntime),thl_rad(nlevel,ntime)
2186
2187      integer nid, ierr
2188      integer nbvar3d
2189      parameter(nbvar3d=30)
2190      integer var3didin(nbvar3d)
2191
2192      ierr = NF_OPEN(fich_fire,NF_NOWRITE,nid)
2193      if (ierr.NE.NF_NOERR) then
2194         write(*,*) 'ERROR: Pb opening forcings nc file '
2195         write(*,*) NF_STRERROR(ierr)
2196         stop ""
2197      endif
2198
2199
2200       ierr=NF_INQ_VARID(nid,"zz",var3didin(1)) 
2201         if(ierr/=NF_NOERR) then
2202           write(*,*) NF_STRERROR(ierr)
2203           stop 'lev'
2204         endif
2205
2206
2207      ierr=NF_INQ_VARID(nid,"thetal",var3didin(2))
2208         if(ierr/=NF_NOERR) then
2209           write(*,*) NF_STRERROR(ierr)
2210           stop 'temp'
2211         endif
2212
2213      ierr=NF_INQ_VARID(nid,"qt",var3didin(3))
2214         if(ierr/=NF_NOERR) then
2215           write(*,*) NF_STRERROR(ierr)
2216           stop 'qv'
2217         endif
2218
2219      ierr=NF_INQ_VARID(nid,"u",var3didin(4))
2220         if(ierr/=NF_NOERR) then
2221           write(*,*) NF_STRERROR(ierr)
2222           stop 'u'
2223         endif
2224
2225      ierr=NF_INQ_VARID(nid,"v",var3didin(5))
2226         if(ierr/=NF_NOERR) then
2227           write(*,*) NF_STRERROR(ierr)
2228           stop 'v'
2229         endif
2230
2231      ierr=NF_INQ_VARID(nid,"tke",var3didin(6))
2232         if(ierr/=NF_NOERR) then
2233           write(*,*) NF_STRERROR(ierr)
2234           stop 'tke'
2235         endif
2236
2237      ierr=NF_INQ_VARID(nid,"ugeo",var3didin(7))
2238         if(ierr/=NF_NOERR) then
2239           write(*,*) NF_STRERROR(ierr)
2240           stop 'ug'
2241         endif
2242
2243      ierr=NF_INQ_VARID(nid,"vgeo",var3didin(8))
2244         if(ierr/=NF_NOERR) then
2245           write(*,*) NF_STRERROR(ierr)
2246           stop 'vg'
2247         endif
2248     
2249      ierr=NF_INQ_VARID(nid,"wls",var3didin(9))
2250         if(ierr/=NF_NOERR) then
2251           write(*,*) NF_STRERROR(ierr)
2252           stop 'wls'
2253         endif
2254
2255      ierr=NF_INQ_VARID(nid,"dqtdx",var3didin(10))
2256         if(ierr/=NF_NOERR) then
2257           write(*,*) NF_STRERROR(ierr)
2258           stop 'dqtdx'
2259         endif
2260
2261      ierr=NF_INQ_VARID(nid,"dqtdy",var3didin(11))
2262         if(ierr/=NF_NOERR) then
2263           write(*,*) NF_STRERROR(ierr)
2264           stop 'dqtdy'
2265      endif
2266
2267      ierr=NF_INQ_VARID(nid,"dqtdt",var3didin(12))
2268         if(ierr/=NF_NOERR) then
2269           write(*,*) NF_STRERROR(ierr)
2270           stop 'dqtdt'
2271      endif
2272
2273      ierr=NF_INQ_VARID(nid,"thl_rad",var3didin(13))
2274         if(ierr/=NF_NOERR) then
2275           write(*,*) NF_STRERROR(ierr)
2276           stop 'thl_rad'
2277      endif
2278!dimensions lecture
2279!      call catchaxis(nid,ntime,nlevel,time,z,ierr)
2280 
2281         ierr = NF90_GET_VAR(nid,var3didin(1),zz)
2282         if(ierr/=NF_NOERR) then
2283            write(*,*) NF_STRERROR(ierr)
2284            stop "getvarup"
2285         endif
2286!          write(*,*)'lecture z ok',zz
2287
2288         ierr = NF90_GET_VAR(nid,var3didin(2),thl)
2289         if(ierr/=NF_NOERR) then
2290            write(*,*) NF_STRERROR(ierr)
2291            stop "getvarup"
2292         endif
2293!          write(*,*)'lecture thl ok',thl
2294
2295         ierr = NF90_GET_VAR(nid,var3didin(3),qt)
2296         if(ierr/=NF_NOERR) then
2297            write(*,*) NF_STRERROR(ierr)
2298            stop "getvarup"
2299         endif
2300!          write(*,*)'lecture qt ok',qt
2301 
2302         ierr = NF90_GET_VAR(nid,var3didin(4),u)
2303         if(ierr/=NF_NOERR) then
2304            write(*,*) NF_STRERROR(ierr)
2305            stop "getvarup"
2306         endif
2307!          write(*,*)'lecture u ok',u
2308
2309         ierr = NF90_GET_VAR(nid,var3didin(5),v)
2310         if(ierr/=NF_NOERR) then
2311            write(*,*) NF_STRERROR(ierr)
2312            stop "getvarup"
2313         endif
2314!          write(*,*)'lecture v ok',v
2315
2316         ierr = NF90_GET_VAR(nid,var3didin(6),tke)
2317         if(ierr/=NF_NOERR) then
2318            write(*,*) NF_STRERROR(ierr)
2319            stop "getvarup"
2320         endif
2321!          write(*,*)'lecture tke ok',tke
2322
2323         ierr = NF90_GET_VAR(nid,var3didin(7),ug)
2324         if(ierr/=NF_NOERR) then
2325            write(*,*) NF_STRERROR(ierr)
2326            stop "getvarup"
2327         endif
2328!          write(*,*)'lecture ug ok',ug
2329
2330         ierr = NF90_GET_VAR(nid,var3didin(8),vg)
2331         if(ierr/=NF_NOERR) then
2332            write(*,*) NF_STRERROR(ierr)
2333            stop "getvarup"
2334         endif
2335!          write(*,*)'lecture vg ok',vg
2336
2337         ierr = NF90_GET_VAR(nid,var3didin(9),wls)
2338         if(ierr/=NF_NOERR) then
2339            write(*,*) NF_STRERROR(ierr)
2340            stop "getvarup"
2341         endif
2342!          write(*,*)'lecture wls ok',wls
2343
2344         ierr = NF90_GET_VAR(nid,var3didin(10),dqtdx)
2345         if(ierr/=NF_NOERR) then
2346            write(*,*) NF_STRERROR(ierr)
2347            stop "getvarup"
2348         endif
2349!          write(*,*)'lecture dqtdx ok',dqtdx
2350
2351         ierr = NF90_GET_VAR(nid,var3didin(11),dqtdy)
2352         if(ierr/=NF_NOERR) then
2353            write(*,*) NF_STRERROR(ierr)
2354            stop "getvarup"
2355         endif
2356!          write(*,*)'lecture dqtdy ok',dqtdy
2357
2358         ierr = NF90_GET_VAR(nid,var3didin(12),dqtdt)
2359         if(ierr/=NF_NOERR) then
2360            write(*,*) NF_STRERROR(ierr)
2361            stop "getvarup"
2362         endif
2363!          write(*,*)'lecture dqtdt ok',dqtdt
2364
2365         ierr = NF90_GET_VAR(nid,var3didin(13),thl_rad)
2366         if(ierr/=NF_NOERR) then
2367            write(*,*) NF_STRERROR(ierr)
2368            stop "getvarup"
2369         endif
2370!          write(*,*)'lecture thl_rad ok',thl_rad
2371
2372         return 
2373         end subroutine read_fire
2374!=====================================================================
2375      subroutine read_dice(fich_dice,nlevel,ntime                         &
2376     &     ,zz,pres,t,qv,u,v,o3                                          &
2377     &     ,shf,lhf,lwup,swup,tg,ustar,psurf,ug,vg                        &
2378     &     ,hadvt,hadvq,hadvu,hadvv,w,omega)
2379
2380!program reading initial profils and forcings of the Dice case study
2381
2382      use lmdz_netcdf, ONLY: nf_open,nf_nowrite,nf_noerr,nf_strerror,nf_inq_varid,nf90_get_var,&
2383            nf_inq_dimid,nf_inq_dimlen
2384
2385      implicit none
2386
2387      INCLUDE "YOMCST.h"
2388
2389      integer ntime,nlevel
2390      integer l,k
2391      character*80 :: fich_dice
2392      real*8 time(ntime)
2393      real*8 zz(nlevel)
2394
2395      real*8 th(nlevel),pres(nlevel),t(nlevel)
2396      real*8 qv(nlevel),u(nlevel),v(nlevel),o3(nlevel)
2397      real*8 shf(ntime),lhf(ntime),lwup(ntime),swup(ntime),tg(ntime)
2398      real*8 ustar(ntime),psurf(ntime),ug(ntime),vg(ntime)
2399      real*8 hadvt(nlevel,ntime),hadvq(nlevel,ntime),hadvu(nlevel,ntime)
2400      real*8 hadvv(nlevel,ntime),w(nlevel,ntime),omega(nlevel,ntime)
2401      real*8 pzero
2402
2403      integer nid, ierr
2404      integer nbvar3d
2405      parameter(nbvar3d=30)
2406      integer var3didin(nbvar3d)
2407
2408      pzero=100000.
2409      ierr = NF_OPEN(fich_dice,NF_NOWRITE,nid)
2410      if (ierr.NE.NF_NOERR) then
2411         write(*,*) 'ERROR: Pb opening forcings nc file '
2412         write(*,*) NF_STRERROR(ierr)
2413         stop ""
2414      endif
2415
2416
2417       ierr=NF_INQ_VARID(nid,"height",var3didin(1)) 
2418         if(ierr/=NF_NOERR) then
2419           write(*,*) NF_STRERROR(ierr)
2420           stop 'height'
2421         endif
2422
2423       ierr=NF_INQ_VARID(nid,"pf",var3didin(11)) 
2424         if(ierr/=NF_NOERR) then
2425           write(*,*) NF_STRERROR(ierr)
2426           stop 'pf'
2427         endif
2428
2429      ierr=NF_INQ_VARID(nid,"theta",var3didin(12))
2430         if(ierr/=NF_NOERR) then
2431           write(*,*) NF_STRERROR(ierr)
2432           stop 'theta'
2433         endif
2434
2435      ierr=NF_INQ_VARID(nid,"qv",var3didin(13))
2436         if(ierr/=NF_NOERR) then
2437           write(*,*) NF_STRERROR(ierr)
2438           stop 'qv'
2439         endif
2440
2441      ierr=NF_INQ_VARID(nid,"u",var3didin(14))
2442         if(ierr/=NF_NOERR) then
2443           write(*,*) NF_STRERROR(ierr)
2444           stop 'u'
2445         endif
2446
2447      ierr=NF_INQ_VARID(nid,"v",var3didin(15))
2448         if(ierr/=NF_NOERR) then
2449           write(*,*) NF_STRERROR(ierr)
2450           stop 'v'
2451         endif
2452
2453      ierr=NF_INQ_VARID(nid,"o3mmr",var3didin(16))
2454         if(ierr/=NF_NOERR) then
2455           write(*,*) NF_STRERROR(ierr)
2456           stop 'o3'
2457         endif
2458
2459      ierr=NF_INQ_VARID(nid,"shf",var3didin(2))
2460         if(ierr/=NF_NOERR) then
2461           write(*,*) NF_STRERROR(ierr)
2462           stop 'shf'
2463         endif
2464
2465      ierr=NF_INQ_VARID(nid,"lhf",var3didin(3))
2466         if(ierr/=NF_NOERR) then
2467           write(*,*) NF_STRERROR(ierr)
2468           stop 'lhf'
2469         endif
2470     
2471      ierr=NF_INQ_VARID(nid,"lwup",var3didin(4))
2472         if(ierr/=NF_NOERR) then
2473           write(*,*) NF_STRERROR(ierr)
2474           stop 'lwup'
2475         endif
2476
2477      ierr=NF_INQ_VARID(nid,"swup",var3didin(5))
2478         if(ierr/=NF_NOERR) then
2479           write(*,*) NF_STRERROR(ierr)
2480           stop 'dqtdx'
2481         endif
2482
2483      ierr=NF_INQ_VARID(nid,"Tg",var3didin(6))
2484         if(ierr/=NF_NOERR) then
2485           write(*,*) NF_STRERROR(ierr)
2486           stop 'Tg'
2487      endif
2488
2489      ierr=NF_INQ_VARID(nid,"ustar",var3didin(7))
2490         if(ierr/=NF_NOERR) then
2491           write(*,*) NF_STRERROR(ierr)
2492           stop 'ustar'
2493      endif
2494
2495      ierr=NF_INQ_VARID(nid,"psurf",var3didin(8))
2496         if(ierr/=NF_NOERR) then
2497           write(*,*) NF_STRERROR(ierr)
2498           stop 'psurf'
2499      endif
2500
2501      ierr=NF_INQ_VARID(nid,"Ug",var3didin(9))
2502         if(ierr/=NF_NOERR) then
2503           write(*,*) NF_STRERROR(ierr)
2504           stop 'Ug'
2505      endif
2506
2507      ierr=NF_INQ_VARID(nid,"Vg",var3didin(10))
2508         if(ierr/=NF_NOERR) then
2509           write(*,*) NF_STRERROR(ierr)
2510           stop 'Vg'
2511      endif
2512
2513      ierr=NF_INQ_VARID(nid,"hadvT",var3didin(17))
2514         if(ierr/=NF_NOERR) then
2515           write(*,*) NF_STRERROR(ierr)
2516           stop 'hadvT'
2517      endif
2518
2519      ierr=NF_INQ_VARID(nid,"hadvq",var3didin(18))
2520         if(ierr/=NF_NOERR) then
2521           write(*,*) NF_STRERROR(ierr)
2522           stop 'hadvq'
2523      endif
2524
2525      ierr=NF_INQ_VARID(nid,"hadvu",var3didin(19))
2526         if(ierr/=NF_NOERR) then
2527           write(*,*) NF_STRERROR(ierr)
2528           stop 'hadvu'
2529      endif
2530
2531      ierr=NF_INQ_VARID(nid,"hadvv",var3didin(20))
2532         if(ierr/=NF_NOERR) then
2533           write(*,*) NF_STRERROR(ierr)
2534           stop 'hadvv'
2535      endif
2536
2537      ierr=NF_INQ_VARID(nid,"w",var3didin(21))
2538         if(ierr/=NF_NOERR) then
2539           write(*,*) NF_STRERROR(ierr)
2540           stop 'w'
2541      endif
2542
2543      ierr=NF_INQ_VARID(nid,"omega",var3didin(22))
2544         if(ierr/=NF_NOERR) then
2545           write(*,*) NF_STRERROR(ierr)
2546           stop 'omega'
2547      endif
2548!dimensions lecture
2549!      call catchaxis(nid,ntime,nlevel,time,z,ierr)
2550 
2551         ierr = NF90_GET_VAR(nid,var3didin(1),zz)
2552         if(ierr/=NF_NOERR) then
2553            write(*,*) NF_STRERROR(ierr)
2554            stop "getvarup"
2555         endif
2556!          write(*,*)'lecture zz ok',zz
2557 
2558         ierr = NF90_GET_VAR(nid,var3didin(11),pres)
2559         if(ierr/=NF_NOERR) then
2560            write(*,*) NF_STRERROR(ierr)
2561            stop "getvarup"
2562         endif
2563!          write(*,*)'lecture pres ok',pres
2564
2565         ierr = NF90_GET_VAR(nid,var3didin(12),th)
2566         if(ierr/=NF_NOERR) then
2567            write(*,*) NF_STRERROR(ierr)
2568            stop "getvarup"
2569         endif
2570!          write(*,*)'lecture th ok',th
2571           do k=1,nlevel
2572             t(k)=th(k)*(pres(k)/pzero)**rkappa
2573           enddo
2574
2575         ierr = NF90_GET_VAR(nid,var3didin(13),qv)
2576         if(ierr/=NF_NOERR) then
2577            write(*,*) NF_STRERROR(ierr)
2578            stop "getvarup"
2579         endif
2580!          write(*,*)'lecture qv ok',qv
2581 
2582         ierr = NF90_GET_VAR(nid,var3didin(14),u)
2583         if(ierr/=NF_NOERR) then
2584            write(*,*) NF_STRERROR(ierr)
2585            stop "getvarup"
2586         endif
2587!          write(*,*)'lecture u ok',u
2588
2589         ierr = NF90_GET_VAR(nid,var3didin(15),v)
2590         if(ierr/=NF_NOERR) then
2591            write(*,*) NF_STRERROR(ierr)
2592            stop "getvarup"
2593         endif
2594!          write(*,*)'lecture v ok',v
2595
2596         ierr = NF90_GET_VAR(nid,var3didin(16),o3)
2597         if(ierr/=NF_NOERR) then
2598            write(*,*) NF_STRERROR(ierr)
2599            stop "getvarup"
2600         endif
2601!          write(*,*)'lecture o3 ok',o3
2602
2603         ierr = NF90_GET_VAR(nid,var3didin(2),shf)
2604         if(ierr/=NF_NOERR) then
2605            write(*,*) NF_STRERROR(ierr)
2606            stop "getvarup"
2607         endif
2608!          write(*,*)'lecture shf ok',shf
2609
2610         ierr = NF90_GET_VAR(nid,var3didin(3),lhf)
2611         if(ierr/=NF_NOERR) then
2612            write(*,*) NF_STRERROR(ierr)
2613            stop "getvarup"
2614         endif
2615!          write(*,*)'lecture lhf ok',lhf
2616
2617         ierr = NF90_GET_VAR(nid,var3didin(4),lwup)
2618         if(ierr/=NF_NOERR) then
2619            write(*,*) NF_STRERROR(ierr)
2620            stop "getvarup"
2621         endif
2622!          write(*,*)'lecture lwup ok',lwup
2623
2624         ierr = NF90_GET_VAR(nid,var3didin(5),swup)
2625         if(ierr/=NF_NOERR) then
2626            write(*,*) NF_STRERROR(ierr)
2627            stop "getvarup"
2628         endif
2629!          write(*,*)'lecture swup ok',swup
2630
2631         ierr = NF90_GET_VAR(nid,var3didin(6),tg)
2632         if(ierr/=NF_NOERR) then
2633            write(*,*) NF_STRERROR(ierr)
2634            stop "getvarup"
2635         endif
2636!          write(*,*)'lecture tg ok',tg
2637
2638         ierr = NF90_GET_VAR(nid,var3didin(7),ustar)
2639         if(ierr/=NF_NOERR) then
2640            write(*,*) NF_STRERROR(ierr)
2641            stop "getvarup"
2642         endif
2643!          write(*,*)'lecture ustar ok',ustar
2644
2645         ierr = NF90_GET_VAR(nid,var3didin(8),psurf)
2646         if(ierr/=NF_NOERR) then
2647            write(*,*) NF_STRERROR(ierr)
2648            stop "getvarup"
2649         endif
2650!          write(*,*)'lecture psurf ok',psurf
2651
2652         ierr = NF90_GET_VAR(nid,var3didin(9),ug)
2653         if(ierr/=NF_NOERR) then
2654            write(*,*) NF_STRERROR(ierr)
2655            stop "getvarup"
2656         endif
2657!          write(*,*)'lecture ug ok',ug
2658
2659         ierr = NF90_GET_VAR(nid,var3didin(10),vg)
2660         if(ierr/=NF_NOERR) then
2661            write(*,*) NF_STRERROR(ierr)
2662            stop "getvarup"
2663         endif
2664!          write(*,*)'lecture vg ok',vg
2665
2666         ierr = NF90_GET_VAR(nid,var3didin(17),hadvt)
2667         if(ierr/=NF_NOERR) then
2668            write(*,*) NF_STRERROR(ierr)
2669            stop "getvarup"
2670         endif
2671!          write(*,*)'lecture hadvt ok',hadvt
2672
2673         ierr = NF90_GET_VAR(nid,var3didin(18),hadvq)
2674         if(ierr/=NF_NOERR) then
2675            write(*,*) NF_STRERROR(ierr)
2676            stop "getvarup"
2677         endif
2678!          write(*,*)'lecture hadvq ok',hadvq
2679
2680         ierr = NF90_GET_VAR(nid,var3didin(19),hadvu)
2681         if(ierr/=NF_NOERR) then
2682            write(*,*) NF_STRERROR(ierr)
2683            stop "getvarup"
2684         endif
2685!          write(*,*)'lecture hadvu ok',hadvu
2686
2687         ierr = NF90_GET_VAR(nid,var3didin(20),hadvv)
2688         if(ierr/=NF_NOERR) then
2689            write(*,*) NF_STRERROR(ierr)
2690            stop "getvarup"
2691         endif
2692!          write(*,*)'lecture hadvv ok',hadvv
2693
2694         ierr = NF90_GET_VAR(nid,var3didin(21),w)
2695         if(ierr/=NF_NOERR) then
2696            write(*,*) NF_STRERROR(ierr)
2697            stop "getvarup"
2698         endif
2699!          write(*,*)'lecture w ok',w
2700
2701         ierr = NF90_GET_VAR(nid,var3didin(22),omega)
2702         if(ierr/=NF_NOERR) then
2703            write(*,*) NF_STRERROR(ierr)
2704            stop "getvarup"
2705         endif
2706!          write(*,*)'lecture omega ok',omega
2707
2708         return 
2709         end subroutine read_dice
2710!=====================================================================
2711      subroutine read_gabls4(fich_gabls4,nlevel,ntime,nsol                    &
2712     &     ,zz,depth_sn,ug,vg,pf,th,t,qv,u,v,hadvt,hadvq,tg,tsnow,snow_dens)
2713
2714!program reading initial profils and forcings of the Gabls4 case study
2715
2716      use lmdz_netcdf, ONLY: nf_open,nf_nowrite,nf_noerr,nf_strerror,nf_inq_varid,nf90_get_var,&
2717            nf_inq_dimid,nf_inq_dimlen
2718
2719      implicit none
2720
2721      integer ntime,nlevel,nsol
2722      integer l,k
2723      character*80 :: fich_gabls4
2724      real*8 time(ntime)
2725
2726!  ATTENTION: visiblement quand on lit gabls4_driver.nc on recupere les donnees
2727! dans un ordre inverse par rapport a la convention LMDZ
2728! ==> il faut tout inverser  (MPL 20141024)
2729! les variables indexees "_i" sont celles qui sont lues dans gabls4_driver.nc
2730      real*8 zz_i(nlevel),th_i(nlevel),pf_i(nlevel),t_i(nlevel)
2731      real*8 qv_i(nlevel),u_i(nlevel),v_i(nlevel),ug_i(nlevel,ntime),vg_i(nlevel,ntime)
2732      real*8 hadvt_i(nlevel,ntime),hadvq_i(nlevel,ntime)
2733
2734      real*8 zz(nlevel),th(nlevel),pf(nlevel),t(nlevel)
2735      real*8 qv(nlevel),u(nlevel),v(nlevel),ug(nlevel,ntime),vg(nlevel,ntime)
2736      real*8 hadvt(nlevel,ntime),hadvq(nlevel,ntime)
2737
2738      real*8 depth_sn(nsol),tsnow(nsol),snow_dens(nsol)
2739      real*8 tg(ntime)
2740      integer nid, ierr
2741      integer nbvar3d
2742      parameter(nbvar3d=30)
2743      integer var3didin(nbvar3d)
2744
2745      ierr = NF_OPEN(fich_gabls4,NF_NOWRITE,nid)
2746      if (ierr.NE.NF_NOERR) then
2747         write(*,*) 'ERROR: Pb opening forcings nc file '
2748         write(*,*) NF_STRERROR(ierr)
2749         stop ""
2750      endif
2751
2752
2753       ierr=NF_INQ_VARID(nid,"height",var3didin(1)) 
2754         if(ierr/=NF_NOERR) then
2755           write(*,*) NF_STRERROR(ierr)
2756           stop 'height'
2757         endif
2758
2759      ierr=NF_INQ_VARID(nid,"depth_sn",var3didin(2))
2760         if(ierr/=NF_NOERR) then
2761           write(*,*) NF_STRERROR(ierr)
2762           stop 'depth_sn'
2763      endif
2764
2765      ierr=NF_INQ_VARID(nid,"Ug",var3didin(3))
2766         if(ierr/=NF_NOERR) then
2767           write(*,*) NF_STRERROR(ierr)
2768           stop 'Ug'
2769      endif
2770
2771      ierr=NF_INQ_VARID(nid,"Vg",var3didin(4))
2772         if(ierr/=NF_NOERR) then
2773           write(*,*) NF_STRERROR(ierr)
2774           stop 'Vg'
2775      endif
2776       ierr=NF_INQ_VARID(nid,"pf",var3didin(5)) 
2777         if(ierr/=NF_NOERR) then
2778           write(*,*) NF_STRERROR(ierr)
2779           stop 'pf'
2780         endif
2781
2782      ierr=NF_INQ_VARID(nid,"theta",var3didin(6))
2783         if(ierr/=NF_NOERR) then
2784           write(*,*) NF_STRERROR(ierr)
2785           stop 'theta'
2786         endif
2787
2788      ierr=NF_INQ_VARID(nid,"tempe",var3didin(7))
2789         if(ierr/=NF_NOERR) then
2790           write(*,*) NF_STRERROR(ierr)
2791           stop 'tempe'
2792         endif
2793
2794      ierr=NF_INQ_VARID(nid,"qv",var3didin(8))
2795         if(ierr/=NF_NOERR) then
2796           write(*,*) NF_STRERROR(ierr)
2797           stop 'qv'
2798         endif
2799
2800      ierr=NF_INQ_VARID(nid,"u",var3didin(9))
2801         if(ierr/=NF_NOERR) then
2802           write(*,*) NF_STRERROR(ierr)
2803           stop 'u'
2804         endif
2805
2806      ierr=NF_INQ_VARID(nid,"v",var3didin(10))
2807         if(ierr/=NF_NOERR) then
2808           write(*,*) NF_STRERROR(ierr)
2809           stop 'v'
2810         endif
2811
2812      ierr=NF_INQ_VARID(nid,"hadvT",var3didin(11))
2813         if(ierr/=NF_NOERR) then
2814           write(*,*) NF_STRERROR(ierr)
2815           stop 'hadvt'
2816         endif
2817
2818      ierr=NF_INQ_VARID(nid,"hadvQ",var3didin(12))
2819         if(ierr/=NF_NOERR) then
2820           write(*,*) NF_STRERROR(ierr)
2821           stop 'hadvq'
2822      endif
2823
2824      ierr=NF_INQ_VARID(nid,"Tsnow",var3didin(14))
2825         if(ierr/=NF_NOERR) then
2826           write(*,*) NF_STRERROR(ierr)
2827           stop 'tsnow'
2828      endif
2829
2830      ierr=NF_INQ_VARID(nid,"snow_density",var3didin(15))
2831         if(ierr/=NF_NOERR) then
2832           write(*,*) NF_STRERROR(ierr)
2833           stop 'snow_density'
2834      endif
2835
2836      ierr=NF_INQ_VARID(nid,"Tg",var3didin(16))
2837         if(ierr/=NF_NOERR) then
2838           write(*,*) NF_STRERROR(ierr)
2839           stop 'Tg'
2840      endif
2841
2842
2843!dimensions lecture
2844!      call catchaxis(nid,ntime,nlevel,time,z,ierr)
2845 
2846         ierr = NF90_GET_VAR(nid,var3didin(1),zz_i)
2847         if(ierr/=NF_NOERR) then
2848            write(*,*) NF_STRERROR(ierr)
2849            stop "getvarup"
2850         endif
2851 
2852         ierr = NF90_GET_VAR(nid,var3didin(2),depth_sn)
2853         if(ierr/=NF_NOERR) then
2854            write(*,*) NF_STRERROR(ierr)
2855            stop "getvarup"
2856         endif
2857 
2858         ierr = NF90_GET_VAR(nid,var3didin(3),ug_i)
2859         if(ierr/=NF_NOERR) then
2860            write(*,*) NF_STRERROR(ierr)
2861            stop "getvarup"
2862         endif
2863 
2864         ierr = NF90_GET_VAR(nid,var3didin(4),vg_i)
2865         if(ierr/=NF_NOERR) then
2866            write(*,*) NF_STRERROR(ierr)
2867            stop "getvarup"
2868         endif
2869 
2870         ierr = NF90_GET_VAR(nid,var3didin(5),pf_i)
2871         if(ierr/=NF_NOERR) then
2872            write(*,*) NF_STRERROR(ierr)
2873            stop "getvarup"
2874         endif
2875
2876         ierr = NF90_GET_VAR(nid,var3didin(6),th_i)
2877         if(ierr/=NF_NOERR) then
2878            write(*,*) NF_STRERROR(ierr)
2879            stop "getvarup"
2880         endif
2881
2882         ierr = NF90_GET_VAR(nid,var3didin(7),t_i)
2883         if(ierr/=NF_NOERR) then
2884            write(*,*) NF_STRERROR(ierr)
2885            stop "getvarup"
2886         endif
2887
2888         ierr = NF90_GET_VAR(nid,var3didin(8),qv_i)
2889         if(ierr/=NF_NOERR) then
2890            write(*,*) NF_STRERROR(ierr)
2891            stop "getvarup"
2892         endif
2893 
2894         ierr = NF90_GET_VAR(nid,var3didin(9),u_i)
2895         if(ierr/=NF_NOERR) then
2896            write(*,*) NF_STRERROR(ierr)
2897            stop "getvarup"
2898         endif
2899 
2900         ierr = NF90_GET_VAR(nid,var3didin(10),v_i)
2901         if(ierr/=NF_NOERR) then
2902            write(*,*) NF_STRERROR(ierr)
2903            stop "getvarup"
2904         endif
2905 
2906         ierr = NF90_GET_VAR(nid,var3didin(11),hadvt_i)
2907         if(ierr/=NF_NOERR) then
2908            write(*,*) NF_STRERROR(ierr)
2909            stop "getvarup"
2910         endif
2911 
2912         ierr = NF90_GET_VAR(nid,var3didin(12),hadvq_i)
2913         if(ierr/=NF_NOERR) then
2914            write(*,*) NF_STRERROR(ierr)
2915            stop "getvarup"
2916         endif
2917 
2918         ierr = NF90_GET_VAR(nid,var3didin(14),tsnow)
2919         if(ierr/=NF_NOERR) then
2920            write(*,*) NF_STRERROR(ierr)
2921            stop "getvarup"
2922         endif
2923 
2924         ierr = NF90_GET_VAR(nid,var3didin(15),snow_dens)
2925         if(ierr/=NF_NOERR) then
2926            write(*,*) NF_STRERROR(ierr)
2927            stop "getvarup"
2928         endif
2929
2930         ierr = NF90_GET_VAR(nid,var3didin(16),tg)
2931         if(ierr/=NF_NOERR) then
2932            write(*,*) NF_STRERROR(ierr)
2933            stop "getvarup"
2934         endif
2935
2936! On remet les variables lues dans le bon ordre des niveaux (MPL 20141024)
2937         do k=1,nlevel
2938           zz(k)=zz_i(nlevel+1-k)
2939           ug(k,:)=ug_i(nlevel+1-k,:)
2940           vg(k,:)=vg_i(nlevel+1-k,:)
2941           pf(k)=pf_i(nlevel+1-k)
2942           print *,'pf=',pf(k)
2943           th(k)=th_i(nlevel+1-k)
2944           t(k)=t_i(nlevel+1-k)
2945           qv(k)=qv_i(nlevel+1-k)
2946           u(k)=u_i(nlevel+1-k)
2947           v(k)=v_i(nlevel+1-k)
2948           hadvt(k,:)=hadvt_i(nlevel+1-k,:)
2949           hadvq(k,:)=hadvq_i(nlevel+1-k,:)
2950         enddo
2951         return 
2952 end subroutine read_gabls4
2953!=====================================================================
2954
2955!     Reads CIRC input files     
2956
2957      SUBROUTINE read_circ(nlev_circ,cf,lwp,iwp,reliq,reice,t,z,p,pm,h2o,o3,sza)
2958     
2959      parameter (ncm_1=49180)
2960      INCLUDE "YOMCST.h"
2961
2962      real albsfc(ncm_1), albsfc_w(ncm_1)
2963      real cf(nlev_circ), icefra(nlev_circ), deice(nlev_circ), &
2964           reliq(nlev_circ), reice(nlev_circ), lwp(nlev_circ), iwp(nlev_circ)
2965      real t(nlev_circ+1), z(nlev_circ+1), dz(nlev_circ), p(nlev_circ+1)
2966      real aer_beta(nlev_circ), waer(nlev_circ), gaer(nlev_circ)
2967      real pm(nlev_circ), tm(nlev_circ), h2o(nlev_circ), o3(nlev_circ)
2968      real co2(nlev_circ), n2o(nlev_circ), co(nlev_circ), ch4(nlev_circ), &
2969           o2(nlev_circ), ccl4(nlev_circ), f11(nlev_circ), f12(nlev_circ)
2970!     za= zenital angle
2971!     sza= cosinus angle zenital
2972      real wavn(ncm_1), ssf(ncm_1),za,sza
2973      integer nlev
2974
2975
2976!     Open the files
2977
2978      open (11, file='Tsfc_sza_nlev_case.txt', status='old')
2979      open (12, file='level_input_case.txt', status='old')
2980      open (13, file='layer_input_case.txt', status='old')
2981      open (14, file='aerosol_input_case.txt', status='old')
2982      open (15, file='cloud_input_case.txt', status='old')
2983      open (16, file='sfcalbedo_input_case.txt', status='old')
2984     
2985!     Read scalar information
2986      do iskip=1,5
2987         read (11, *)
2988      enddo
2989      read (11, '(i8)') nlev
2990      read (11, '(f10.2)') tsfc
2991      read (11, '(f10.2)') za
2992      read (11, '(f10.4)') sw_dn_toa
2993      sza=cos(za/180.*RPI)
2994      print *,'nlev,tsfc,sza,sw_dn_toa,RPI',nlev,tsfc,sza,sw_dn_toa,RPI
2995      close(11)
2996
2997!     Read level information
2998      read (12, *)
2999      do il=1,nlev
3000         read (12, 302) ilev, z(il), p(il), t(il)
3001         z(il)=z(il)*1000.    ! z donne en km
3002         p(il)=p(il)*100.     ! p donne en mb
3003      enddo
3004302   format (i8, f8.3, 2f9.2)
3005      close(12)
3006
3007!     Read layer information (midpoint values)
3008      do iskip=1,3
3009         read (13, *)
3010      enddo
3011      do il=1,nlev-1
3012         read (13, 303) ilev,pm(il),tm(il),h2o(il),co2(il),o3(il), &
3013                        n2o(il),co(il),ch4(il),o2(il),ccl4(il), &
3014                        f11(il),f12(il)
3015         pm(il)=pm(il)*100.
3016      enddo
3017303   format (i8, 2f9.2, 10(2x,e13.7))     
3018      close(13)
3019     
3020!     Read aerosol layer information
3021      do iskip=1,3
3022         read (14, *)
3023      enddo
3024      read (14, '(f10.2)') aer_alpha
3025      read (14, *)
3026      read (14, *)
3027      do il=1,nlev-1
3028         read (14, 304) ilev, aer_beta(il), waer(il), gaer(il)
3029      enddo
3030304   format (i8, f9.5, 2f8.3)
3031      close(14)
3032     
3033!     Read cloud information
3034      do iskip=1,3
3035         read (15, *)
3036      enddo
3037      do il=1,nlev-1
3038         read (15, 305) ilev, cf(il), lwp(il), iwp(il), reliq(il), reice(il)
3039         lwp(il)=lwp(il)/1000.          ! lwp donne en g/kg
3040         iwp(il)=iwp(il)/1000.          ! iwp donne en g/kg
3041         reliq(il)=reliq(il)/1000000.   ! reliq donne en microns
3042         reice(il)=reice(il)/1000000.   ! reice donne en microns
3043      enddo
3044305   format (i8, f8.3, 4f9.2)
3045      close(15)
3046
3047!     Read surface albedo (weighted & unweighted) and spectral solar irradiance
3048      do iskip=1,6
3049         read (16, *)
3050      enddo
3051      do icm_1=1,ncm_1
3052         read (16, 306) wavn(icm_1), albsfc(icm_1), albsfc_w(icm_1), ssf(icm_1)
3053      enddo
3054306   format(f10.1, 2f12.5, f14.8)
3055      close(16)
3056 
3057      return 
3058      end subroutine read_circ
3059!=====================================================================
3060!     Reads RTMIP input files     
3061
3062      SUBROUTINE read_rtmip(nlev_rtmip,play,plev,t,h2o,o3)
3063     
3064      INCLUDE "YOMCST.h"
3065
3066      real t(nlev_rtmip), pt(nlev_rtmip),pb(nlev_rtmip),h2o(nlev_rtmip), o3(nlev_rtmip)
3067      real temp(nlev_rtmip), play(nlev_rtmip),ovap(nlev_rtmip), oz(nlev_rtmip),plev(nlev_rtmip+1)
3068      integer nlev
3069
3070
3071!     Open the files
3072
3073      open (11, file='low_resolution_profile.txt', status='old')
3074     
3075!     Read level information
3076      read (11, *)
3077      do il=1,nlev_rtmip
3078         read (11, 302) pt(il), pb(il), t(il),h2o(il),o3(il)
3079      enddo
3080      do il=1,nlev_rtmip
3081         play(il)=pt(nlev_rtmip-il+1)*100.     ! p donne en mb
3082         temp(il)=t(nlev_rtmip-il+1)
3083         ovap(il)=h2o(nlev_rtmip-il+1)
3084         oz(il)=o3(nlev_rtmip-il+1)
3085      enddo
3086      do il=1,39
3087         plev(il)=play(il)+(play(il+1)-play(il))/2.
3088         print *,'il p t ovap oz=',il,plev(il),temp(il),ovap(il),oz(il)
3089      enddo
3090      plev(41)=101300.
3091302   format (e16.10,3x,e16.10,3x,e16.10,3x,e12.6,3x,e12.6)
3092      close(12)
3093 
3094      return 
3095      end subroutine read_rtmip
3096!=====================================================================
Note: See TracBrowser for help on using the repository browser.