2936 print*,'TOGA-COARE a débuté le 1er Nov 1992 (jour julien=306)'
print*,'Changer dayref dans run.def'
stop
endif
if (annee_ref.eq.1993 .and. day1.gt.day_ini_toga+119) then
print*,'TOGA-COARE a fini le 28 Feb 1993 (jour julien=59)'
print*,'Changer dayref ou nday dans run.def'
stop
endif
else if (forcing_type.eq.4) then
! Check that initial day of the simulation consistent with TWP-ICE period:
if (annee_ref.ne.2006) then
print*,'Pour TWP-ICE, annee_ref doit etre 2006'
print*,'Changer annee_ref dans run.def'
stop
endif
if (annee_ref.eq.2006 .and. day1.lt.day_ini_toga) then
print*,'TWP-ICE a debute le 17 Jan 2006 (jour julien=17)'
print*,'Changer dayref dans run.def'
stop
endif
if (annee_ref.eq.2006 .and. day1.gt.day_ini_toga+26) then
print*,'TWP-ICE a fini le 12 Feb 2006 (jour julien=43)'
print*,'Changer dayref ou nday dans run.def'
stop
endif
endif
! Determine timestep relative to the 1st day of TOGA-COARE:
! timeit=(day-day1)*86400.
! if (annee_ref.eq.1992) then
! timeit=(day-day_ini_toga)*86400.
! else
! timeit=(day+61.-1.)*86400. ! 61 days between Nov01 and Dec31 1992
! endif
timeit=(day-day_ini_toga)*86400
! Determine the closest observation times:
it_toga1=INT(timeit/dt_toga)+1
it_toga2=it_toga1 + 1
time_toga1=(it_toga1-1)*dt_toga
time_toga2=(it_toga2-1)*dt_toga
if (it_toga1 .ge. nt_toga) then
write(*,*) 'PB-stop: day, it_toga1, it_toga2, timeit: ' &
& ,day,it_toga1,it_toga2,timeit/86400.
stop
endif
! time interpolation:
frac=(time_toga2-timeit)/(time_toga2-time_toga1)
frac=max(frac,0.0)
ts_prof = ts_toga(it_toga2) &
& -frac*(ts_toga(it_toga2)-ts_toga(it_toga1))
! print*,
! :'day,annee_ref,day_ini_toga,timeit,it_toga1,it_toga2,SST:',
! :day,annee_ref,day_ini_toga,timeit/86400.,it_toga1,it_toga2,ts_prof
do k=1,nlev_toga
plev_prof(k) = 100.*(plev_toga(k,it_toga2) &
& -frac*(plev_toga(k,it_toga2)-plev_toga(k,it_toga1)))
t_prof(k) = t_toga(k,it_toga2) &
& -frac*(t_toga(k,it_toga2)-t_toga(k,it_toga1))
q_prof(k) = q_toga(k,it_toga2) &
& -frac*(q_toga(k,it_toga2)-q_toga(k,it_toga1))
u_prof(k) = u_toga(k,it_toga2) &
& -frac*(u_toga(k,it_toga2)-u_toga(k,it_toga1))
v_prof(k) = v_toga(k,it_toga2) &
& -frac*(v_toga(k,it_toga2)-v_toga(k,it_toga1))
w_prof(k) = w_toga(k,it_toga2) &
& -frac*(w_toga(k,it_toga2)-w_toga(k,it_toga1))
ht_prof(k) = ht_toga(k,it_toga2) &
& -frac*(ht_toga(k,it_toga2)-ht_toga(k,it_toga1))
vt_prof(k) = vt_toga(k,it_toga2) &
& -frac*(vt_toga(k,it_toga2)-vt_toga(k,it_toga1))
hq_prof(k) = hq_toga(k,it_toga2) &
& -frac*(hq_toga(k,it_toga2)-hq_toga(k,it_toga1))
vq_prof(k) = vq_toga(k,it_toga2) &
& -frac*(vq_toga(k,it_toga2)-vq_toga(k,it_toga1))
enddo
return
END
!======================================================================
SUBROUTINE interp_dice_time(day,day1,annee_ref &
& ,year_ini_dice,day_ini_dice,nt_dice,dt_dice &
& ,nlev_dice,shf_dice,lhf_dice,lwup_dice,swup_dice &
& ,tg_dice,ustar_dice,psurf_dice,ug_dice,vg_dice &
& ,ht_dice,hq_dice,hu_dice,hv_dice,w_dice,omega_dice &
& ,shf_prof,lhf_prof,lwup_prof,swup_prof,tg_prof &
& ,ustar_prof,psurf_prof,ug_prof,vg_prof &
& ,ht_prof,hq_prof,hu_prof,hv_prof,w_prof,omega_prof)
implicit none
!---------------------------------------------------------------------------------------
! Time interpolation of a 2D field to the timestep corresponding to day
!
! day: current julian day (e.g. 717538.2)
! day1: first day of the simulation
! nt_dice: total nb of data in the forcing (e.g. 145 for Dice)
! dt_dice: total time interval (in sec) between 2 forcing data (e.g. 30min. for Dice)
!---------------------------------------------------------------------------------------
#include "compar1d.h"
! inputs:
integer annee_ref
integer nt_dice,nlev_dice
integer year_ini_dice
real day, day1,day_ini_dice,dt_dice
real shf_dice(nt_dice),lhf_dice(nt_dice),lwup_dice(nt_dice)
real swup_dice(nt_dice),tg_dice(nt_dice),ustar_dice(nt_dice)
real psurf_dice(nt_dice),ug_dice(nt_dice),vg_dice(nt_dice)
real ht_dice(nlev_dice,nt_dice),hq_dice(nlev_dice,nt_dice)
real hu_dice(nlev_dice,nt_dice),hv_dice(nlev_dice,nt_dice)
real w_dice(nlev_dice,nt_dice),omega_dice(nlev_dice,nt_dice)
! outputs:
real tg_prof,shf_prof,lhf_prof,lwup_prof,swup_prof
real ustar_prof,psurf_prof,ug_prof,vg_prof
real ht_prof(nlev_dice),hq_prof(nlev_dice)
real hu_prof(nlev_dice),hv_prof(nlev_dice)
real w_prof(nlev_dice),omega_prof(nlev_dice)
! local:
integer it_dice1, it_dice2,k
real timeit,time_dice1,time_dice2,frac
if (forcing_type.eq.7) then
! Check that initial day of the simulation consistent with Dice period:
print *,'annee_ref=',annee_ref
print *,'day1=',day1
print *,'day_ini_dice=',day_ini_dice
if (annee_ref.ne.1999) then
print*,'Pour Dice, annee_ref doit etre 1999'
print*,'Changer annee_ref dans run.def'
stop
endif
if (annee_ref.eq.1999 .and. day1.gt.day_ini_dice) then
print*,'Dice a debute le 23 Oct 1999 (jour julien=296)'
print*,'Changer dayref dans run.def',day1,day_ini_dice
stop
endif
if (annee_ref.eq.1999 .and. day1.gt.day_ini_dice+2) then
print*,'Dice a fini le 25 Oct 1999 (jour julien=298)'
print*,'Changer dayref ou nday dans run.def',day1,day_ini_dice
stop
endif
endif
! Determine timestep relative to the 1st day of TOGA-COARE:
! timeit=(day-day1)*86400.
! if (annee_ref.eq.1992) then
! timeit=(day-day_ini_dice)*86400.
! else
! timeit=(day+61.-1.)*86400. ! 61 days between Nov01 and Dec31 1992
! endif
timeit=(day-day_ini_dice)*86400
! Determine the closest observation times:
it_dice1=INT(timeit/dt_dice)+1
it_dice2=it_dice1 + 1
time_dice1=(it_dice1-1)*dt_dice
time_dice2=(it_dice2-1)*dt_dice
if (it_dice1 .ge. nt_dice) then
write(*,*) 'PB-stop: day, it_dice1, it_dice2, timeit: ',day,it_dice1,it_dice2,timeit/86400.
stop
endif
! time interpolation:
frac=(time_dice2-timeit)/(time_dice2-time_dice1)
frac=max(frac,0.0)
shf_prof = shf_dice(it_dice2)-frac*(shf_dice(it_dice2)-shf_dice(it_dice1))
lhf_prof = lhf_dice(it_dice2)-frac*(lhf_dice(it_dice2)-lhf_dice(it_dice1))
lwup_prof = lwup_dice(it_dice2)-frac*(lwup_dice(it_dice2)-lwup_dice(it_dice1))
swup_prof = swup_dice(it_dice2)-frac*(swup_dice(it_dice2)-swup_dice(it_dice1))
tg_prof = tg_dice(it_dice2)-frac*(tg_dice(it_dice2)-tg_dice(it_dice1))
ustar_prof = ustar_dice(it_dice2)-frac*(ustar_dice(it_dice2)-ustar_dice(it_dice1))
psurf_prof = psurf_dice(it_dice2)-frac*(psurf_dice(it_dice2)-psurf_dice(it_dice1))
ug_prof = ug_dice(it_dice2)-frac*(ug_dice(it_dice2)-ug_dice(it_dice1))
vg_prof = vg_dice(it_dice2)-frac*(vg_dice(it_dice2)-vg_dice(it_dice1))
! print*,
! :'day,annee_ref,day_ini_dice,timeit,it_dice1,it_dice2,SST:',
! :day,annee_ref,day_ini_dice,timeit/86400.,it_dice1,it_dice2,ts_prof
do k=1,nlev_dice
ht_prof(k) = ht_dice(k,it_dice2)-frac*(ht_dice(k,it_dice2)-ht_dice(k,it_dice1))
hq_prof(k) = hq_dice(k,it_dice2)-frac*(hq_dice(k,it_dice2)-hq_dice(k,it_dice1))
hu_prof(k) = hu_dice(k,it_dice2)-frac*(hu_dice(k,it_dice2)-hu_dice(k,it_dice1))
hv_prof(k) = hv_dice(k,it_dice2)-frac*(hv_dice(k,it_dice2)-hv_dice(k,it_dice1))
w_prof(k) = w_dice(k,it_dice2)-frac*(w_dice(k,it_dice2)-w_dice(k,it_dice1))
omega_prof(k) = omega_dice(k,it_dice2)-frac*(omega_dice(k,it_dice2)-omega_dice(k,it_dice1))
enddo
return
END
!======================================================================
SUBROUTINE interp_armcu_time(day,day1,annee_ref &
& ,year_ini_armcu,day_ini_armcu,nt_armcu,dt_armcu &
& ,nlev_armcu,fs_armcu,fl_armcu,at_armcu,rt_armcu &
& ,aqt_armcu,fs_prof,fl_prof,at_prof,rt_prof,aqt_prof)
implicit none
!---------------------------------------------------------------------------------------
! Time interpolation of a 2D field to the timestep corresponding to day
!
! day: current julian day (e.g. 717538.2)
! day1: first day of the simulation
! nt_armcu: total nb of data in the forcing (e.g. 31 for armcu)
! dt_armcu: total time interval (in sec) between 2 forcing data (e.g. 1/2h for armcu)
! fs= sensible flux
! fl= latent flux
! at,rt,aqt= advective and radiative tendencies
!---------------------------------------------------------------------------------------
! inputs:
integer annee_ref
integer nt_armcu,nlev_armcu
integer year_ini_armcu
real day, day1,day_ini_armcu,dt_armcu
real fs_armcu(nt_armcu),fl_armcu(nt_armcu),at_armcu(nt_armcu)
real rt_armcu(nt_armcu),aqt_armcu(nt_armcu)
! outputs:
real fs_prof,fl_prof,at_prof,rt_prof,aqt_prof
! local:
integer it_armcu1, it_armcu2,k
real timeit,time_armcu1,time_armcu2,frac
! Check that initial day of the simulation consistent with ARMCU period:
if (annee_ref.ne.1997 ) then
print*,'Pour ARMCU, annee_ref doit etre 1997 '
print*,'Changer annee_ref dans run.def'
stop
endif
timeit=(day-day_ini_armcu)*86400
! Determine the closest observation times:
it_armcu1=INT(timeit/dt_armcu)+1
it_armcu2=it_armcu1 + 1
time_armcu1=(it_armcu1-1)*dt_armcu
time_armcu2=(it_armcu2-1)*dt_armcu
print *,'timeit day day_ini_armcu',timeit,day,day_ini_armcu
print *,'it_armcu1,it_armcu2,time_armcu1,time_armcu2', &
& it_armcu1,it_armcu2,time_armcu1,time_armcu2
if (it_armcu1 .ge. nt_armcu) then
write(*,*) 'PB-stop: day, it_armcu1, it_armcu2, timeit: ' &
& ,day,it_armcu1,it_armcu2,timeit/86400.
stop
endif
! time interpolation:
frac=(time_armcu2-timeit)/(time_armcu2-time_armcu1)
frac=max(frac,0.0)
fs_prof = fs_armcu(it_armcu2) &
& -frac*(fs_armcu(it_armcu2)-fs_armcu(it_armcu1))
fl_prof = fl_armcu(it_armcu2) &
& -frac*(fl_armcu(it_armcu2)-fl_armcu(it_armcu1))
at_prof = at_armcu(it_armcu2) &
& -frac*(at_armcu(it_armcu2)-at_armcu(it_armcu1))
rt_prof = rt_armcu(it_armcu2) &
& -frac*(rt_armcu(it_armcu2)-rt_armcu(it_armcu1))
aqt_prof = aqt_armcu(it_armcu2) &
& -frac*(aqt_armcu(it_armcu2)-aqt_armcu(it_armcu1))
print*, &
&'day,annee_ref,day_ini_armcu,timeit,it_armcu1,it_armcu2,SST:', &
&day,annee_ref,day_ini_armcu,timeit/86400.,it_armcu1, &
&it_armcu2,fs_prof,fl_prof,at_prof,rt_prof,aqt_prof
return
END
!=====================================================================
subroutine readprofiles(nlev_max,kmax,ntrac,height, &
& thlprof,qtprof,uprof, &
& vprof,e12prof,ugprof,vgprof, &
& wfls,dqtdxls,dqtdyls,dqtdtls, &
& thlpcar,tracer,nt1,nt2)
implicit none
integer nlev_max,kmax,kmax2,ntrac
logical :: llesread = .true.
real height(nlev_max),thlprof(nlev_max),qtprof(nlev_max), &
& uprof(nlev_max),vprof(nlev_max),e12prof(nlev_max), &
& ugprof(nlev_max),vgprof(nlev_max),wfls(nlev_max), &
& dqtdxls(nlev_max),dqtdyls(nlev_max),dqtdtls(nlev_max), &
& thlpcar(nlev_max),tracer(nlev_max,ntrac)
integer, parameter :: ilesfile=1
integer :: ierr,k,itrac,nt1,nt2
if(.not.(llesread)) return
open (ilesfile,file='prof.inp.001',status='old',iostat=ierr)
if (ierr /= 0) stop 'ERROR:Prof.inp does not exist'
read (ilesfile,*) kmax
do k=1,kmax
read (ilesfile,*) height(k),thlprof(k),qtprof (k), &
& uprof (k),vprof (k),e12prof(k)
enddo
close(ilesfile)
open(ilesfile,file='lscale.inp.001',status='old',iostat=ierr)
if (ierr /= 0) stop 'ERROR:Lscale.inp does not exist'
read (ilesfile,*) kmax2
if (kmax .ne. kmax2) then
print *, 'fichiers prof.inp et lscale.inp incompatibles :'
print *, 'nbre de niveaux : ',kmax,' et ',kmax2
stop 'lecture profiles'
endif
do k=1,kmax
read (ilesfile,*) height(k),ugprof(k),vgprof(k),wfls(k), &
& dqtdxls(k),dqtdyls(k),dqtdtls(k),thlpcar(k)
end do
close(ilesfile)
open(ilesfile,file='trac.inp.001',status='old',iostat=ierr)
if (ierr /= 0) then
print*,'WARNING : trac.inp does not exist'
else
read (ilesfile,*) kmax2,nt1,nt2
if (nt2>ntrac) then
stop'Augmenter le nombre de traceurs dans traceur.def'
endif
if (kmax .ne. kmax2) then
print *, 'fichiers prof.inp et lscale.inp incompatibles :'
print *, 'nbre de niveaux : ',kmax,' et ',kmax2
stop 'lecture profiles'
endif
do k=1,kmax
read (ilesfile,*) height(k),(tracer(k,itrac),itrac=nt1,nt2)
end do
close(ilesfile)
endif
return
end
!======================================================================
subroutine readprofile_sandu(nlev_max,kmax,height,pprof,tprof, &
& thlprof,qprof,uprof,vprof,wprof,omega,o3mmr)
!======================================================================
implicit none
integer nlev_max,kmax
logical :: llesread = .true.
real height(nlev_max),pprof(nlev_max),tprof(nlev_max)
real thlprof(nlev_max)
real qprof(nlev_max),uprof(nlev_max),vprof(nlev_max)
real wprof(nlev_max),omega(nlev_max),o3mmr(nlev_max)
integer, parameter :: ilesfile=1
integer :: k,ierr
if(.not.(llesread)) return
open (ilesfile,file='prof.inp.001',status='old',iostat=ierr)
if (ierr /= 0) stop 'ERROR:Prof.inp does not exist'
read (ilesfile,*) kmax
do k=1,kmax
read (ilesfile,*) height(k),pprof(k), tprof(k),thlprof(k), &
& qprof (k),uprof(k), vprof(k), wprof(k), &
& omega (k),o3mmr(k)
enddo
close(ilesfile)
return
end
!======================================================================
subroutine readprofile_astex(nlev_max,kmax,height,pprof,tprof, &
& thlprof,qvprof,qlprof,qtprof,uprof,vprof,wprof,tkeprof,o3mmr)
!======================================================================
implicit none
integer nlev_max,kmax
logical :: llesread = .true.
real height(nlev_max),pprof(nlev_max),tprof(nlev_max), &
& thlprof(nlev_max),qlprof(nlev_max),qtprof(nlev_max), &
& qvprof(nlev_max),uprof(nlev_max),vprof(nlev_max), &
& wprof(nlev_max),tkeprof(nlev_max),o3mmr(nlev_max)
integer, parameter :: ilesfile=1
integer :: ierr,k
if(.not.(llesread)) return
open (ilesfile,file='prof.inp.001',status='old',iostat=ierr)
if (ierr /= 0) stop 'ERROR:Prof.inp does not exist'
read (ilesfile,*) kmax
do k=1,kmax
read (ilesfile,*) height(k),pprof(k), tprof(k),thlprof(k), &
& qvprof (k),qlprof (k),qtprof (k), &
& uprof(k), vprof(k), wprof(k),tkeprof(k),o3mmr(k)
enddo
close(ilesfile)
return
end
!======================================================================
subroutine readprofile_armcu(nlev_max,kmax,height,pprof,uprof, &
& vprof,thetaprof,tprof,qvprof,rvprof,aprof,bprof)
!======================================================================
implicit none
integer nlev_max,kmax
logical :: llesread = .true.
real height(nlev_max),pprof(nlev_max),tprof(nlev_max)
real thetaprof(nlev_max),rvprof(nlev_max)
real qvprof(nlev_max),uprof(nlev_max),vprof(nlev_max)
real aprof(nlev_max+1),bprof(nlev_max+1)
integer, parameter :: ilesfile=1
integer, parameter :: ifile=2
integer :: ierr,jtot,k
if(.not.(llesread)) return
! Read profiles at full levels
IF(nlev_max.EQ.19) THEN
open (ilesfile,file='prof.inp.19',status='old',iostat=ierr)
print *,'On ouvre prof.inp.19'
ELSE
open (ilesfile,file='prof.inp.40',status='old',iostat=ierr)
print *,'On ouvre prof.inp.40'
ENDIF
if (ierr /= 0) stop 'ERROR:Prof.inp does not exist'
read (ilesfile,*) kmax
do k=1,kmax
read (ilesfile,*) height(k) ,pprof(k), uprof(k), vprof(k), &
& thetaprof(k) ,tprof(k), qvprof(k),rvprof(k)
enddo
close(ilesfile)
! Vertical coordinates half levels for eta-coordinates (plev = alpha + beta * psurf)
IF(nlev_max.EQ.19) THEN
open (ifile,file='proh.inp.19',status='old',iostat=ierr)
print *,'On ouvre proh.inp.19'
if (ierr /= 0) stop 'ERROR:Proh.inp.19 does not exist'
ELSE
open (ifile,file='proh.inp.40',status='old',iostat=ierr)
print *,'On ouvre proh.inp.40'
if (ierr /= 0) stop 'ERROR:Proh.inp.40 does not exist'
ENDIF
read (ifile,*) kmax
do k=1,kmax
read (ifile,*) jtot,aprof(k),bprof(k)
enddo
close(ifile)
return
end
!=====================================================================
subroutine read_fire(fich_fire,nlevel,ntime &
& ,zz,thl,qt,u,v,tke &
& ,ug,vg,wls,dqtdx,dqtdy,dqtdt,thl_rad)
!program reading forcings of the FIRE case study
implicit none
#include "netcdf.inc"
integer ntime,nlevel
character*80 :: fich_fire
real*8 zz(nlevel)
real*8 thl(nlevel)
real*8 qt(nlevel),u(nlevel)
real*8 v(nlevel),tke(nlevel)
real*8 ug(nlevel,ntime),vg(nlevel,ntime),wls(nlevel,ntime)
real*8 dqtdx(nlevel,ntime),dqtdy(nlevel,ntime)
real*8 dqtdt(nlevel,ntime),thl_rad(nlevel,ntime)
integer nid, ierr
integer nbvar3d
parameter(nbvar3d=30)
integer var3didin(nbvar3d)
ierr = NF_OPEN(fich_fire,NF_NOWRITE,nid)
if (ierr.NE.NF_NOERR) then
write(*,*) 'ERROR: Pb opening forcings nc file '
write(*,*) NF_STRERROR(ierr)
stop ""
endif
ierr=NF_INQ_VARID(nid,"zz",var3didin(1))
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop 'lev'
endif
ierr=NF_INQ_VARID(nid,"thetal",var3didin(2))
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop 'temp'
endif
ierr=NF_INQ_VARID(nid,"qt",var3didin(3))
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop 'qv'
endif
ierr=NF_INQ_VARID(nid,"u",var3didin(4))
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop 'u'
endif
ierr=NF_INQ_VARID(nid,"v",var3didin(5))
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop 'v'
endif
ierr=NF_INQ_VARID(nid,"tke",var3didin(6))
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop 'tke'
endif
ierr=NF_INQ_VARID(nid,"ugeo",var3didin(7))
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop 'ug'
endif
ierr=NF_INQ_VARID(nid,"vgeo",var3didin(8))
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop 'vg'
endif
ierr=NF_INQ_VARID(nid,"wls",var3didin(9))
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop 'wls'
endif
ierr=NF_INQ_VARID(nid,"dqtdx",var3didin(10))
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop 'dqtdx'
endif
ierr=NF_INQ_VARID(nid,"dqtdy",var3didin(11))
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop 'dqtdy'
endif
ierr=NF_INQ_VARID(nid,"dqtdt",var3didin(12))
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop 'dqtdt'
endif
ierr=NF_INQ_VARID(nid,"thl_rad",var3didin(13))
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop 'thl_rad'
endif
!dimensions lecture
! call catchaxis(nid,ntime,nlevel,time,z,ierr)
#ifdef NC_DOUBLE
ierr = NF_GET_VAR_DOUBLE(nid,var3didin(1),zz)
#else
ierr = NF_GET_VAR_REAL(nid,var3didin(1),zz)
#endif
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop "getvarup"
endif
! write(*,*)'lecture z ok',zz
#ifdef NC_DOUBLE
ierr = NF_GET_VAR_DOUBLE(nid,var3didin(2),thl)
#else
ierr = NF_GET_VAR_REAL(nid,var3didin(2),thl)
#endif
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop "getvarup"
endif
! write(*,*)'lecture thl ok',thl
#ifdef NC_DOUBLE
ierr = NF_GET_VAR_DOUBLE(nid,var3didin(3),qt)
#else
ierr = NF_GET_VAR_REAL(nid,var3didin(3),qt)
#endif
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop "getvarup"
endif
! write(*,*)'lecture qt ok',qt
#ifdef NC_DOUBLE
ierr = NF_GET_VAR_DOUBLE(nid,var3didin(4),u)
#else
ierr = NF_GET_VAR_REAL(nid,var3didin(4),u)
#endif
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop "getvarup"
endif
! write(*,*)'lecture u ok',u
#ifdef NC_DOUBLE
ierr = NF_GET_VAR_DOUBLE(nid,var3didin(5),v)
#else
ierr = NF_GET_VAR_REAL(nid,var3didin(5),v)
#endif
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop "getvarup"
endif
! write(*,*)'lecture v ok',v
#ifdef NC_DOUBLE
ierr = NF_GET_VAR_DOUBLE(nid,var3didin(6),tke)
#else
ierr = NF_GET_VAR_REAL(nid,var3didin(6),tke)
#endif
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop "getvarup"
endif
! write(*,*)'lecture tke ok',tke
#ifdef NC_DOUBLE
ierr = NF_GET_VAR_DOUBLE(nid,var3didin(7),ug)
#else
ierr = NF_GET_VAR_REAL(nid,var3didin(7),ug)
#endif
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop "getvarup"
endif
! write(*,*)'lecture ug ok',ug
#ifdef NC_DOUBLE
ierr = NF_GET_VAR_DOUBLE(nid,var3didin(8),vg)
#else
ierr = NF_GET_VAR_REAL(nid,var3didin(8),vg)
#endif
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop "getvarup"
endif
! write(*,*)'lecture vg ok',vg
#ifdef NC_DOUBLE
ierr = NF_GET_VAR_DOUBLE(nid,var3didin(9),wls)
#else
ierr = NF_GET_VAR_REAL(nid,var3didin(9),wls)
#endif
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop "getvarup"
endif
! write(*,*)'lecture wls ok',wls
#ifdef NC_DOUBLE
ierr = NF_GET_VAR_DOUBLE(nid,var3didin(10),dqtdx)
#else
ierr = NF_GET_VAR_REAL(nid,var3didin(10),dqtdx)
#endif
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop "getvarup"
endif
! write(*,*)'lecture dqtdx ok',dqtdx
#ifdef NC_DOUBLE
ierr = NF_GET_VAR_DOUBLE(nid,var3didin(11),dqtdy)
#else
ierr = NF_GET_VAR_REAL(nid,var3didin(11),dqtdy)
#endif
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop "getvarup"
endif
! write(*,*)'lecture dqtdy ok',dqtdy
#ifdef NC_DOUBLE
ierr = NF_GET_VAR_DOUBLE(nid,var3didin(12),dqtdt)
#else
ierr = NF_GET_VAR_REAL(nid,var3didin(12),dqtdt)
#endif
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop "getvarup"
endif
! write(*,*)'lecture dqtdt ok',dqtdt
#ifdef NC_DOUBLE
ierr = NF_GET_VAR_DOUBLE(nid,var3didin(13),thl_rad)
#else
ierr = NF_GET_VAR_REAL(nid,var3didin(13),thl_rad)
#endif
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop "getvarup"
endif
! write(*,*)'lecture thl_rad ok',thl_rad
return
end subroutine read_fire
!=====================================================================
subroutine read_dice(fich_dice,nlevel,ntime &
& ,zz,pres,th,qv,u,v,o3 &
& ,shf,lhf,lwup,swup,tg,ustar,psurf,ug,vg &
& ,hadvt,hadvq,hadvu,hadvv,w,omega)
!program reading initial profils and forcings of the Dice case study
implicit none
#include "netcdf.inc"
integer ntime,nlevel
integer l,k
character*80 :: fich_dice
real*8 time(ntime)
real*8 zz(nlevel)
real*8 th(nlevel),pres(nlevel)
real*8 qv(nlevel),u(nlevel),v(nlevel),o3(nlevel)
real*8 shf(ntime),lhf(ntime),lwup(ntime),swup(ntime),tg(ntime)
real*8 ustar(ntime),psurf(ntime),ug(ntime),vg(ntime)
real*8 hadvt(nlevel,ntime),hadvq(nlevel,ntime),hadvu(nlevel,ntime)
real*8 hadvv(nlevel,ntime),w(nlevel,ntime),omega(nlevel,ntime)
integer nid, ierr
integer nbvar3d
parameter(nbvar3d=30)
integer var3didin(nbvar3d)
ierr = NF_OPEN(fich_dice,NF_NOWRITE,nid)
if (ierr.NE.NF_NOERR) then
write(*,*) 'ERROR: Pb opening forcings nc file '
write(*,*) NF_STRERROR(ierr)
stop ""
endif
ierr=NF_INQ_VARID(nid,"height",var3didin(1))
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop 'height'
endif
ierr=NF_INQ_VARID(nid,"pf",var3didin(11))
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop 'pf'
endif
ierr=NF_INQ_VARID(nid,"theta",var3didin(12))
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop 'theta'
endif
ierr=NF_INQ_VARID(nid,"qv",var3didin(13))
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop 'qv'
endif
ierr=NF_INQ_VARID(nid,"u",var3didin(14))
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop 'u'
endif
ierr=NF_INQ_VARID(nid,"v",var3didin(15))
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop 'v'
endif
ierr=NF_INQ_VARID(nid,"o3mmr",var3didin(16))
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop 'o3'
endif
ierr=NF_INQ_VARID(nid,"shf",var3didin(2))
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop 'shf'
endif
ierr=NF_INQ_VARID(nid,"lhf",var3didin(3))
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop 'lhf'
endif
ierr=NF_INQ_VARID(nid,"lwup",var3didin(4))
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop 'lwup'
endif
ierr=NF_INQ_VARID(nid,"swup",var3didin(5))
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop 'dqtdx'
endif
ierr=NF_INQ_VARID(nid,"Tg",var3didin(6))
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop 'Tg'
endif
ierr=NF_INQ_VARID(nid,"ustar",var3didin(7))
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop 'ustar'
endif
ierr=NF_INQ_VARID(nid,"psurf",var3didin(8))
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop 'psurf'
endif
ierr=NF_INQ_VARID(nid,"Ug",var3didin(9))
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop 'Ug'
endif
ierr=NF_INQ_VARID(nid,"Vg",var3didin(10))
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop 'Vg'
endif
ierr=NF_INQ_VARID(nid,"hadvT",var3didin(17))
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop 'hadvT'
endif
ierr=NF_INQ_VARID(nid,"hadvq",var3didin(18))
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop 'hadvq'
endif
ierr=NF_INQ_VARID(nid,"hadvu",var3didin(19))
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop 'hadvu'
endif
ierr=NF_INQ_VARID(nid,"hadvv",var3didin(20))
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop 'hadvv'
endif
ierr=NF_INQ_VARID(nid,"w",var3didin(21))
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop 'w'
endif
ierr=NF_INQ_VARID(nid,"omega",var3didin(22))
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop 'omega'
endif
!dimensions lecture
! call catchaxis(nid,ntime,nlevel,time,z,ierr)
#ifdef NC_DOUBLE
ierr = NF_GET_VAR_DOUBLE(nid,var3didin(1),zz)
#else
ierr = NF_GET_VAR_REAL(nid,var3didin(1),zz)
#endif
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop "getvarup"
endif
! write(*,*)'lecture zz ok',zz
#ifdef NC_DOUBLE
ierr = NF_GET_VAR_DOUBLE(nid,var3didin(11),pres)
#else
ierr = NF_GET_VAR_REAL(nid,var3didin(11),pres)
#endif
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop "getvarup"
endif
! write(*,*)'lecture pres ok',pres
#ifdef NC_DOUBLE
ierr = NF_GET_VAR_DOUBLE(nid,var3didin(12),th)
#else
ierr = NF_GET_VAR_REAL(nid,var3didin(12),th)
#endif
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop "getvarup"
endif
! write(*,*)'lecture th ok',th
#ifdef NC_DOUBLE
ierr = NF_GET_VAR_DOUBLE(nid,var3didin(13),qv)
#else
ierr = NF_GET_VAR_REAL(nid,var3didin(13),qv)
#endif
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop "getvarup"
endif
! write(*,*)'lecture qv ok',qv
#ifdef NC_DOUBLE
ierr = NF_GET_VAR_DOUBLE(nid,var3didin(14),u)
#else
ierr = NF_GET_VAR_REAL(nid,var3didin(14),u)
#endif
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop "getvarup"
endif
! write(*,*)'lecture u ok',u
#ifdef NC_DOUBLE
ierr = NF_GET_VAR_DOUBLE(nid,var3didin(15),v)
#else
ierr = NF_GET_VAR_REAL(nid,var3didin(15),v)
#endif
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop "getvarup"
endif
! write(*,*)'lecture v ok',v
#ifdef NC_DOUBLE
ierr = NF_GET_VAR_DOUBLE(nid,var3didin(16),o3)
#else
ierr = NF_GET_VAR_REAL(nid,var3didin(16),o3)
#endif
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop "getvarup"
endif
! write(*,*)'lecture o3 ok',o3
#ifdef NC_DOUBLE
ierr = NF_GET_VAR_DOUBLE(nid,var3didin(2),shf)
#else
ierr = NF_GET_VAR_REAL(nid,var3didin(2),shf)
#endif
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop "getvarup"
endif
! write(*,*)'lecture shf ok',shf
#ifdef NC_DOUBLE
ierr = NF_GET_VAR_DOUBLE(nid,var3didin(3),lhf)
#else
ierr = NF_GET_VAR_REAL(nid,var3didin(3),lhf)
#endif
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop "getvarup"
endif
! write(*,*)'lecture lhf ok',lhf
#ifdef NC_DOUBLE
ierr = NF_GET_VAR_DOUBLE(nid,var3didin(4),lwup)
#else
ierr = NF_GET_VAR_REAL(nid,var3didin(4),lwup)
#endif
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop "getvarup"
endif
! write(*,*)'lecture lwup ok',lwup
#ifdef NC_DOUBLE
ierr = NF_GET_VAR_DOUBLE(nid,var3didin(5),swup)
#else
ierr = NF_GET_VAR_REAL(nid,var3didin(5),swup)
#endif
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop "getvarup"
endif
! write(*,*)'lecture swup ok',swup
#ifdef NC_DOUBLE
ierr = NF_GET_VAR_DOUBLE(nid,var3didin(6),tg)
#else
ierr = NF_GET_VAR_REAL(nid,var3didin(6),tg)
#endif
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop "getvarup"
endif
! write(*,*)'lecture tg ok',tg
#ifdef NC_DOUBLE
ierr = NF_GET_VAR_DOUBLE(nid,var3didin(7),ustar)
#else
ierr = NF_GET_VAR_REAL(nid,var3didin(7),ustar)
#endif
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop "getvarup"
endif
! write(*,*)'lecture ustar ok',ustar
#ifdef NC_DOUBLE
ierr = NF_GET_VAR_DOUBLE(nid,var3didin(8),psurf)
#else
ierr = NF_GET_VAR_REAL(nid,var3didin(8),psurf)
#endif
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop "getvarup"
endif
! write(*,*)'lecture psurf ok',psurf
#ifdef NC_DOUBLE
ierr = NF_GET_VAR_DOUBLE(nid,var3didin(9),ug)
#else
ierr = NF_GET_VAR_REAL(nid,var3didin(9),ug)
#endif
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop "getvarup"
endif
! write(*,*)'lecture ug ok',ug
#ifdef NC_DOUBLE
ierr = NF_GET_VAR_DOUBLE(nid,var3didin(10),vg)
#else
ierr = NF_GET_VAR_REAL(nid,var3didin(10),vg)
#endif
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop "getvarup"
endif
! write(*,*)'lecture vg ok',vg
#ifdef NC_DOUBLE
ierr = NF_GET_VAR_DOUBLE(nid,var3didin(17),hadvt)
#else
ierr = NF_GET_VAR_REAL(nid,var3didin(17),hadvt)
#endif
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop "getvarup"
endif
! write(*,*)'lecture hadvt ok',hadvt
#ifdef NC_DOUBLE
ierr = NF_GET_VAR_DOUBLE(nid,var3didin(18),hadvq)
#else
ierr = NF_GET_VAR_REAL(nid,var3didin(18),hadvq)
#endif
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop "getvarup"
endif
! write(*,*)'lecture hadvq ok',hadvq
#ifdef NC_DOUBLE
ierr = NF_GET_VAR_DOUBLE(nid,var3didin(19),hadvu)
#else
ierr = NF_GET_VAR_REAL(nid,var3didin(19),hadvu)
#endif
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop "getvarup"
endif
! write(*,*)'lecture hadvu ok',hadvu
#ifdef NC_DOUBLE
ierr = NF_GET_VAR_DOUBLE(nid,var3didin(20),hadvv)
#else
ierr = NF_GET_VAR_REAL(nid,var3didin(20),hadvv)
#endif
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop "getvarup"
endif
! write(*,*)'lecture hadvv ok',hadvv
#ifdef NC_DOUBLE
ierr = NF_GET_VAR_DOUBLE(nid,var3didin(21),w)
#else
ierr = NF_GET_VAR_REAL(nid,var3didin(21),w)
#endif
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop "getvarup"
endif
! write(*,*)'lecture w ok',w
#ifdef NC_DOUBLE
ierr = NF_GET_VAR_DOUBLE(nid,var3didin(22),omega)
#else
ierr = NF_GET_VAR_REAL(nid,var3didin(22),omega)
#endif
if(ierr/=NF_NOERR) then
write(*,*) NF_STRERROR(ierr)
stop "getvarup"
endif
! write(*,*)'lecture omega ok',omega
return
end subroutine read_dice
!=====================================================================
! Reads CIRC input files
SUBROUTINE read_circ(nlev_circ,cf,lwp,iwp,reliq,reice,t,z,p,pm,h2o,o3,sza)
parameter (ncm_1=49180)
#include "YOMCST.h"
real albsfc(ncm_1), albsfc_w(ncm_1)
real cf(nlev_circ), icefra(nlev_circ), deice(nlev_circ), &
reliq(nlev_circ), reice(nlev_circ), lwp(nlev_circ), iwp(nlev_circ)
real t(nlev_circ+1), z(nlev_circ+1), dz(nlev_circ), p(nlev_circ+1)
real aer_beta(nlev_circ), waer(nlev_circ), gaer(nlev_circ)
real pm(nlev_circ), tm(nlev_circ), h2o(nlev_circ), o3(nlev_circ)
real co2(nlev_circ), n2o(nlev_circ), co(nlev_circ), ch4(nlev_circ), &
o2(nlev_circ), ccl4(nlev_circ), f11(nlev_circ), f12(nlev_circ)
! za= zenital angle
! sza= cosinus angle zenital
real wavn(ncm_1), ssf(ncm_1),za,sza
integer nlev
! Open the files
open (11, file='Tsfc_sza_nlev_case.txt', status='old')
open (12, file='level_input_case.txt', status='old')
open (13, file='layer_input_case.txt', status='old')
open (14, file='aerosol_input_case.txt', status='old')
open (15, file='cloud_input_case.txt', status='old')
open (16, file='sfcalbedo_input_case.txt', status='old')
! Read scalar information
do iskip=1,5
read (11, *)
enddo
read (11, '(i8)') nlev
read (11, '(f10.2)') tsfc
read (11, '(f10.2)') za
read (11, '(f10.4)') sw_dn_toa
sza=cos(za/180.*RPI)
print *,'nlev,tsfc,sza,sw_dn_toa,RPI',nlev,tsfc,sza,sw_dn_toa,RPI
close(11)
! Read level information
read (12, *)
do il=1,nlev
read (12, 302) ilev, z(il), p(il), t(il)
z(il)=z(il)*1000. ! z donne en km
p(il)=p(il)*100. ! p donne en mb
enddo
302 format (i8, f8.3, 2f9.2)
close(12)
! Read layer information (midpoint values)
do iskip=1,3
read (13, *)
enddo
do il=1,nlev-1
read (13, 303) ilev,pm(il),tm(il),h2o(il),co2(il),o3(il), &
n2o(il),co(il),ch4(il),o2(il),ccl4(il), &
f11(il),f12(il)
pm(il)=pm(il)*100.
enddo
303 format (i8, 2f9.2, 10(2x,e13.7))
close(13)
! Read aerosol layer information
do iskip=1,3
read (14, *)
enddo
read (14, '(f10.2)') aer_alpha
read (14, *)
read (14, *)
do il=1,nlev-1
read (14, 304) ilev, aer_beta(il), waer(il), gaer(il)
enddo
304 format (i8, f9.5, 2f8.3)
close(14)
! Read cloud information
do iskip=1,3
read (15, *)
enddo
do il=1,nlev-1
read (15, 305) ilev, cf(il), lwp(il), iwp(il), reliq(il), reice(il)
lwp(il)=lwp(il)/1000. ! lwp donne en g/kg
iwp(il)=iwp(il)/1000. ! iwp donne en g/kg
reliq(il)=reliq(il)/1000000. ! reliq donne en microns
reice(il)=reice(il)/1000000. ! reice donne en microns
enddo
305 format (i8, f8.3, 4f9.2)
close(15)
! Read surface albedo (weighted & unweighted) and spectral solar irradiance
do iskip=1,6
read (16, *)
enddo
do icm_1=1,ncm_1
read (16, 306) wavn(icm_1), albsfc(icm_1), albsfc_w(icm_1), ssf(icm_1)
enddo
306 format(f10.1, 2f12.5, f14.8)
close(16)
return
end subroutine read_circ
!=====================================================================
! Reads RTMIP input files
SUBROUTINE read_rtmip(nlev_rtmip,play,plev,t,h2o,o3)
#include "YOMCST.h"
real t(nlev_rtmip), pt(nlev_rtmip),pb(nlev_rtmip),h2o(nlev_rtmip), o3(nlev_rtmip)
real temp(nlev_rtmip), play(nlev_rtmip),ovap(nlev_rtmip), oz(nlev_rtmip),plev(nlev_rtmip+1)
integer nlev
! Open the files
open (11, file='low_resolution_profile.txt', status='old')
! Read level information
read (11, *)
do il=1,nlev_rtmip
read (11, 302) pt(il), pb(il), t(il),h2o(il),o3(il)
enddo
do il=1,nlev_rtmip
play(il)=pt(nlev_rtmip-il+1)*100. ! p donne en mb
temp(il)=t(nlev_rtmip-il+1)
ovap(il)=h2o(nlev_rtmip-il+1)
oz(il)=o3(nlev_rtmip-il+1)
enddo
do il=1,39
plev(il)=play(il)+(play(il+1)-play(il))/2.
print *,'il p t ovap oz=',il,plev(il),temp(il),ovap(il),oz(il)
enddo
plev(41)=101300.
302 format (e16.10,3x,e16.10,3x,e16.10,3x,e12.6,3x,e12.6)
close(12)
return
end subroutine read_rtmip
!=====================================================================
! Subroutines for nudging
Subroutine Nudge_RHT_init (paprs,pplay,t,q,t_targ,rh_targ)
! ========================================================
USE dimphy
implicit none
! ========================================================
REAL paprs(klon,klevp1)
REAL pplay(klon,klev)
!
! Variables d'etat
REAL t(klon,klev)
REAL q(klon,klev)
!
! Profiles cible
REAL t_targ(klon,klev)
REAL rh_targ(klon,klev)
!
INTEGER k,i
REAL zx_qs
! Declaration des constantes et des fonctions thermodynamiques
!
include "YOMCST.h"
include "YOETHF.h"
!
! ----------------------------------------
! Statement functions
include "FCTTRE.h"
! ----------------------------------------
!
DO k = 1,klev
DO i = 1,klon
t_targ(i,k) = t(i,k)
IF (t(i,k).LT.RTT) THEN
zx_qs = qsats(t(i,k))/(pplay(i,k))
ELSE
zx_qs = qsatl(t(i,k))/(pplay(i,k))
ENDIF
rh_targ(i,k) = q(i,k)/zx_qs
ENDDO
ENDDO
print *, 't_targ',t_targ
print *, 'rh_targ',rh_targ
!
!
RETURN
END
Subroutine Nudge_UV_init (paprs,pplay,u,v,u_targ,v_targ)
! ========================================================
USE dimphy
implicit none
! ========================================================
REAL paprs(klon,klevp1)
REAL pplay(klon,klev)
!
! Variables d'etat
REAL u(klon,klev)
REAL v(klon,klev)
!
! Profiles cible
REAL u_targ(klon,klev)
REAL v_targ(klon,klev)
!
INTEGER k,i
!
DO k = 1,klev
DO i = 1,klon
u_targ(i,k) = u(i,k)
v_targ(i,k) = v(i,k)
ENDDO
ENDDO
print *, 'u_targ',u_targ
print *, 'v_targ',v_targ
!
!
RETURN
END
Subroutine Nudge_RHT (dtime,paprs,pplay,t_targ,rh_targ,t,q, &
& d_t,d_q)
! ========================================================
USE dimphy
implicit none
! ========================================================
REAL dtime
REAL paprs(klon,klevp1)
REAL pplay(klon,klev)
!
! Variables d'etat
REAL t(klon,klev)
REAL q(klon,klev)
!
! Tendances
REAL d_t(klon,klev)
REAL d_q(klon,klev)
!
! Profiles cible
REAL t_targ(klon,klev)
REAL rh_targ(klon,klev)
!
! Temps de relaxation
REAL tau
!c DATA tau /3600./
!! DATA tau /5400./
DATA tau /1800./
!
INTEGER k,i
REAL zx_qs, rh, tnew, d_rh
! Declaration des constantes et des fonctions thermodynamiques
!
include "YOMCST.h"
include "YOETHF.h"
!
! ----------------------------------------
! Statement functions
include "FCTTRE.h"
! ----------------------------------------
!
print *,'dtime, tau ',dtime,tau
print *, 't_targ',t_targ
print *, 'rh_targ',rh_targ
print *,'temp ',t
print *,'hum ',q
DO k = 1,klev
DO i = 1,klon
!! IF (paprs(i,1)-pplay(i,k) .GT. 10000.) THEN
IF (t(i,k).LT.RTT) THEN
zx_qs = qsats(t(i,k))/(pplay(i,k))
ELSE
zx_qs = qsatl(t(i,k))/(pplay(i,k))
ENDIF
rh = q(i,k)/zx_qs
!
d_t(i,k) = d_t(i,k) + 1./tau*(t_targ(i,k)-t(i,k))
d_rh = 1./tau*(rh_targ(i,k)-rh)
!
tnew = t(i,k)+d_t(i,k)
IF (tnew.LT.RTT) THEN
zx_qs = qsats(tnew)/(pplay(i,k))
ELSE
zx_qs = qsatl(tnew)/(pplay(i,k))
ENDIF
d_q(i,k) = d_q(i,k) + d_rh*zx_qs
!
print *,' k,d_t,rh,d_rh,d_q ', &
k,d_t(i,k),rh,d_rh,d_q(i,k)
!! ENDIF
!
ENDDO
ENDDO
!
RETURN
END
Subroutine Nudge_UV (dtime,paprs,pplay,u_targ,v_targ,u,v, &
& d_u,d_v)
! ========================================================
USE dimphy
implicit none
! ========================================================
REAL dtime
REAL paprs(klon,klevp1)
REAL pplay(klon,klev)
!
! Variables d'etat
REAL u(klon,klev)
REAL v(klon,klev)
!
! Tendances
REAL d_u(klon,klev)
REAL d_v(klon,klev)
!
! Profiles cible
REAL u_targ(klon,klev)
REAL v_targ(klon,klev)
!
! Temps de relaxation
REAL tau
!c DATA tau /3600./
DATA tau /5400./
!
INTEGER k,i
!
print *,'dtime, tau ',dtime,tau
print *, 'u_targ',u_targ
print *, 'v_targ',v_targ
print *,'zonal velocity ',u
print *,'meridional velocity ',v
DO k = 1,klev
DO i = 1,klon
IF (paprs(i,1)-pplay(i,k) .GT. 10000.) THEN
!
d_u(i,k) = d_u(i,k) + 1./tau*(u_targ(i,k)-u(i,k))
d_v(i,k) = d_v(i,k) + 1./tau*(v_targ(i,k)-v(i,k))
!
print *,' k,u,d_u,v,d_v ', &
k,u(i,k),d_u(i,k),v(i,k),d_v(i,k)
ENDIF
!
ENDDO
ENDDO
!
RETURN
END
le 1er Nov 1992 (jour julien=306)
'