16 INTEGER,
SAVE :: g_comm
17 CHARACTER(len=100),
SAVE :: g_ctx_name
18 TYPE(xios_context),
SAVE :: g_ctx
20 LOGICAL,
SAVE :: g_flag_xml = .
false.
21 CHARACTER(len=100) :: g_field_name =
"nofield"
23 REAL :: missing_val_omp
33 SUBROUTINE reformadate(odate, ndate)
34 CHARACTER(len=*),
INTENT(IN) :: odate
35 CHARACTER(len=100),
INTENT(OUT) :: ndate
48 i = index(odate,
"day")
50 ndate = odate(1:
i-1)//
"d"
53 i = index(odate,
"hr")
55 ndate = odate(1:
i-1)//
"h"
58 i = index(odate,
"mth")
60 ndate = odate(1:
i-1)//
"mo"
64 END SUBROUTINE reformadate
70 CHARACTER(len=7) FUNCTION reformaop(op)
71 CHARACTER(len=*),
INTENT(IN) :: op
76 IF (op.EQ.
"inst(X)")
THEN
80 IF (op.EQ.
"once")
THEN
84 IF (op.EQ.
"t_max(X)")
THEN
88 IF (op.EQ.
"t_min(X)")
THEN
93 END FUNCTION reformaop
100 SUBROUTINE wxios_init(xios_ctx_name, locom, outcom, type_ocean)
104 CHARACTER(len=*),
INTENT(IN) :: xios_ctx_name
105 INTEGER,
INTENT(IN),
OPTIONAL :: locom
106 INTEGER,
INTENT(OUT),
OPTIONAL :: outcom
107 CHARACTER(len=6),
INTENT(IN),
OPTIONAL :: type_ocean
110 TYPE(xios_context) :: xios_ctx
117 IF (
PRESENT(locom))
THEN
118 CALL xios_initialize(xios_ctx_name, local_comm = locom, return_comm = xios_comm )
119 IF (
prt_level >= 10)
WRITE(
lunout,*)
"wxios_init: ctx=",xios_ctx_name,
" local_comm=",locom,
", return_comm=",xios_comm
121 CALL xios_initialize(xios_ctx_name, return_comm = xios_comm )
122 IF (
prt_level >= 10)
WRITE(
lunout,*)
"wxios_init: ctx=",xios_ctx_name,
" return_comm=",xios_comm
125 IF (
PRESENT(outcom))
THEN
127 IF (
prt_level >= 10)
WRITE(
lunout,*)
"wxios_init: ctx=",xios_ctx_name,
" outcom=",outcom
132 g_ctx_name = xios_ctx_name
135 IF (.not.
PRESENT(type_ocean))
THEN
136 CALL wxios_context_init()
139 END SUBROUTINE wxios_init
141 SUBROUTINE wxios_context_init()
145 TYPE(xios_context) :: xios_ctx
148 CALL xios_context_initialize(g_ctx_name, g_comm)
149 CALL xios_get_handle(g_ctx_name, xios_ctx)
150 CALL xios_set_current_context(xios_ctx)
154 WRITE(
lunout,*)
"wxios_context_init: Current context is ",trim(g_ctx_name)
155 WRITE(
lunout,*)
" now call xios_solve_inheritance()"
158 CALL xios_solve_inheritance()
159 END SUBROUTINE wxios_context_init
165 SUBROUTINE wxios_set_cal(pasdetemps, calendrier, annee, mois, jour, heure, ini_an, ini_mois, ini_jour, ini_heure)
170 CHARACTER(len=*),
INTENT(IN) :: calendrier
171 INTEGER,
INTENT(IN) :: annee, mois, jour, ini_an, ini_mois, ini_jour
172 REAL,
INTENT(IN) :: pasdetemps, heure, ini_heure
175 CHARACTER(len=80) :: abort_message
176 CHARACTER(len=19) :: date
180 TYPE(xios_time) :: mdtime
183 mdtime = xios_time(0, 0, 0, 0, 0, pasdetemps)
186 SELECT CASE (calendrier)
188 CALL xios_set_context_attr_hdl(g_ctx, calendar_type=
"D360")
189 IF (
prt_level >= 10)
WRITE(
lunout,*)
'wxios_set_cal: Calendrier terrestre a 360 jours/an'
191 CALL xios_set_context_attr_hdl(g_ctx, calendar_type=
"NoLeap")
192 IF (
prt_level >= 10)
WRITE(
lunout,*)
'wxios_set_cal: Calendrier terrestre a 365 jours/an'
194 CALL xios_set_context_attr_hdl(g_ctx, calendar_type=
"Gregorian")
195 IF (
prt_level >= 10)
WRITE(
lunout,*)
'wxios_set_cal: Calendrier gregorien'
197 abort_message =
'wxios_set_cal: Mauvais choix de calendrier'
198 CALL abort_gcm(
'Gcm:Xios',abort_message,1)
202 WRITE(date,
"(i4.4,'-',i2.2,'-',i2.2,' ',i2.2,':00:00')") annee, mois, jour, int(heure)
204 IF (
prt_level >= 10)
WRITE(
lunout,*)
"wxios_set_cal: Time origin: ", date
206 CALL xios_set_context_attr_hdl(g_ctx, time_origin = date)
210 WRITE(date,
"(i4.4,'-',i2.2,'-',i2.2,' ',i2.2,':00:00')") ini_an, ini_mois, ini_jour, int(ini_heure)
212 IF (
prt_level >= 10)
WRITE(
lunout,*)
"wxios_set_cal: Start date: ", date
214 CALL xios_set_context_attr_hdl(g_ctx, start_date = date)
217 CALL xios_set_timestep(mdtime)
219 END SUBROUTINE wxios_set_cal
221 SUBROUTINE wxios_set_timestep(ts)
222 REAL,
INTENT(IN) :: ts
223 TYPE(xios_time) :: mdtime
225 mdtime = xios_time(0, 0, 0, 0, 0, ts)
227 CALL xios_set_timestep(mdtime)
228 END SUBROUTINE wxios_set_timestep
233 SUBROUTINE wxios_domain_param(dom_id, is_sequential, ni, nj, ni_glo, nj_glo, &
234 ibegin, iend, ii_begin, ii_end, jbegin, jend, &
235 data_ni, data_ibegin, data_iend, &
236 io_lat, io_lon,is_south_pole,mpi_rank)
242 CHARACTER(len=*),
INTENT(IN) :: dom_id
243 LOGICAL,
INTENT(IN) :: is_sequential
244 INTEGER,
INTENT(IN) :: ni
245 INTEGER,
INTENT(IN) :: nj
246 INTEGER,
INTENT(IN) :: ni_glo
247 INTEGER,
INTENT(IN) :: nj_glo
248 INTEGER,
INTENT(IN) :: ibegin
249 INTEGER,
INTENT(IN) :: iend
250 INTEGER,
INTENT(IN) :: ii_begin
251 INTEGER,
INTENT(IN) :: ii_end
252 INTEGER,
INTENT(IN) :: jbegin
253 INTEGER,
INTENT(IN) :: jend
254 INTEGER,
INTENT(IN) :: data_ni
255 INTEGER,
INTENT(IN) :: data_ibegin
256 INTEGER,
INTENT(IN) :: data_iend
257 REAL,
INTENT(IN) :: io_lat(:)
258 REAL,
INTENT(IN) :: io_lon(:)
259 logical,
intent(in) :: is_south_pole
260 integer,
intent(in) :: mpi_rank
262 TYPE(xios_domain) :: dom
266 LOGICAL :: mask(ni,nj)
269 CALL xios_get_domain_handle(dom_id, dom)
272 WRITE(
lunout,*)
"wxios_domain_param: mpirank=",mpi_rank,
" ni:",ni,
" ni_glo:", ni_glo,
" nj:", nj,
" nj_glo:", nj_glo
273 WRITE(
lunout,*)
"wxios_domain_param: mpirank=",mpi_rank,
" ibegin:",ibegin,
" iend:", iend,
" jbegin:", jbegin,
" jend:", jend
274 WRITE(
lunout,*)
"wxios_domain_param: mpirank=",mpi_rank,
" ii_begin:",ii_begin,
" ii_end:", ii_end
275 WRITE(
lunout,*)
"wxios_domain_param: mpirank=",mpi_rank,
" Size io_lon:",
SIZE(io_lon(ibegin:iend)),
" io_lat:",
SIZE(io_lat(jbegin:jend))
279 CALL xios_set_domain_attr_hdl(dom, ni_glo=ni_glo, ibegin=ibegin, ni=ni)
280 CALL xios_set_domain_attr_hdl(dom, nj_glo=nj_glo, jbegin=jbegin, nj=nj, data_dim=2)
281 CALL xios_set_domain_attr_hdl(dom, lonvalue=io_lon(ibegin:iend), latvalue=io_lat(jbegin:jend))
283 IF (.NOT.is_sequential)
THEN
285 if (ii_begin>1) mask(1:ii_begin-1,1) = .
false.
286 if (ii_end<ni) mask(ii_end+1:ni,nj) = .
false.
288 if ((ii_end.eq.1).and.(is_south_pole)) mask(1:ni,nj)=.
true.
290 WRITE(
lunout,*)
"wxios_domain_param: mpirank=",mpi_rank,
" mask(:,1)=",mask(:,1)
291 WRITE(
lunout,*)
"wxios_domain_param: mpirank=",mpi_rank,
" mask(:,nj)=",mask(:,nj)
293 CALL xios_set_domain_attr_hdl(dom, mask=mask)
296 CALL xios_is_defined_domain_attr_hdl(dom,ni_glo=boool)
298 IF (xios_is_valid_domain(dom_id))
THEN
299 IF (
prt_level >= 10)
WRITE(
lunout,*)
"wxios_domain_param: Domain initialized: ", trim(dom_id), boool
301 IF (
prt_level >= 10)
WRITE(
lunout,*)
"wxios_domain_param: Invalid domain: ", trim(dom_id)
303 END SUBROUTINE wxios_domain_param
308 SUBROUTINE wxios_add_vaxis(axis_id, axis_size, axis_value)
312 CHARACTER (len=*),
INTENT(IN) :: axis_id
313 INTEGER,
INTENT(IN) :: axis_size
314 REAL,
DIMENSION(axis_size),
INTENT(IN) :: axis_value
337 CALL xios_set_axis_attr(trim(axis_id),size=axis_size,
value=axis_value)
340 IF (xios_is_valid_axis(trim(adjustl(axis_id))))
THEN
341 IF (
prt_level >= 10)
WRITE(
lunout,*)
"wxios_add_vaxis: Axis created: ", trim(adjustl(axis_id))
343 WRITE(
lunout,*)
"wxios_add_vaxis: Invalid axis: ", trim(adjustl(axis_id))
346 END SUBROUTINE wxios_add_vaxis
352 SUBROUTINE wxios_add_file(fname, ffreq, flvl)
356 CHARACTER(len=*),
INTENT(IN) :: fname
357 CHARACTER(len=*),
INTENT(IN) :: ffreq
358 INTEGER,
INTENT(IN) :: flvl
360 TYPE(xios_file) :: x_file
361 TYPE(xios_filegroup) :: x_fg
362 CHARACTER(len=100) :: nffreq
365 IF (.NOT.xios_is_valid_file(fname))
THEN
367 CALL xios_get_filegroup_handle(
"defile", x_fg)
368 CALL xios_add_file(x_fg, x_file, fname)
371 CALL reformadate(ffreq, nffreq)
374 CALL xios_set_file_attr_hdl(x_file, name=
"X"//fname,&
375 output_freq=trim(adjustl(nffreq)), output_level=flvl, enabled=.
true.)
377 IF (xios_is_valid_file(
"X"//fname))
THEN
379 WRITE(
lunout,*)
"wxios_add_file: New file: ",
"X"//fname
380 WRITE(
lunout,*)
"wxios_add_file: output_freq=",trim(adjustl(nffreq)),
"; output_lvl=",flvl
383 WRITE(
lunout,*)
"wxios_add_file: Error, invalid file: ",
"X"//trim(fname)
384 WRITE(
lunout,*)
"wxios_add_file: output_freq=",trim(adjustl(nffreq)),
"; output_lvl=",flvl
388 WRITE(
lunout,*)
"wxios_add_file: File ",trim(fname),
" défined using XML."
391 CALL xios_set_file_attr(fname, enabled=.
true.)
393 END SUBROUTINE wxios_add_file
398 SUBROUTINE wxios_add_field(fieldname, fieldgroup, fieldlongname, fieldunit)
399 USE netcdf
, only: nf90_fill_real
404 CHARACTER(len=*),
INTENT(IN) :: fieldname
405 TYPE(xios_fieldgroup),
INTENT(IN) :: fieldgroup
406 CHARACTER(len=*),
INTENT(IN) :: fieldlongname
407 CHARACTER(len=*),
INTENT(IN) :: fieldunit
409 TYPE(xios_field) :: field
410 CHARACTER(len=10) :: newunit
416 IF (fieldunit .EQ.
" ")
THEN
423 CALL xios_add_field(fieldgroup, field, fieldname)
427 CALL xios_set_field_attr_hdl(field, standard_name=fieldlongname,
unit=newunit, default_value=
def)
428 IF (
prt_level >= 10)
WRITE(
lunout,*)
"wxios_add_field: Field ",trim(fieldname),
"cree:"
429 IF (
prt_level >= 10)
WRITE(
lunout,*)
"wxios_add_field: long_name=",trim(fieldlongname),
"; unit=",trim(newunit),
"; default_value=",nf90_fill_real
431 END SUBROUTINE wxios_add_field
436 SUBROUTINE wxios_add_field_to_file(fieldname, fdim, fid, fname, fieldlongname, fieldunit, field_level, op, nam_axvert)
440 CHARACTER(len=*),
INTENT(IN) :: fieldname
441 INTEGER,
INTENT(IN) :: fdim, fid
442 CHARACTER(len=*),
INTENT(IN) :: fname
443 CHARACTER(len=*),
INTENT(IN) :: fieldlongname
444 CHARACTER(len=*),
INTENT(IN) :: fieldunit
445 INTEGER,
INTENT(IN) :: field_level
446 CHARACTER(len=*),
INTENT(IN) :: op
448 CHARACTER(len=20) :: axis_id
449 CHARACTER(len=20),
INTENT(IN),
OPTIONAL :: nam_axvert
450 CHARACTER(len=100) :: operation
452 TYPE(xios_field) :: field
453 TYPE(xios_fieldgroup) :: fieldgroup
454 LOGICAL :: bool=.
false.
465 IF (
PRESENT(nam_axvert))
THEN
467 print*,
'nam_axvert=',axis_id
471 operation = reformaop(op)
476 CALL xios_get_fieldgroup_handle(
"fields_2D", fieldgroup)
478 CALL xios_get_fieldgroup_handle(
"fields_3D", fieldgroup)
482 IF (xios_is_valid_field(fieldname) .AND. .NOT. g_field_name == fieldname)
THEN
484 IF (
prt_level >= 10)
WRITE(
lunout,*)
"wxios_add_field_to_file: Field ", trim(fieldname),
"exists via XML"
486 g_field_name = fieldname
488 ELSE IF (.NOT. g_field_name == fieldname)
THEN
491 IF (
prt_level >= 10)
WRITE(
lunout,*)
"wxios_add_field_to_file: Field ", trim(fieldname),
"does not exist"
494 CALL wxios_add_field(fieldname, fieldgroup, fieldlongname, fieldunit)
495 IF (xios_is_valid_field(fieldname))
THEN
496 IF (
prt_level >= 10)
WRITE(
lunout,*)
"wxios_add_field_to_file: Field ", trim(fieldname),
"created"
500 g_field_name = fieldname
504 IF (.NOT. g_flag_xml)
THEN
507 CALL xios_get_file_handle(fname, f)
508 CALL xios_add_fieldtofile(f, field)
512 CALL xios_set_field_attr_hdl(field, field_ref=fieldname, operation=trim(adjustl(operation)), freq_op=
"1ts", prec=4)
516 CALL xios_set_field_attr_hdl(field,
level=field_level, enabled=.
true.)
521 WRITE(
lunout,*)
"wxios_add_field_to_file: 2D Field ", trim(fieldname),
" in ",
"X"//trim(fname) ,
" configured with:"
522 WRITE(
lunout,*)
"wxios_add_field_to_file: op=", trim(adjustl(operation))
523 WRITE(
lunout,*)
"wxios_add_field_to_file: freq_op=1ts",
"; lvl=",field_level
528 CALL xios_set_field_attr_hdl(field, axis_ref=trim(adjustl(axis_id)))
531 WRITE(
lunout,*)
"wxios_add_field_to_file: 3D Field",trim(fieldname),
" in ",
"X"//trim(fname),
"configured with:"
532 WRITE(
lunout,*)
"wxios_add_field_to_file: freq_op=1ts",
"; lvl=",field_level
533 WRITE(
lunout,*)
"wxios_add_field_to_file: axis=",trim(adjustl(axis_id))
539 CALL xios_set_field_attr(fieldname, enabled=.
true.)
545 END SUBROUTINE wxios_add_field_to_file
566 SUBROUTINE wxios_closedef()
567 CALL xios_close_context_definition()
569 END SUBROUTINE wxios_closedef
571 SUBROUTINE wxios_close()
572 CALL xios_context_finalize()
574 END SUBROUTINE wxios_close
!$Id NSTRA real GKLIFT real GVSEC REAL GWD_RANDO_RUWMAX!Maximum Eliassen Palm flux at launch level
subroutine abort_gcm(modname, message, ierr)
!$Id klon initialisation mois suivants day_rain itap ENDIF!Calcul fin de nday_rain calcul nday_rain itap DO i
!$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
!FH On elimine toutes les clefs physiques dans la dynamique prt_level
!$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 pressure_exner real ap!hybrid pressure contribution at interlayers real bp!hybrid sigma contribution at interlayer real based on!preff and scaleheight integer disvert_type!type of vertical!automatic!using z2sig def(or 'esasig.def) file logical pressure_exner!compute pressure inside layers using Exner function
!$Header!integer nvarmx s s unit
!$Header!gestion des impressions de sorties et de débogage la sortie standard prt_level COMMON comprint lunout