!====================================================================== SUBROUTINE read_togacoare(fich_toga,nlev_toga,nt_toga & & ,ts_toga,plev_toga,t_toga,q_toga,u_toga,v_toga,w_toga & & ,ht_toga,vt_toga,hq_toga,vq_toga) implicit none !------------------------------------------------------------------------- ! Read TOGA-COARE forcing data !------------------------------------------------------------------------- integer nlev_toga,nt_toga real ts_toga(nt_toga),plev_toga(nlev_toga,nt_toga) real t_toga(nlev_toga,nt_toga),q_toga(nlev_toga,nt_toga) real u_toga(nlev_toga,nt_toga),v_toga(nlev_toga,nt_toga) real w_toga(nlev_toga,nt_toga) real ht_toga(nlev_toga,nt_toga),vt_toga(nlev_toga,nt_toga) real hq_toga(nlev_toga,nt_toga),vq_toga(nlev_toga,nt_toga) character*80 fich_toga integer k,ip real bid integer iy,im,id,ih real plev_min plev_min = 55. ! pas de tendance de vap. d eau au-dessus de 55 hPa open(21,file=trim(fich_toga),form='formatted') read(21,'(a)') do ip = 1, nt_toga read(21,'(a)') read(21,'(a)') read(21,223) iy, im, id, ih, bid, ts_toga(ip), bid,bid,bid,bid read(21,'(a)') read(21,'(a)') do k = 1, nlev_toga read(21,230) plev_toga(k,ip), t_toga(k,ip), q_toga(k,ip) & & ,u_toga(k,ip), v_toga(k,ip), w_toga(k,ip) & & ,ht_toga(k,ip), vt_toga(k,ip), hq_toga(k,ip), vq_toga(k,ip) ! conversion in SI units: t_toga(k,ip)=t_toga(k,ip)+273.15 ! K q_toga(k,ip)=q_toga(k,ip)*0.001 ! kg/kg w_toga(k,ip)=w_toga(k,ip)*100./3600. ! Pa/s ! no water vapour tendency above 55 hPa if (plev_toga(k,ip) .lt. plev_min) then q_toga(k,ip) = 0. hq_toga(k,ip) = 0. vq_toga(k,ip) =0. endif enddo ts_toga(ip)=ts_toga(ip)+273.15 ! K enddo close(21) 223 format(4i3,6f8.2) 230 format(6f9.3,4e11.3) return end !------------------------------------------------------------------------- SUBROUTINE read_sandu(fich_sandu,nlev_sandu,nt_sandu,ts_sandu) implicit none !------------------------------------------------------------------------- ! Read I.SANDU case forcing data !------------------------------------------------------------------------- integer nlev_sandu,nt_sandu real ts_sandu(nt_sandu) character*80 fich_sandu integer ip integer iy,im,id,ih real plev_min print*,'nlev_sandu',nlev_sandu plev_min = 55000. ! pas de tendance de vap. d eau au-dessus de 55 hPa open(21,file=trim(fich_sandu),form='formatted') read(21,'(a)') do ip = 1, nt_sandu read(21,'(a)') read(21,'(a)') read(21,223) iy, im, id, ih, ts_sandu(ip) print *,'ts=',iy,im,id,ih,ip,ts_sandu(ip) enddo close(21) 223 format(4i3,f8.2) return end !===================================================================== !------------------------------------------------------------------------- SUBROUTINE read_astex(fich_astex,nlev_astex,nt_astex,div_astex, & & ts_astex,ug_astex,vg_astex,ufa_astex,vfa_astex) implicit none !------------------------------------------------------------------------- ! Read Astex case forcing data !------------------------------------------------------------------------- integer nlev_astex,nt_astex real div_astex(nt_astex),ts_astex(nt_astex),ug_astex(nt_astex) real vg_astex(nt_astex),ufa_astex(nt_astex),vfa_astex(nt_astex) character*80 fich_astex integer ip integer iy,im,id,ih real plev_min print*,'nlev_astex',nlev_astex plev_min = 55000. ! pas de tendance de vap. d eau au-dessus de 55 hPa open(21,file=trim(fich_astex),form='formatted') read(21,'(a)') read(21,'(a)') do ip = 1, nt_astex read(21,'(a)') read(21,'(a)') read(21,223) iy, im, id, ih, div_astex(ip),ts_astex(ip), & &ug_astex(ip),vg_astex(ip),ufa_astex(ip),vfa_astex(ip) ts_astex(ip)=ts_astex(ip)+273.15 print *,'ts=',iy,im,id,ih,ip,div_astex(ip),ts_astex(ip), & &ug_astex(ip),vg_astex(ip),ufa_astex(ip),vg_astex(ip) enddo close(21) 223 format(4i3,e13.2,f7.2,f7.3,f7.2,f7.3,f7.2) return end !===================================================================== subroutine read_twpice(fich_twpice,nlevel,ntime & & ,T_srf,plev,T,q,u,v,omega & & ,T_adv_h,T_adv_v,q_adv_h,q_adv_v) !program reading forcings of the TWP-ICE experiment ! use netcdf implicit none #include "netcdf.inc" integer ntime,nlevel integer l,k character*80 :: fich_twpice real*8 time(ntime) real*8 lat, lon, alt, phis real*8 lev(nlevel) real*8 plev(nlevel,ntime) real*8 T(nlevel,ntime) real*8 q(nlevel,ntime),u(nlevel,ntime) real*8 v(nlevel,ntime) real*8 omega(nlevel,ntime), div(nlevel,ntime) real*8 T_adv_h(nlevel,ntime) real*8 T_adv_v(nlevel,ntime), q_adv_h(nlevel,ntime) real*8 q_adv_v(nlevel,ntime) real*8 s(nlevel,ntime), s_adv_h(nlevel,ntime) real*8 s_adv_v(nlevel,ntime) real*8 p_srf_aver(ntime), p_srf_center(ntime) real*8 T_srf(ntime) integer nid, ierr integer nbvar3d parameter(nbvar3d=20) integer var3didin(nbvar3d) ierr = NF_OPEN(fich_twpice,NF_NOWRITE,nid) if (ierr.NE.NF_NOERR) then write(*,*) 'ERROR: Pb opening forcings cdf file ' write(*,*) NF_STRERROR(ierr) stop "" endif ierr=NF_INQ_VARID(nid,"lat",var3didin(1)) if(ierr/=NF_NOERR) then write(*,*) NF_STRERROR(ierr) stop 'lat' endif ierr=NF_INQ_VARID(nid,"lon",var3didin(2)) if(ierr/=NF_NOERR) then write(*,*) NF_STRERROR(ierr) stop 'lon' endif ierr=NF_INQ_VARID(nid,"alt",var3didin(3)) if(ierr/=NF_NOERR) then write(*,*) NF_STRERROR(ierr) stop 'alt' endif ierr=NF_INQ_VARID(nid,"phis",var3didin(4)) if(ierr/=NF_NOERR) then write(*,*) NF_STRERROR(ierr) stop 'phis' endif ierr=NF_INQ_VARID(nid,"T",var3didin(5)) if(ierr/=NF_NOERR) then write(*,*) NF_STRERROR(ierr) stop 'T' endif ierr=NF_INQ_VARID(nid,"q",var3didin(6)) if(ierr/=NF_NOERR) then write(*,*) NF_STRERROR(ierr) stop 'q' endif ierr=NF_INQ_VARID(nid,"u",var3didin(7)) if(ierr/=NF_NOERR) then write(*,*) NF_STRERROR(ierr) stop 'u' endif ierr=NF_INQ_VARID(nid,"v",var3didin(8)) if(ierr/=NF_NOERR) then write(*,*) NF_STRERROR(ierr) stop 'v' endif ierr=NF_INQ_VARID(nid,"omega",var3didin(9)) if(ierr/=NF_NOERR) then write(*,*) NF_STRERROR(ierr) stop 'omega' endif ierr=NF_INQ_VARID(nid,"div",var3didin(10)) if(ierr/=NF_NOERR) then write(*,*) NF_STRERROR(ierr) stop 'div' endif ierr=NF_INQ_VARID(nid,"T_adv_h",var3didin(11)) if(ierr/=NF_NOERR) then write(*,*) NF_STRERROR(ierr) stop 'T_adv_h' endif ierr=NF_INQ_VARID(nid,"T_adv_v",var3didin(12)) if(ierr/=NF_NOERR) then write(*,*) NF_STRERROR(ierr) stop 'T_adv_v' endif ierr=NF_INQ_VARID(nid,"q_adv_h",var3didin(13)) if(ierr/=NF_NOERR) then write(*,*) NF_STRERROR(ierr) stop 'q_adv_h' endif ierr=NF_INQ_VARID(nid,"q_adv_v",var3didin(14)) if(ierr/=NF_NOERR) then write(*,*) NF_STRERROR(ierr) stop 'q_adv_v' endif ierr=NF_INQ_VARID(nid,"s",var3didin(15)) if(ierr/=NF_NOERR) then write(*,*) NF_STRERROR(ierr) stop 's' endif ierr=NF_INQ_VARID(nid,"s_adv_h",var3didin(16)) if(ierr/=NF_NOERR) then write(*,*) NF_STRERROR(ierr) stop 's_adv_h' endif ierr=NF_INQ_VARID(nid,"s_adv_v",var3didin(17)) if(ierr/=NF_NOERR) then write(*,*) NF_STRERROR(ierr) stop 's_adv_v' endif ierr=NF_INQ_VARID(nid,"p_srf_aver",var3didin(18)) if(ierr/=NF_NOERR) then write(*,*) NF_STRERROR(ierr) stop 'p_srf_aver' endif ierr=NF_INQ_VARID(nid,"p_srf_center",var3didin(19)) if(ierr/=NF_NOERR) then write(*,*) NF_STRERROR(ierr) stop 'p_srf_center' endif ierr=NF_INQ_VARID(nid,"T_srf",var3didin(20)) if(ierr/=NF_NOERR) then write(*,*) NF_STRERROR(ierr) stop 'T_srf' endif !dimensions lecture call catchaxis(nid,ntime,nlevel,time,lev,ierr) !pressure do l=1,ntime do k=1,nlevel plev(k,l)=lev(k) enddo enddo #ifdef NC_DOUBLE ierr = NF_GET_VAR_DOUBLE(nid,var3didin(1),lat) #else ierr = NF_GET_VAR_REAL(nid,var3didin(1),lat) #endif if(ierr/=NF_NOERR) then write(*,*) NF_STRERROR(ierr) stop "getvarup" endif ! write(*,*)'lecture lat ok',lat #ifdef NC_DOUBLE ierr = NF_GET_VAR_DOUBLE(nid,var3didin(2),lon) #else ierr = NF_GET_VAR_REAL(nid,var3didin(2),lon) #endif if(ierr/=NF_NOERR) then write(*,*) NF_STRERROR(ierr) stop "getvarup" endif ! write(*,*)'lecture lon ok',lon #ifdef NC_DOUBLE ierr = NF_GET_VAR_DOUBLE(nid,var3didin(3),alt) #else ierr = NF_GET_VAR_REAL(nid,var3didin(3),alt) #endif if(ierr/=NF_NOERR) then write(*,*) NF_STRERROR(ierr) stop "getvarup" endif ! write(*,*)'lecture alt ok',alt #ifdef NC_DOUBLE ierr = NF_GET_VAR_DOUBLE(nid,var3didin(4),phis) #else ierr = NF_GET_VAR_REAL(nid,var3didin(4),phis) #endif if(ierr/=NF_NOERR) then write(*,*) NF_STRERROR(ierr) stop "getvarup" endif ! write(*,*)'lecture phis ok',phis #ifdef NC_DOUBLE ierr = NF_GET_VAR_DOUBLE(nid,var3didin(5),T) #else ierr = NF_GET_VAR_REAL(nid,var3didin(5),T) #endif if(ierr/=NF_NOERR) then write(*,*) NF_STRERROR(ierr) stop "getvarup" endif ! write(*,*)'lecture T ok' #ifdef NC_DOUBLE ierr = NF_GET_VAR_DOUBLE(nid,var3didin(6),q) #else ierr = NF_GET_VAR_REAL(nid,var3didin(6),q) #endif if(ierr/=NF_NOERR) then write(*,*) NF_STRERROR(ierr) stop "getvarup" endif ! write(*,*)'lecture q ok' !q in kg/kg do l=1,ntime do k=1,nlevel q(k,l)=q(k,l)/1000. enddo enddo #ifdef NC_DOUBLE ierr = NF_GET_VAR_DOUBLE(nid,var3didin(7),u) #else ierr = NF_GET_VAR_REAL(nid,var3didin(7),u) #endif if(ierr/=NF_NOERR) then write(*,*) NF_STRERROR(ierr) stop "getvarup" endif ! write(*,*)'lecture u ok' #ifdef NC_DOUBLE ierr = NF_GET_VAR_DOUBLE(nid,var3didin(8),v) #else ierr = NF_GET_VAR_REAL(nid,var3didin(8),v) #endif if(ierr/=NF_NOERR) then write(*,*) NF_STRERROR(ierr) stop "getvarup" endif ! write(*,*)'lecture v ok' #ifdef NC_DOUBLE ierr = NF_GET_VAR_DOUBLE(nid,var3didin(9),omega) #else ierr = NF_GET_VAR_REAL(nid,var3didin(9),omega) #endif if(ierr/=NF_NOERR) then write(*,*) NF_STRERROR(ierr) stop "getvarup" endif ! write(*,*)'lecture omega ok' !omega in mb/hour do l=1,ntime do k=1,nlevel omega(k,l)=omega(k,l)*100./3600. enddo enddo #ifdef NC_DOUBLE ierr = NF_GET_VAR_DOUBLE(nid,var3didin(10),div) #else ierr = NF_GET_VAR_REAL(nid,var3didin(10),div) #endif if(ierr/=NF_NOERR) then write(*,*) NF_STRERROR(ierr) stop "getvarup" endif ! write(*,*)'lecture div ok' #ifdef NC_DOUBLE ierr = NF_GET_VAR_DOUBLE(nid,var3didin(11),T_adv_h) #else ierr = NF_GET_VAR_REAL(nid,var3didin(11),T_adv_h) #endif if(ierr/=NF_NOERR) then write(*,*) NF_STRERROR(ierr) stop "getvarup" endif ! write(*,*)'lecture T_adv_h ok' !T adv in K/s do l=1,ntime do k=1,nlevel T_adv_h(k,l)=T_adv_h(k,l)/3600. enddo enddo #ifdef NC_DOUBLE ierr = NF_GET_VAR_DOUBLE(nid,var3didin(12),T_adv_v) #else ierr = NF_GET_VAR_REAL(nid,var3didin(12),T_adv_v) #endif if(ierr/=NF_NOERR) then write(*,*) NF_STRERROR(ierr) stop "getvarup" endif ! write(*,*)'lecture T_adv_v ok' !T adv in K/s do l=1,ntime do k=1,nlevel T_adv_v(k,l)=T_adv_v(k,l)/3600. enddo enddo #ifdef NC_DOUBLE ierr = NF_GET_VAR_DOUBLE(nid,var3didin(13),q_adv_h) #else ierr = NF_GET_VAR_REAL(nid,var3didin(13),q_adv_h) #endif if(ierr/=NF_NOERR) then write(*,*) NF_STRERROR(ierr) stop "getvarup" endif ! write(*,*)'lecture q_adv_h ok' !q adv in kg/kg/s do l=1,ntime do k=1,nlevel q_adv_h(k,l)=q_adv_h(k,l)/1000./3600. enddo enddo #ifdef NC_DOUBLE ierr = NF_GET_VAR_DOUBLE(nid,var3didin(14),q_adv_v) #else ierr = NF_GET_VAR_REAL(nid,var3didin(14),q_adv_v) #endif if(ierr/=NF_NOERR) then write(*,*) NF_STRERROR(ierr) stop "getvarup" endif ! write(*,*)'lecture q_adv_v ok' !q adv in kg/kg/s do l=1,ntime do k=1,nlevel q_adv_v(k,l)=q_adv_v(k,l)/1000./3600. enddo enddo #ifdef NC_DOUBLE ierr = NF_GET_VAR_DOUBLE(nid,var3didin(15),s) #else ierr = NF_GET_VAR_REAL(nid,var3didin(15),s) #endif if(ierr/=NF_NOERR) then write(*,*) NF_STRERROR(ierr) stop "getvarup" endif #ifdef NC_DOUBLE ierr = NF_GET_VAR_DOUBLE(nid,var3didin(16),s_adv_h) #else ierr = NF_GET_VAR_REAL(nid,var3didin(16),s_adv_h) #endif if(ierr/=NF_NOERR) then write(*,*) NF_STRERROR(ierr) stop "getvarup" endif #ifdef NC_DOUBLE ierr = NF_GET_VAR_DOUBLE(nid,var3didin(17),s_adv_v) #else ierr = NF_GET_VAR_REAL(nid,var3didin(17),s_adv_v) #endif if(ierr/=NF_NOERR) then write(*,*) NF_STRERROR(ierr) stop "getvarup" endif #ifdef NC_DOUBLE ierr = NF_GET_VAR_DOUBLE(nid,var3didin(18),p_srf_aver) #else ierr = NF_GET_VAR_REAL(nid,var3didin(18),p_srf_aver) #endif if(ierr/=NF_NOERR) then write(*,*) NF_STRERROR(ierr) stop "getvarup" endif #ifdef NC_DOUBLE ierr = NF_GET_VAR_DOUBLE(nid,var3didin(19),p_srf_center) #else ierr = NF_GET_VAR_REAL(nid,var3didin(19),p_srf_center) #endif if(ierr/=NF_NOERR) then write(*,*) NF_STRERROR(ierr) stop "getvarup" endif #ifdef NC_DOUBLE ierr = NF_GET_VAR_DOUBLE(nid,var3didin(20),T_srf) #else ierr = NF_GET_VAR_REAL(nid,var3didin(20),T_srf) #endif if(ierr/=NF_NOERR) then write(*,*) NF_STRERROR(ierr) stop "getvarup" endif ! write(*,*)'lecture T_srf ok', T_srf return end subroutine read_twpice !===================================================================== subroutine catchaxis(nid,ttm,llm,time,lev,ierr) ! use netcdf implicit none #include "netcdf.inc" integer nid,ttm,llm real*8 time(ttm) real*8 lev(llm) integer ierr integer timevar,levvar integer timelen,levlen integer timedimin,levdimin ! Control & lecture on dimensions ! =============================== ierr=NF_INQ_DIMID(nid,"time",timedimin) ierr=NF_INQ_VARID(nid,"time",timevar) if (ierr.NE.NF_NOERR) then write(*,*) 'ERROR: Field