36 USE ioipsl
, ONLY: flininfo, flinopen, flinget, flinclo, histclo
44 include
"dimensions.h"
50 include
"comdissnew.h"
55 CHARACTER(LEN=120),
PARAMETER ::
dynfname=
'ECDYN.nc'
81 REAL,
INTENT(INOUT) :: masque(iip1,
jjp1)
82 REAL,
INTENT(INOUT) :: phis (iip1,
jjp1)
85 CHARACTER(LEN=256) :: modname, fmt
86 INTEGER :: i, j, l, ji, itau, iday
87 REAL :: xpn, xps, time, phystep
88 REAL,
DIMENSION(iip1,jjp1) :: psol
89 REAL,
DIMENSION(iip1,jjp1,llm+1) :: p3d
90 REAL,
DIMENSION(iip1,jjp1,llm) :: uvent, t3d, tpot, qsat, qd
91 REAL,
DIMENSION(iip1,jjp1,llm) :: pk, pls, y, masse
92 REAL,
DIMENSION(iip1,jjm ,llm) :: vvent
93 REAL,
DIMENSION(ip1jm ,llm) :: pbarv
94 REAL,
DIMENSION(ip1jmp1 ,llm) :: pbaru, phi, w
95 REAL,
DIMENSION(ip1jmp1) :: pks
96 REAL,
DIMENSION(iim) :: xppn, xpps
97 REAL,
ALLOCATABLE :: q3d(:,:,:,:)
99 modname=
'etat0dyn_netcdf'
110 IF(pressure_exner)
THEN
119 uvent(:,:,:) = 0.0 ; vvent(:,:,:) = 0.0 ; t3d(:,:,:) = 0.0
121 CALL startget_dyn3d(
'v' ,
rlonv,
rlatv,pls(:,:jjm,:),y(:,:jjm,:),vvent, &
124 tpot(:,:,:)=t3d(:,:,:)
127 WRITE(
lunout,*)
'T3D min,max:',minval(t3d(:,:,:)),maxval(t3d(:,:,:))
128 WRITE(
lunout,*)
'PLS min,max:',minval(pls(:,:,:)),maxval(pls(:,:,:))
132 WRITE(
lunout,*)
'avant q_sat'
134 WRITE(
lunout,*)
'apres q_sat'
135 WRITE(
lunout,*)
'QSAT min,max:',minval(qsat(:,:,:)),maxval(qsat(:,:,:))
139 ALLOCATE(q3d(iip1,
jjp1,
llm,
nqtot)); q3d(:,:,:,:)=0.0 ; q3d(:,:,:,1)=qd(:,:,:)
145 DO i=1,
nqtot;
IF(any([
"O3",
"o3"]==
tname(i))) exit;
END DO
150 q3d(:,:,:,i)=q3d(:,:,:,i)*48./ 29.
152 q3d(iip1,:,:,:)=q3d(1,:,:,:)
158 WRITE(
lunout,*)
'sortie inidissip'
171 WRITE(
lunout,*)
'sortie geopot'
172 CALL caldyn0( itau, uvent, vvent, tpot, psol, masse, pk, phis, &
173 phi, w, pbaru, pbarv, time+iday-
dayref)
174 WRITE(
lunout,*)
'sortie caldyn0'
180 WRITE(
lunout,*)
'sortie dynredem0'
182 CALL dynredem1_loc(
"start.nc", 0.0, vvent, uvent, tpot, q3d, masse, psol)
184 CALL dynredem1(
"start.nc", 0.0, vvent, uvent, tpot, q3d, masse, psol)
186 WRITE(
lunout,*)
'sortie dynredem1'
197 champ, lon_in2, lat_in2)
209 CHARACTER(LEN=*),
INTENT(IN) :: var
210 REAL,
INTENT(IN) :: lon_in(:)
211 REAL,
INTENT(IN) :: lat_in(:)
212 REAL,
INTENT(IN) :: pls (:, :, :)
213 REAL,
INTENT(IN) :: workvar(:, :, :)
214 REAL,
INTENT(INOUT) :: champ (:, :, :)
215 REAL,
INTENT(IN) :: lon_in2(:)
216 REAL,
INTENT(IN) :: lat_in2(:)
219 CHARACTER(LEN=10) :: vname
220 CHARACTER(LEN=256) :: msg, modname=
"startget_dyn3d"
221 INTEGER :: iml, jml, jml2, lml, il
224 iml=
assert_eq([
SIZE(lon_in),
SIZE(pls,1),
SIZE(workvar,1),
SIZE(champ,1), &
225 &
SIZE(lon_in2)], trim(modname)//
" iml")
226 jml=
assert_eq(
SIZE(lat_in),
SIZE(pls,2),
SIZE(workvar,2),
SIZE(champ,2), &
227 & trim(modname)//
" jml")
228 lml=
assert_eq(
SIZE(pls,3),
SIZE(workvar,3),
SIZE(champ,3), &
229 & trim(modname)//
" lml")
236 CASE(
't'); vname=
'TEMP'
237 CASE(
'q'); vname=
'R'; msg=
'humidity as the saturated humidity'
238 CASE(
'tpot'); msg=
'potential temperature as the Exner function'
239 CASE DEFAULT; msg=
'No rule to extract variable '//trim(var)
240 CALL abort_gcm(modname,trim(msg)//
' from any data set',1)
244 IF((var==
'tpot'.OR.var==
'q').AND.minval(workvar)==maxval(workvar))
THEN
245 msg=
'Could not compute '//trim(msg)//
' is missing or constant.'
250 IF(var/=
'tpot')
CALL start_inter_3d(trim(vname),lon_in,lat_in,lon_in2, &
255 CASE(
'u');
DO il=1,lml; champ(:,:,il)=champ(:,:,il)*
cu(:,1:jml);
END DO
256 champ(iml,:,:)=champ(1,:,:)
258 CASE(
'v');
DO il=1,lml; champ(:,:,il)=champ(:,:,il)*
cv(:,1:jml);
END DO
259 champ(iml,:,:)=champ(1,:,:)
262 IF(var==
'tpot') then; champ=champ*
cpp/workvar
263 else; champ=champ*.01*workvar
264 WHERE(champ<0.) champ=1.0e-10
267 xppn = sum(
aire(:,1 )*champ(:,1 ,il))/
apoln
268 xpps = sum(
aire(:,jml)*champ(:,jml,il))/
apols
269 champ(:,1 ,il) = xppn
270 champ(:,jml,il) = xpps
289 REAL,
INTENT(IN) :: lon_in (:), lat_in (:)
290 REAL,
INTENT(IN) :: lon_in2(:), lat_in2(:)
291 REAL,
INTENT(IN) :: zs (:,:)
292 REAL,
INTENT(OUT) :: psol(:,:)
295 CHARACTER(LEN=256) :: modname=
'start_init_dyn'
297 INTEGER :: iml, jml, jml2, itau(1)
298 REAL,
ALLOCATABLE :: lon_rad(:), lon_ini(:), var_ana(:,:)
299 REAL,
ALLOCATABLE :: lat_rad(:), lat_ini(:)
300 REAL,
ALLOCATABLE :: z(:,:), ps(:,:), ts(:,:)
302 iml=
assert_eq(
SIZE(lon_in),
SIZE(zs,1),
SIZE(psol,1),
SIZE(lon_in2), &
303 & trim(modname)//
" iml")
304 jml=
assert_eq(
SIZE(lat_in),
SIZE(zs,2),
SIZE(psol,2),trim(modname)//
" jml")
307 WRITE(
lunout,*)
'Opening the surface analysis'
326 DEALLOCATE(var_ana,lon_rad,lat_rad,lon_ini,lat_ini)
329 psol(:iml-1,:) = ps(:iml-1,:)*(1.0+(z(:iml-1,:)-zs(:iml-1,:))/287.0 &
331 psol(iml,:)=psol(1,:)
333 psol(:,1 )=sum(
aire(1:iml-1,1 )*psol(1:iml-1,1 ))/
apoln
334 psol(:,jml)=sum(
aire(1:iml-1,jml)*psol(1:iml-1,jml))/
apols
347 CHARACTER(LEN=*),
INTENT(IN) :: title
348 REAL,
ALLOCATABLE,
INTENT(INOUT) :: field(:,:)
351 CHARACTER(LEN=256) :: msg
355 CASE(
'Z'); tllm=0; msg=
'geopotential'
356 CASE(
'SP'); tllm=0; msg=
'surface pressure'
357 CASE(
'ST'); tllm=
llm_dyn; msg=
'temperature'
359 IF(.NOT.
ALLOCATED(field))
THEN
360 ALLOCATE(field(iml,jml))
362 CALL conf_dat2d(title, lon_ini, lat_ini, lon_rad, lat_rad, var_ana, .
true.)
364 lon_in, lat_in, lon_in2, lat_in2, field)
365 ELSE IF(
SIZE(field)/=
SIZE(z))
THEN
366 msg=
'The '//trim(msg)//
' field we have does not have the right size'
381 SUBROUTINE start_inter_3d(var,lon_in,lat_in,lon_in2,lat_in2,pls_in,var3d)
390 CHARACTER(LEN=*),
INTENT(IN) :: var
391 REAL,
INTENT(IN) :: lon_in(:), lat_in(:)
392 REAL,
INTENT(IN) :: lon_in2(:), lat_in2(:)
393 REAL,
INTENT(IN) :: pls_in(:,:,:)
394 REAL,
INTENT(OUT) :: var3d (:,:,:)
397 CHARACTER(LEN=256) :: modname=
'start_inter_3d'
400 INTEGER :: iml, jml, lml, jml2, ii, ij, il, ierr
402 REAL,
ALLOCATABLE :: ax(:), lon_rad(:), lon_ini(:), lev_dyn(:), yder(:)
403 REAL,
ALLOCATABLE :: ay(:), lat_rad(:), lat_ini(:), var_tmp3d(:,:,:)
404 REAL,
ALLOCATABLE,
SAVE :: var_ana3d(:,:,:)
406 iml=
assert_eq(
SIZE(lon_in),
SIZE(lon_in2),
SIZE(pls_in,1),
SIZE(var3d,1),trim(modname)//
" iml")
407 jml=
assert_eq(
SIZE(lat_in),
SIZE(pls_in,2),
SIZE(var3d,2),trim(modname)//
" jml")
408 lml=
assert_eq(
SIZE(pls_in,3),
SIZE(var3d,3),trim(modname)//
" lml"); jml2=
SIZE(lat_in2)
410 WRITE(
lunout, *)
'Going into flinget to extract the 3D field.'
422 lon_rad, lat_rad, lev_dyn, var_ana3d, .
true.)
423 DEALLOCATE(lon_ini, lat_ini)
426 ALLOCATE(var_tmp3d(iml,jml,
llm_dyn))
429 lon_in,lat_in,lon_in2,lat_in2,var_tmp3d(:,:,il))
431 DEALLOCATE(lon_rad, lat_rad)
440 ay = var_tmp3d(ii, ij,
llm_dyn:1:-1)
441 yder =
pchsp_95(ax, ay, ibeg=2, iend=2, vc_beg=0., vc_end=0.)
442 CALL pchfe_95(ax, ay, yder, skip, pls_in(ii, ij, lml:1:-1), &
443 var3d(ii, ij, lml:1:-1), ierr)
444 IF(ierr<0)
CALL abort_gcm(trim(modname),
'error in pchfe_95',1)
445 n_extrap = n_extrap + ierr
448 IF(n_extrap/=0)
WRITE(
lunout,*)trim(modname)//
" pchfe_95: n_extrap=", n_extrap
449 var3d(iml, :, :) = var3d(1, :, :)
452 CALL minmax(iml*jml, var3d(1, 1, il), chmin, chmax)
453 WRITE(
lunout, *)
' '//trim(var)//
' min max l ', il, chmin, chmax
463 SUBROUTINE interp_startvar(nam,ibeg,lon,lat,vari,lon1,lat1,lon2,lat2,varo)
470 CHARACTER(LEN=*),
INTENT(IN) :: nam
471 LOGICAL,
INTENT(IN) :: ibeg
472 REAL,
INTENT(IN) :: lon(:), lat(:)
473 REAL,
INTENT(IN) :: vari(:,:)
474 REAL,
INTENT(IN) :: lon1(:), lat1(:)
475 REAL,
INTENT(IN) :: lon2(:), lat2(:)
476 REAL,
INTENT(OUT) :: varo(:,:)
479 CHARACTER(LEN=256) :: modname=
"interp_startvar"
480 INTEGER :: ii, jj, i1, j1, j2
481 REAL,
ALLOCATABLE :: vtmp(:,:)
483 ii=
assert_eq(
SIZE(lon),
SIZE(vari,1),trim(modname)//
" ii")
484 jj=
assert_eq(
SIZE(lat),
SIZE(vari,2),trim(modname)//
" jj")
485 i1=
assert_eq(
SIZE(lon1),
SIZE(lon2),
SIZE(varo,1),trim(modname)//
" i1")
486 j1=
assert_eq(
SIZE(lat1),
SIZE(varo,2),trim(modname)//
" j1")
488 ALLOCATE(vtmp(i1-1,j1))
490 WRITE(
lunout,*)
"---------------------------------------------------------"
491 WRITE(
lunout,*)
"$$$ Interpolation barycentrique pour "//trim(nam)//
" $$$"
492 WRITE(
lunout,*)
"---------------------------------------------------------"
494 CALL inter_barxy(lon, lat(:jj-1), vari, lon2(:i1-1), lat2, vtmp)
!$Header llmm1 INTEGER ip1jmp1
subroutine startget_dyn3d(var, lon_in, lat_in, pls, workvar, champ, lon_in2, lat_in2)
!$Header!CDK comgeom COMMON comgeom apols
character(len=120), parameter dynfname
real, dimension(:,:), allocatable, save lon_dyn
subroutine gr_int_dyn(champin, champdyn, iim, jp1)
!$Id mode_top_bound COMMON comconstr kappa
subroutine exner_hyb(ngrid, ps, p, pks, pk, pkf)
subroutine dynredem0(fichnom, iday_end, phis)
subroutine, public conf_dat2d(title, xd, yd, xf, yf, champd, interbar)
subroutine, public conf_dat3d(title, xd, yd, zd, xf, yf, zf, champd, interbar)
real function, dimension(size(x)) pchsp_95(x, f, ibeg, iend, vc_beg, vc_end)
subroutine exner_milieu(ngrid, ps, p, pks, pk, pkf)
subroutine abort_gcm(modname, message, ierr)
!$Id Turb_fcg_gcssold get_uvd hqturb_gcssold endif!large scale llm day day1 day day1 *dt_toga endif!time annee_ref dt_toga u_toga vq_toga w_prof vq_prof llm day day1 day day1 *dt_dice endif!time annee_ref dt_dice swup_dice vg_dice omega_dice tg_prof vg_profd w_profd omega_profd!do llm!print llm l llm
!$Id mode_top_bound COMMON comconstr && pi
!$Header!CDK comgeom COMMON comgeom aire
!$Header!CDK comgeom COMMON comgeom rlatu
subroutine geopot(ngrid, teta, pk, pks, phis, phi)
subroutine regr_pr_o3(p3d, o3_mob_regr)
subroutine get_var_dyn(title, field)
subroutine pression(ngrid, ap, bp, ps, p)
subroutine dynredem1(fichnom, time, vcov, ucov, teta, q, masse, ps)
!$Header!CDK comgeom COMMON comgeom apoln
subroutine start_init_dyn(lon_in, lat_in, lon_in2, lat_in2, zs, psol)
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL false
subroutine interp_startvar(nam, ibeg, lon, lat, vari, lon1, lat1, lon2, lat2, varo)
subroutine pchfe_95(X, F, D, SKIP, XE, FE, IERR)
subroutine q_sat(np, temp, pres, qsat)
subroutine dynredem1_loc(fichnom, time, vcov, ucov, teta, q, masse, ps)
!$Id mode_top_bound COMMON comconstr cpp
subroutine minmax(imax, xi, zmin, zmax)
!FH On elimine toutes les clefs physiques dans la dynamique prt_level
!$Header!CDK comgeom COMMON comgeom rlonu
!$Header!CDK comgeom COMMON comgeom rlatv
character(len=20), dimension(:), allocatable, save tname
subroutine, public inter_barxy(dlonid, dlatid, champ, rlonimod, rlatimod, champint)
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL true
!$Id!Parameters for parameters that control the rate of approach!to quasi equilibrium noff nlm real tlcrit real entp real sigd real coeffs real dtmax real cu real betad real damp real delta COMMON cvparam nlm tlcrit sigd coeffs cu
!$Header!INCLUDE comdissip h COMMON comdissip tetatemp
subroutine, public regr_lat_time_coefoz
subroutine start_inter_3d(var, lon_in, lat_in, lon_in2, lat_in2, pls_in, var3d)
subroutine inidissip(lstardis, nitergdiv, nitergrot, niterh, tetagdiv, tetagrot, tetatemp, vert_prof_dissip)
real, dimension(:,:), allocatable, save lat_dyn
real, dimension(:), allocatable, save levdyn_ini
!$Header!CDK comgeom COMMON comgeom cv
subroutine dynredem0_loc(fichnom, iday_end, phis)
subroutine caldyn0(itau, ucov, vcov, teta, ps, masse, pk, phis, phi, w, pbaru, pbarv, time)
subroutine, public etat0dyn_netcdf(masque, phis)
!$Header!gestion des impressions de sorties et de débogage la sortie standard prt_level COMMON comprint lunout
!$Header!CDK comgeom COMMON comgeom rlonv