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