Changeset 3736 for trunk


Ignore:
Timestamp:
Apr 25, 2025, 10:57:05 AM (3 months ago)
Author:
afalco
Message:

Pluto: added missing controle descriptor parameters.
Update for restarts from generic (restarts in 1D)
AF

Location:
trunk/LMDZ.PLUTO/libf/phypluto
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/LMDZ.PLUTO/libf/phypluto/iostart.F90

    r3709 r3736  
    44PRIVATE
    55    INTEGER,SAVE :: nid_start ! NetCDF file identifier for startfi.nc file
    6     INTEGER,SAVE :: nid_restart ! NetCDF file identifier for restartfi.nc file
    7 !$OMP THREADPRIVATE(nid_start,nid_restart)
    8    
     6    ! INTEGER,SAVE :: nid_restart ! NetCDF file identifier for restartfi.nc file
     7!$OMP THREADPRIVATE(nid_start)
     8
    99    ! restartfi.nc file dimension identifiers: (see open_restartphy())
    1010    INTEGER,SAVE :: idim1 ! "index" dimension
     
    1616    INTEGER,SAVE :: idim7 ! "Time" dimension
    1717    INTEGER,SAVE :: idim8 ! "ocean_layers" dimension
     18!$OMP THREADPRIVATE(idim1,idim2,idim3,idim4,idim5,idim6,idim7,idim8)
     19    INTEGER,SAVE :: idim10 ! "descriptor" dimension
     20    INTEGER,SAVE :: idim11 ! "description_size" dimension
    1821    INTEGER,SAVE :: timeindex ! current time index (for time-dependent fields)
    19 !$OMP THREADPRIVATE(idim1,idim2,idim3,idim4,idim5,idim6,idim7,timeindex)
     22!$OMP THREADPRIVATE(idim10,idim11,timeindex)
    2023    INTEGER,PARAMETER :: length=100 ! size of tab_cntrl array
    21    
     24    INTEGER,PARAMETER :: ldscrpt = 35 ! size of dscrpt_tab_cntrl array
     25    INTEGER,PARAMETER :: ndscrpt = 50 ! size of characters in dscrpt_tab_cntrl array
     26
    2227    INTERFACE get_field
    2328      MODULE PROCEDURE Get_field_r1,Get_field_r2,Get_field_r3
    2429    END INTERFACE get_field
    25    
     30
    2631    INTERFACE get_var
    2732      MODULE PROCEDURE get_var_r0,Get_var_r1,Get_var_r2,Get_var_r3
     
    3338
    3439    INTERFACE put_var
    35       MODULE PROCEDURE put_var_r0,put_var_r1,put_var_r2,put_var_r3
     40      MODULE PROCEDURE put_var_r0,put_var_r1,put_var_r2,put_var_r3,put_var_c1
    3641    END INTERFACE put_var
    3742
    38     PUBLIC nid_start, length
     43    PUBLIC nid_start, length, ldscrpt, ndscrpt
    3944    PUBLIC get_field,get_var,put_field,put_var
    4045    PUBLIC inquire_dimension, inquire_dimension_length
    4146    PUBLIC inquire_field, inquire_field_ndims
    42     PUBLIC open_startphy,close_startphy,open_restartphy,close_restartphy
    43    
     47    PUBLIC open_startphy,close_startphy,create_restartphy,open_restartphy,close_restartphy
     48
    4449CONTAINS
    4550
    46   SUBROUTINE open_startphy(filename)
     51  SUBROUTINE open_startphy(filename,nid_start)
    4752  USE netcdf, only: NF90_OPEN, NF90_NOERR, NF90_NOWRITE, nf90_strerror
    4853  USE mod_phys_lmdz_para, only: is_master, bcast
    4954  IMPLICIT NONE
    50     CHARACTER(LEN=*) :: filename
    51     INTEGER          :: ierr
     55    CHARACTER(LEN=*)      :: filename
     56    INTEGER,INTENT(INOUT) :: nid_start
     57    INTEGER               :: ierr
    5258
    5359    IF (is_master) THEN
     
    5662        write(*,*)'open_startphy: problem opening file '//trim(filename)
    5763        write(*,*)trim(nf90_strerror(ierr))
    58         CALL abort_physic("open_startphy","Failed opening file",1)
    59       ENDIF
    60     ENDIF
    61    
     64        CALL abort_physic("open_startphy","Cannot open file",1)
     65      ENDIF
     66    ENDIF
     67
    6268    CALL bcast(nid_start) ! tell all procs about nid_start
    63  
     69
    6470  END SUBROUTINE open_startphy
    6571
    66   SUBROUTINE close_startphy
     72  SUBROUTINE close_startphy(nid_start)
    6773  USE netcdf, only: NF90_CLOSE
    6874  USE mod_phys_lmdz_para, only: is_master
    6975  IMPLICIT NONE
    70     INTEGER          :: ierr
     76    INTEGER,INTENT(IN) :: nid_start
     77    INTEGER            :: ierr
    7178
    7279    IF (is_master) THEN
     
    7784
    7885
    79   FUNCTION inquire_field(Field_name)
     86  FUNCTION inquire_field(nid_start,Field_name)
    8087  ! check if a given field is present in the input file
    8188  USE netcdf, only: NF90_INQ_VARID, NF90_NOERR
    8289  USE mod_phys_lmdz_para, only: is_master, bcast
    8390  IMPLICIT NONE
     91    INTEGER,INTENT(IN)          :: nid_start
    8492    CHARACTER(LEN=*),INTENT(IN) :: Field_name
    8593    LOGICAL :: inquire_field
    8694    INTEGER :: varid
    8795    INTEGER :: ierr
    88    
     96
    8997    IF (is_master) THEN
    9098      ierr=NF90_INQ_VARID(nid_start,Field_name,varid)
     
    101109
    102110
    103   FUNCTION inquire_field_ndims(Field_name)
    104   ! give the number of dimensions of "Field_name" stored in the input file 
     111  FUNCTION inquire_field_ndims(nid_start,Field_name)
     112  ! give the number of dimensions of "Field_name" stored in the input file
    105113  USE netcdf, only: nf90_inq_varid, nf90_inquire_variable, &
    106114                    NF90_NOERR, nf90_strerror
    107115  USE mod_phys_lmdz_para, only: is_master, bcast
    108116  IMPLICIT NONE
     117    INTEGER,INTENT(IN)          :: nid_start
    109118    CHARACTER(LEN=*),INTENT(IN) :: Field_name
    110119    INTEGER :: inquire_field_ndims
    111120    INTEGER :: varid
    112121    INTEGER :: ierr
    113    
     122
    114123    IF (is_master) THEN
    115124      ierr=nf90_inq_varid(nid_start,Field_name,varid)
     
    120129                  //trim(field_name)
    121130        write(*,*)trim(nf90_strerror(ierr))
    122         CALL abort_physic("inquire_field_ndims","Failed geting ndims",1)
     131        CALL abort_physic("inquire_field_ndims","Failed to get ndims",1)
    123132      ENDIF
    124133    ENDIF
     
    129138
    130139
    131   FUNCTION inquire_dimension(Field_name)
     140  FUNCTION inquire_dimension(nid_start,Field_name)
    132141  ! check if a given dimension is present in the input file
    133142  USE netcdf, only: nf90_inq_dimid, NF90_NOERR
    134143  USE mod_phys_lmdz_para, only: is_master, bcast
    135144  IMPLICIT NONE
     145    INTEGER,INTENT(IN)          :: nid_start
    136146    CHARACTER(LEN=*),INTENT(IN) :: Field_name
    137147    LOGICAL :: inquire_dimension
    138148    INTEGER :: varid
    139149    INTEGER :: ierr
    140    
     150
    141151    IF (is_master) THEN
    142152      ierr=NF90_INQ_DIMID(nid_start,Field_name,varid)
     
    152162  END FUNCTION inquire_dimension
    153163
    154   FUNCTION inquire_dimension_length(Field_name)
     164  FUNCTION inquire_dimension_length(nid_start,Field_name)
    155165  ! give the length of the "Field_name" dimension stored in the input file
    156166  USE netcdf, only: nf90_inquire_dimension, nf90_inq_dimid, &
     
    158168  USE mod_phys_lmdz_para, only: is_master, bcast
    159169  IMPLICIT NONE
     170    INTEGER,INTENT(IN)          :: nid_start
    160171    CHARACTER(LEN=*),INTENT(IN) :: Field_name
    161172    INTEGER :: inquire_dimension_length
    162173    INTEGER :: varid
    163174    INTEGER :: ierr
    164    
     175
    165176    IF (is_master) THEN
    166177      ierr=nf90_inq_dimid(nid_start,Field_name,varid)
     
    171182                  //trim(field_name)
    172183        write(*,*)trim(nf90_strerror(ierr))
    173         CALL abort_physic("inquire_dimension_length","Failed geting dim length",1)
     184        CALL abort_physic("inquire_field_ndims","Failed to get length",1)
    174185      ENDIF
    175186    ENDIF
     
    181192
    182193
    183   SUBROUTINE Get_Field_r1(field_name,field,found,timeindex)
     194  SUBROUTINE Get_Field_r1(nid_start,field_name,field,found,timeindex)
    184195  ! For a surface field
    185196  use mod_grid_phy_lmdz, only: klon_glo ! number of atmospheric columns (full grid)
    186197  IMPLICIT NONE
     198    INTEGER,INTENT(IN)             :: nid_start
    187199    CHARACTER(LEN=*),INTENT(IN)    :: Field_name
    188200    REAL,INTENT(INOUT)               :: Field(:)
    189     LOGICAL,INTENT(OUT),OPTIONAL   :: found 
     201    LOGICAL,INTENT(OUT),OPTIONAL   :: found
    190202    INTEGER,INTENT(IN),OPTIONAL    :: timeindex ! time index of sought data
    191203
     
    200212
    201213    IF (PRESENT(found)) THEN
    202       CALL Get_field_rgen(field_name,field,1,corners,edges,found)
     214      CALL Get_field_rgen(nid_start,field_name,field,1,corners,edges,found)
    203215    ELSE
    204       CALL Get_field_rgen(field_name,field,1,corners,edges)
    205     ENDIF
    206      
     216      CALL Get_field_rgen(nid_start,field_name,field,1,corners,edges)
     217    ENDIF
     218
    207219  END SUBROUTINE Get_Field_r1
    208  
    209   SUBROUTINE Get_Field_r2(field_name,field,found,timeindex)
     220
     221  SUBROUTINE Get_Field_r2(nid_start,field_name,field,found,timeindex)
    210222  ! For a "3D" horizontal-vertical field
    211223  use mod_grid_phy_lmdz, only: klon_glo ! number of atmospheric columns (full grid)
    212224  IMPLICIT NONE
     225    INTEGER,INTENT(IN)             :: nid_start
    213226    CHARACTER(LEN=*),INTENT(IN)    :: Field_name
    214227    REAL,INTENT(INOUT)               :: Field(:,:)
    215     LOGICAL,INTENT(OUT),OPTIONAL   :: found 
     228    LOGICAL,INTENT(OUT),OPTIONAL   :: found
    216229    INTEGER,INTENT(IN),OPTIONAL    :: timeindex ! time index of sought data
    217230
     
    225238      corners(3)=timeindex
    226239    endif
    227    
     240
    228241    IF (PRESENT(found)) THEN
    229       CALL Get_field_rgen(field_name,field,size(field,2),&
     242      CALL Get_field_rgen(nid_start,field_name,field,size(field,2),&
    230243                          corners,edges,found)
    231244    ELSE
    232       CALL Get_field_rgen(field_name,field,size(field,2),&
     245      CALL Get_field_rgen(nid_start,field_name,field,size(field,2),&
    233246                          corners,edges)
    234247    ENDIF
    235248
    236      
     249
    237250  END SUBROUTINE Get_Field_r2
    238  
    239   SUBROUTINE Get_Field_r3(field_name,field,found,timeindex)
     251
     252  SUBROUTINE Get_Field_r3(nid_start,field_name,field,found,timeindex)
    240253  ! for a "4D" field surf/alt/??
    241254  use mod_grid_phy_lmdz, only: klon_glo ! number of atmospheric columns (full grid)
    242255  IMPLICIT NONE
     256    INTEGER,INTENT(IN)             :: nid_start
    243257    CHARACTER(LEN=*),INTENT(IN)    :: Field_name
    244258    REAL,INTENT(INOUT)               :: Field(:,:,:)
    245     LOGICAL,INTENT(OUT),OPTIONAL   :: found 
     259    LOGICAL,INTENT(OUT),OPTIONAL   :: found
    246260    INTEGER,INTENT(IN),OPTIONAL    :: timeindex ! time index of sought data
    247261
     
    256270      corners(4)=timeindex
    257271    endif
    258    
     272
    259273    IF (PRESENT(found)) THEN
    260       CALL Get_field_rgen(field_name,field,size(field,2)*size(field,3),&
     274      CALL Get_field_rgen(nid_start,field_name,field,size(field,2)*size(field,3),&
    261275                          corners,edges,found)
    262276    ELSE
    263       CALL Get_field_rgen(field_name,field,size(field,2)*size(field,3),&
     277      CALL Get_field_rgen(nid_start,field_name,field,size(field,2)*size(field,3),&
    264278                          corners,edges)
    265279    ENDIF
    266      
     280
    267281  END SUBROUTINE Get_Field_r3
    268  
    269   SUBROUTINE Get_field_rgen(field_name,field,field_size, &
     282
     283  SUBROUTINE Get_field_rgen(nid_start,field_name,field,field_size, &
    270284                            corners,edges,found)
    271285  USE netcdf, ONLY: NF90_INQ_VARID, NF90_GET_VAR, NF90_NOERR
     
    275289  USE mod_phys_lmdz_para, ONLY: is_master, bcast, scatter, gather
    276290  IMPLICIT NONE
     291    INTEGER,INTENT(IN) :: nid_start
    277292    CHARACTER(LEN=*),INTENT(IN) :: Field_name
    278293    INTEGER,INTENT(IN) :: field_size
     
    281296    INTEGER,INTENT(IN) :: edges(4)
    282297    LOGICAL,OPTIONAL,INTENT(OUT) :: found
    283    
    284     REAL :: field_glo(klon_glo,field_size) ! field on global grid
     298
     299    REAL    :: field_glo(klon_glo,field_size) ! field on global grid
    285300    REAL :: field_glo_tmp(klon_glo,field_size)
    286301    INTEGER :: ind_cell_glo_glo(klon_glo) ! cell indexes on global grid
    287 
    288302    LOGICAL :: tmp_found
    289303    INTEGER :: varid
    290304    INTEGER :: ierr, i
    291    
     305
    292306    ! gather columns indexes on global grid
    293307    CALL gather(ind_cell_glo,ind_cell_glo_glo)
    294    
    295     IF (is_master) THEN
    296  
     308
     309    IF (is_master) THEN
     310
    297311      ierr=NF90_INQ_VARID(nid_start,Field_name,varid)
    298      
     312
    299313      IF (ierr==NF90_NOERR) THEN
    300         CALL body(field_glo_tmp)
     314        CALL body(field_glo_tmp,nid_start)
    301315        tmp_found=.TRUE.
    302316      ELSE
    303317        tmp_found=.FALSE.
    304318      ENDIF
    305    
     319
    306320    ENDIF ! of IF (is_master)
    307    
     321
    308322    CALL bcast(tmp_found)
    309323
     
    317331      CALL scatter(field_glo,field)
    318332    ENDIF
    319    
     333
    320334    IF (PRESENT(found)) THEN
    321335      found=tmp_found
     
    323337      IF (.NOT. tmp_found) THEN
    324338        PRINT*, 'get_field_rgen: Field <'//field_name//'> not found'
    325         CALL abort_physic("get_field_rgen","Field not found",1)
    326       ENDIF
    327     ENDIF
    328  
    329    
     339        CALL abort
     340      ENDIF
     341    ENDIF
     342
     343
    330344    CONTAINS
    331      
    332      SUBROUTINE body(field_glo)
     345
     346     SUBROUTINE body(field_glo,nid_start)
    333347       REAL :: field_glo(klon_glo*field_size)
     348       INTEGER,INTENT(IN) :: nid_start
    334349         ierr=NF90_GET_VAR(nid_start,varid,field_glo,corners,edges)
    335350         IF (ierr/=NF90_NOERR) THEN
    336            ! La variable exist dans le fichier mais la lecture a echouee. 
     351           ! La variable exist dans le fichier mais la lecture a echouee.
    337352           PRINT*, 'get_field_rgen: Failed reading <'//field_name//'>'
    338353
     
    345360
    346361
    347   SUBROUTINE get_var_r0(var_name,var,found)
     362  SUBROUTINE get_var_r0(nid_start,var_name,var,found)
    348363  ! Get a scalar from input file
    349   IMPLICIT NONE 
     364  IMPLICIT NONE
     365    INTEGER,INTENT(IN)           :: nid_start
    350366    CHARACTER(LEN=*),INTENT(IN)  :: var_name
    351367    REAL,INTENT(INOUT)             :: var
     
    353369
    354370    REAL                         :: varout(1)
    355    
     371
    356372    IF (PRESENT(found)) THEN
    357       CALL Get_var_rgen(var_name,varout,size(varout),found)
     373      CALL Get_var_rgen(nid_start,var_name,varout,size(varout),found)
    358374    ELSE
    359       CALL Get_var_rgen(var_name,varout,size(varout))
     375      CALL Get_var_rgen(nid_start,var_name,varout,size(varout))
    360376    ENDIF
    361377    var=varout(1)
    362  
     378
    363379  END SUBROUTINE get_var_r0
    364380
    365   SUBROUTINE get_var_r1(var_name,var,found)
     381  SUBROUTINE get_var_r1(nid_start,var_name,var,found)
    366382  ! Get a vector from input file
    367   IMPLICIT NONE 
     383  IMPLICIT NONE
    368384    CHARACTER(LEN=*),INTENT(IN)  :: var_name
    369385    REAL,INTENT(INOUT)             :: var(:)
    370386    LOGICAL,OPTIONAL,INTENT(OUT) :: found
    371    
     387    INTEGER,INTENT(IN)           :: nid_start
     388
    372389    IF (PRESENT(found)) THEN
    373       CALL Get_var_rgen(var_name,var,size(var),found)
     390      CALL Get_var_rgen(nid_start,var_name,var,size(var),found)
    374391    ELSE
    375       CALL Get_var_rgen(var_name,var,size(var))
    376     ENDIF
    377  
     392      CALL Get_var_rgen(nid_start,var_name,var,size(var))
     393    ENDIF
     394
    378395  END SUBROUTINE get_var_r1
    379396
    380   SUBROUTINE get_var_r2(var_name,var,found)
     397  SUBROUTINE get_var_r2(nid_start,var_name,var,found)
    381398  ! Get a 2D field from input file
    382   IMPLICIT NONE 
     399  IMPLICIT NONE
    383400    CHARACTER(LEN=*),INTENT(IN)  :: var_name
    384401    REAL,INTENT(OUT)             :: var(:,:)
    385402    LOGICAL,OPTIONAL,INTENT(OUT) :: found
    386    
     403    INTEGER,INTENT(IN)           :: nid_start
     404
    387405    IF (PRESENT(found)) THEN
    388       CALL Get_var_rgen(var_name,var,size(var),found)
     406      CALL Get_var_rgen(nid_start,var_name,var,size(var),found)
    389407    ELSE
    390       CALL Get_var_rgen(var_name,var,size(var))
    391     ENDIF
    392  
     408      CALL Get_var_rgen(nid_start,var_name,var,size(var))
     409    ENDIF
     410
    393411  END SUBROUTINE get_var_r2
    394412
    395   SUBROUTINE get_var_r3(var_name,var,found)
     413  SUBROUTINE get_var_r3(nid_start,var_name,var,found)
    396414  ! Get a 3D field frominput file
    397   IMPLICIT NONE 
     415  IMPLICIT NONE
    398416    CHARACTER(LEN=*),INTENT(IN)  :: var_name
    399417    REAL,INTENT(INOUT)             :: var(:,:,:)
    400418    LOGICAL,OPTIONAL,INTENT(OUT) :: found
    401    
     419    INTEGER,INTENT(IN)           :: nid_start
     420
    402421    IF (PRESENT(found)) THEN
    403       CALL Get_var_rgen(var_name,var,size(var),found)
     422      CALL Get_var_rgen(nid_start,var_name,var,size(var),found)
    404423    ELSE
    405       CALL Get_var_rgen(var_name,var,size(var))
    406     ENDIF
    407  
     424      CALL Get_var_rgen(nid_start,var_name,var,size(var))
     425    ENDIF
     426
    408427  END SUBROUTINE get_var_r3
    409428
    410   SUBROUTINE Get_var_rgen(var_name,var,var_size,found)
     429  SUBROUTINE Get_var_rgen(nid_start,var_name,var,var_size,found)
    411430  USE netcdf, ONLY: NF90_INQ_VARID, NF90_GET_VAR, NF90_NOERR
    412431  USE mod_phys_lmdz_para, ONLY: is_master, bcast
    413432  IMPLICIT NONE
    414     CHARACTER(LEN=*) :: var_name
    415     INTEGER          :: var_size
    416     REAL             :: var(var_size)
    417     LOGICAL,OPTIONAL :: found
    418    
     433    INTEGER,INTENT(IN) :: nid_start
     434    CHARACTER(LEN=*),INTENT(IN) :: var_name
     435    INTEGER,INTENT(IN) :: var_size
     436    REAL,INTENT(OUT) :: var(var_size)
     437    LOGICAL,OPTIONAL,INTENT(OUT) :: found
     438
    419439    LOGICAL :: tmp_found
    420440    INTEGER :: varid
    421441    INTEGER :: ierr
    422    
    423     IF (is_master) THEN
    424  
     442
     443    IF (is_master) THEN
     444
    425445      ierr=NF90_INQ_VARID(nid_start,var_name,varid)
    426      
     446
    427447      IF (ierr==NF90_NOERR) THEN
    428448        ierr=NF90_GET_VAR(nid_start,varid,var)
     
    435455        tmp_found=.FALSE.
    436456      ENDIF
    437    
    438     ENDIF
    439    
     457
     458    ENDIF
     459
    440460    CALL bcast(tmp_found)
    441461
     
    443463      CALL bcast(var)
    444464    ENDIF
    445    
     465
    446466    IF (PRESENT(found)) THEN
    447467      found=tmp_found
     
    449469      IF (.NOT. tmp_found) THEN
    450470        PRINT*, 'phyetat0: Variable <'//trim(var_name)//'> not found'
    451         CALL abort_physic("get_var_rgen","Variable not found",1)
     471        CALL abort_physic("get_var_rgen","Failed to read variable",1)
    452472      ENDIF
    453473    ENDIF
     
    457477!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    458478
    459   SUBROUTINE open_restartphy(filename)
     479  SUBROUTINE create_restartphy(filename,nid_restart)
    460480  USE netcdf, only: NF90_CREATE, NF90_CLOBBER, NF90_64BIT_OFFSET, &
    461481                    NF90_NOERR, nf90_strerror, &
    462482                    NF90_PUT_ATT, NF90_GLOBAL, NF90_DEF_DIM, &
    463                     NF90_UNLIMITED, NF90_ENDDEF, &
    464                     NF90_WRITE, NF90_OPEN
     483                    NF90_UNLIMITED, NF90_ENDDEF
    465484  USE mod_phys_lmdz_para, only: is_master
    466485  USE mod_grid_phy_lmdz, only: klon_glo
     
    469488  USE comsoil_h, only: nsoilmx
    470489!  USE slab_ice_h, only: noceanmx
    471   ! USE ocean_slab_mod, ONLY: nslay
    472490
    473491  IMPLICIT NONE
    474492    CHARACTER(LEN=*),INTENT(IN) :: filename
     493    INTEGER,INTENT(INOUT)       :: nid_restart
    475494    INTEGER                     :: ierr
    476     LOGICAL,SAVE :: already_created=.false.
    477 !$OMP THREADPRIVATE(already_created)
    478    
    479     IF (is_master) THEN
    480       if (.not.already_created) then
    481         ! At the very first call, create the file
     495
     496    IF (is_master) THEN
     497
    482498        ierr=NF90_CREATE(filename,IOR(NF90_CLOBBER,NF90_64BIT_OFFSET), &
    483499                          nid_restart)
    484500        IF (ierr/=NF90_NOERR) THEN
    485           write(*,*)'open_restartphy: problem creating file '//trim(filename)
     501          write(*,*)'create_restartphy: problem creating file '//trim(filename)
    486502          write(*,*)trim(nf90_strerror(ierr))
    487           CALL abort_physic("open_restartphy","Failed to create file",1)
     503          CALL abort_physic("create_restartphy","Failed creating file",1)
    488504        ENDIF
    489         already_created=.true.
    490       else
    491         ! Just open the file
     505
     506      ierr=NF90_PUT_ATT(nid_restart,NF90_GLOBAL,"title",&
     507                        "Physics start file")
     508      IF (ierr/=NF90_NOERR) THEN
     509        write(*,*)'create_restartphy: problem writing title '
     510        write(*,*)trim(nf90_strerror(ierr))
     511      ENDIF
     512
     513      ierr=NF90_DEF_DIM(nid_restart,"index",length,idim1)
     514      IF (ierr/=NF90_NOERR) THEN
     515        write(*,*)'create_restartphy: problem defining index dimension '
     516        write(*,*)trim(nf90_strerror(ierr))
     517        CALL abort_physic("create_restartphy","Failed defining index",1)
     518      ENDIF
     519
     520      ierr=NF90_DEF_DIM(nid_restart,"physical_points",klon_glo,idim2)
     521      IF (ierr/=NF90_NOERR) THEN
     522        write(*,*)'create_restartphy: problem defining physical_points dimension '
     523        write(*,*)trim(nf90_strerror(ierr))
     524        CALL abort_physic("create_restartphy","Failed defining physical_points",1)
     525      ENDIF
     526
     527      ierr=NF90_DEF_DIM(nid_restart,"subsurface_layers",nsoilmx,idim3)
     528      IF (ierr/=NF90_NOERR) THEN
     529        write(*,*)'create_restartphy: problem defining subsurface_layers dimension '
     530        write(*,*)trim(nf90_strerror(ierr))
     531        CALL abort_physic("create_restartphy","Failed defining subsurface_layers",1)
     532      ENDIF
     533
     534      ierr=NF90_DEF_DIM(nid_restart,"nlayer_plus_1",klevp1,idim4)
     535      IF (ierr/=NF90_NOERR) THEN
     536        write(*,*)'create_restartphy: problem defining nlayer_plus_1 dimension '
     537        write(*,*)trim(nf90_strerror(ierr))
     538        CALL abort_physic("create_restartphy","Failed defining nlayer_plus_1",1)
     539      ENDIF
     540
     541      if (nqtot>0) then
     542        ! only define a tracer dimension if there are tracers
     543        ierr=NF90_DEF_DIM(nid_restart,"number_of_advected_fields",nqtot,idim5)
     544        IF (ierr/=NF90_NOERR) THEN
     545          write(*,*)'create_restartphy: problem defining number_of_advected_fields dimension '
     546          write(*,*)trim(nf90_strerror(ierr))
     547          CALL abort_physic("create_restartphy","Failed defining number_of_advected_fields",1)
     548        ENDIF
     549      endif
     550
     551      ierr=NF90_DEF_DIM(nid_restart,"nlayer",klev,idim6)
     552      IF (ierr/=NF90_NOERR) THEN
     553        write(*,*)'create_restartphy: problem defining nlayer dimension '
     554        write(*,*)trim(nf90_strerror(ierr))
     555        CALL abort_physic("create_restartphy","Failed defining nlayer",1)
     556      ENDIF
     557
     558      ierr=NF90_DEF_DIM(nid_restart,"Time",NF90_UNLIMITED,idim7)
     559      IF (ierr/=NF90_NOERR) THEN
     560        write(*,*)'create_restartphy: problem defining Time dimension '
     561        write(*,*)trim(nf90_strerror(ierr))
     562        CALL abort_physic("create_restartphy","Failed defining Time",1)
     563      ENDIF
     564
     565      ierr=NF90_DEF_DIM(nid_restart,"descriptor",ldscrpt,idim10)
     566      IF (ierr/=NF90_NOERR) THEN
     567        write(*,*)'create_restartphy: problem defining descriptor dimension '
     568        write(*,*)trim(nf90_strerror(ierr))
     569        CALL abort_physic("create_restartphy","Failed defining descriptor",1)
     570      ENDIF
     571
     572      ierr=NF90_DEF_DIM(nid_restart,"description_size",ndscrpt,idim11)
     573      IF (ierr/=NF90_NOERR) THEN
     574        write(*,*)'create_restartphy: problem defining description_size dimension '
     575        write(*,*)trim(nf90_strerror(ierr))
     576        CALL abort_physic("create_restartphy","Failed defining description_size",1)
     577      ENDIF
     578
     579      ierr=NF90_ENDDEF(nid_restart)
     580      IF (ierr/=NF90_NOERR) THEN
     581        write(*,*)'create_restartphy: problem ending definition mode '
     582        write(*,*)trim(nf90_strerror(ierr))
     583        CALL abort_physic("create_restartphy","Failed ending definition mode",1)
     584      ENDIF
     585    ENDIF
     586
     587  END SUBROUTINE create_restartphy
     588
     589  SUBROUTINE open_restartphy(filename,nid_restart)
     590  USE netcdf, only: NF90_OPEN, NF90_NOERR, NF90_WRITE, nf90_strerror
     591  USE mod_phys_lmdz_para, only: is_master
     592
     593  IMPLICIT NONE
     594    CHARACTER(LEN=*),INTENT(IN) :: filename
     595    INTEGER,INTENT(INOUT)       :: nid_restart
     596    INTEGER                     :: ierr
     597
     598    IF (is_master) THEN
    492599        ierr=NF90_OPEN(filename,NF90_WRITE,nid_restart)
    493600        IF (ierr/=NF90_NOERR) THEN
    494601          write(*,*)'open_restartphy: problem opening file '//trim(filename)
    495602          write(*,*)trim(nf90_strerror(ierr))
    496           CALL abort_physic("open_restartphy","Failed to open file",1)
     603          CALL abort_physic("open_restartphy","Failed opening file",1)
    497604        ENDIF
    498         return
    499       endif ! of if (.not.already_created)
    500 
    501       ierr=NF90_PUT_ATT(nid_restart,NF90_GLOBAL,"title",&
    502                         "Physics start file")
    503       IF (ierr/=NF90_NOERR) THEN
    504         write(*,*)'open_restartphy: problem writing title '
    505         write(*,*)trim(nf90_strerror(ierr))
    506       ENDIF
    507 
    508       ierr=NF90_DEF_DIM(nid_restart,"index",length,idim1)
    509       IF (ierr/=NF90_NOERR) THEN
    510         write(*,*)'open_restartphy: problem defining index dimension '
    511         write(*,*)trim(nf90_strerror(ierr))
    512         CALL abort_physic("open_restartphy","Failed defining index dim",1)
    513       ENDIF
    514      
    515       ierr=NF90_DEF_DIM(nid_restart,"physical_points",klon_glo,idim2)
    516       IF (ierr/=NF90_NOERR) THEN
    517         write(*,*)'open_restartphy: problem defining physical_points dimension '
    518         write(*,*)trim(nf90_strerror(ierr))
    519         CALL abort_physic("open_restartphy","Failed defining physical_points dim",1)
    520       ENDIF
    521      
    522       ierr=NF90_DEF_DIM(nid_restart,"subsurface_layers",nsoilmx,idim3)
    523       IF (ierr/=NF90_NOERR) THEN
    524         write(*,*)'open_restartphy: problem defining subsurface_layers dimension '
    525         write(*,*)trim(nf90_strerror(ierr))
    526         CALL abort_physic("open_restartphy","Failed defining subsurface_layers dim",1)
    527       ENDIF
    528      
    529       ierr=NF90_DEF_DIM(nid_restart,"nlayer_plus_1",klevp1,idim4)
    530       IF (ierr/=NF90_NOERR) THEN
    531         write(*,*)'open_restartphy: problem defining nlayer_plus_1 dimension '
    532         write(*,*)trim(nf90_strerror(ierr))
    533         CALL abort_physic("open_restartphy","Failed defining nlayer_plus_1 dim",1)
    534       ENDIF
    535      
    536       if (nqtot>0) then
    537         ! only define a tracer dimension if there are tracers
    538         ierr=NF90_DEF_DIM(nid_restart,"number_of_advected_fields",nqtot,idim5)
    539         IF (ierr/=NF90_NOERR) THEN
    540           write(*,*)'open_restartphy: problem defining number_of_advected_fields dimension '
    541           write(*,*)trim(nf90_strerror(ierr))
    542           CALL abort_physic("open_restartphy","Failed defining number_of_advected_fields dim",1)
    543         ENDIF
    544       endif
    545 
    546       ierr=NF90_DEF_DIM(nid_restart,"nlayer",klev,idim6)
    547       IF (ierr/=NF90_NOERR) THEN
    548         write(*,*)'open_restartphy: problem defining nlayer dimension '
    549         write(*,*)trim(nf90_strerror(ierr))
    550         CALL abort_physic("open_restartphy","Failed defining nlayer dim",1)
    551       ENDIF
    552      
    553       ierr=NF90_DEF_DIM(nid_restart,"Time",NF90_UNLIMITED,idim7)
    554       IF (ierr/=NF90_NOERR) THEN
    555         write(*,*)'open_restartphy: problem defining Time dimension '
    556         write(*,*)trim(nf90_strerror(ierr))
    557         CALL abort_physic("open_restartphy","Failed defining Time dim",1)
    558       ENDIF
    559 
    560       ierr=NF90_ENDDEF(nid_restart)
    561       IF (ierr/=NF90_NOERR) THEN
    562         write(*,*)'open_restartphy: problem ending definition mode '
    563         write(*,*)trim(nf90_strerror(ierr))
    564         CALL abort_physic("open_restartphy","Failed ending definition mode",1)
    565       ENDIF
    566605    ENDIF
    567606
    568607  END SUBROUTINE open_restartphy
    569608
    570   SUBROUTINE close_restartphy
     609  SUBROUTINE close_restartphy(nid_restart)
    571610  USE netcdf, only: NF90_CLOSE
    572611  USE mod_phys_lmdz_para, only: is_master
    573612  IMPLICIT NONE
    574     INTEGER          :: ierr
     613    INTEGER,INTENT(IN) :: nid_restart
     614    INTEGER            :: ierr
    575615
    576616    IF (is_master) THEN
    577617      ierr = NF90_CLOSE (nid_restart)
    578618    ENDIF
    579  
     619
    580620  END SUBROUTINE close_restartphy
    581621
    582   SUBROUTINE put_field_r1(field_name,title,field,time)
     622  SUBROUTINE put_field_r1(nid_restart,field_name,title,field,time)
    583623  ! For a surface field
    584624  IMPLICIT NONE
     625  INTEGER,INTENT(IN)             :: nid_restart
    585626  CHARACTER(LEN=*),INTENT(IN)    :: field_name
    586627  CHARACTER(LEN=*),INTENT(IN)    :: title
    587628  REAL,INTENT(IN)                :: field(:)
    588629  REAL,OPTIONAL,INTENT(IN)       :: time
    589  
     630
    590631  IF (present(time)) THEN
    591632    ! if timeindex is present, it is a time-dependent variable
    592     CALL put_field_rgen(field_name,title,field,1,time)
     633    CALL put_field_rgen(nid_restart,field_name,title,field,1,time)
    593634  ELSE
    594     CALL put_field_rgen(field_name,title,field,1)
     635    CALL put_field_rgen(nid_restart,field_name,title,field,1)
    595636  ENDIF
    596  
     637
    597638  END SUBROUTINE put_field_r1
    598639
    599   SUBROUTINE put_field_r2(field_name,title,field,time)
     640  SUBROUTINE put_field_r2(nid_restart,field_name,title,field,time)
    600641  ! For a "3D" horizontal-vertical field
    601642  IMPLICIT NONE
     643  INTEGER,INTENT(IN)             :: nid_restart
    602644  CHARACTER(LEN=*),INTENT(IN)    :: field_name
    603645  CHARACTER(LEN=*),INTENT(IN)    :: title
    604646  REAL,INTENT(IN)                :: field(:,:)
    605647  REAL,OPTIONAL,INTENT(IN)       :: time
    606  
     648
    607649  IF (present(time)) THEN
    608650    ! if timeindex is present, it is a time-dependent variable
    609     CALL put_field_rgen(field_name,title,field,size(field,2),time)
     651    CALL put_field_rgen(nid_restart,field_name,title,field,size(field,2),time)
    610652  ELSE
    611     CALL put_field_rgen(field_name,title,field,size(field,2))
     653    CALL put_field_rgen(nid_restart,field_name,title,field,size(field,2))
    612654  ENDIF
    613  
     655
    614656  END SUBROUTINE put_field_r2
    615657
    616   SUBROUTINE put_field_r3(field_name,title,field,time)
     658  SUBROUTINE put_field_r3(nid_restart,field_name,title,field,time)
    617659  ! For a "4D" field surf/alt/??
    618660  IMPLICIT NONE
     661  INTEGER,INTENT(IN)             :: nid_restart
    619662  CHARACTER(LEN=*),INTENT(IN)    :: field_name
    620663  CHARACTER(LEN=*),INTENT(IN)    :: title
    621664  REAL,INTENT(IN)                :: field(:,:,:)
    622665  REAL,OPTIONAL,INTENT(IN)       :: time
    623  
     666
    624667  IF (present(time)) THEN
    625668    ! if timeindex is present, it is a time-dependent variable
    626     CALL put_field_rgen(field_name,title,field,size(field,2)*size(field,3),&
     669    CALL put_field_rgen(nid_restart,field_name,title,field,size(field,2)*size(field,3),&
    627670                        time)
    628   ELSE 
    629     CALL put_field_rgen(field_name,title,field,size(field,2)*size(field,3))
     671  ELSE
     672    CALL put_field_rgen(nid_restart,field_name,title,field,size(field,2)*size(field,3))
    630673  ENDIF
    631  
     674
    632675  END SUBROUTINE put_field_r3
    633  
    634   SUBROUTINE put_field_rgen(field_name,title,field,field_size,time)
     676
     677  SUBROUTINE put_field_rgen(nid_restart,field_name,title,field,field_size,time)
    635678  USE netcdf, ONLY: NF90_REDEF, NF90_ENDDEF, NF90_DEF_VAR, NF90_PUT_ATT, &
    636679                    NF90_INQ_VARID, NF90_PUT_VAR, NF90_STRERROR, &
     
    641684  USE mod_phys_lmdz_para, ONLY: is_master, gather
    642685  USE geometry_mod, ONLY: ind_cell_glo
    643 
    644   IMPLICIT NONE
     686!  USE slab_ice_h, only: noceanmx
     687
     688  IMPLICIT NONE
     689  INTEGER,INTENT(IN)             :: nid_restart
    645690  CHARACTER(LEN=*),INTENT(IN)    :: field_name
    646691  CHARACTER(LEN=*),INTENT(IN)    :: title
     
    648693  REAL,INTENT(IN)                :: field(klon,field_size)
    649694  REAL,OPTIONAL,INTENT(IN)       :: time
    650  
     695
    651696  REAL :: field_glo(klon_glo,field_size)
    652697  REAL :: field_glo_tmp(klon_glo,field_size)
    653698  INTEGER :: ind_cell_glo_glo(klon_glo) ! cell indexes on global grid
    654  
     699
    655700  INTEGER                        :: ierr
    656701  INTEGER                        :: nvarid
    657702  INTEGER                        :: idim
    658703  INTEGER :: i
    659    
     704
    660705    ! gather indexes on global grid
    661706    CALL gather(ind_cell_glo,ind_cell_glo_glo)
    662707    ! gather field on master
    663708    CALL gather(field,field_glo_tmp)
    664    
     709
    665710    IF (is_master) THEN
    666711      ! reorder columns
     
    668713        field_glo(ind_cell_glo_glo(i),:)=field_glo_tmp(i,:)
    669714      ENDDO
    670      
     715
    671716      IF (field_size==1) THEN
    672717        ! input is a 1D "surface field" array
     
    838883        endif ! of if (.not.present(time))
    839884
    840 !       ELSE IF (field_size==nslay) THEN
    841 !         ! input is a 2D "oceanic field" array
    842 !         if (.not.present(time)) then ! for a time-independent field
    843 !           ierr = NF90_REDEF(nid_restart)
    844 ! #ifdef NC_DOUBLE
    845 !           ierr=NF90_DEF_VAR(nid_restart,field_name,NF90_DOUBLE,&
    846 !                             (/idim2,idim8/),nvarid)
    847 ! #else
    848 !           ierr=NF90_DEF_VAR(nid_restart,field_name,NF90_FLOAT,&
    849 !                             (/idim2,idim8/),nvarid)
    850 ! #endif
    851 !           if (ierr.ne.NF90_NOERR) then
    852 !             write(*,*)"put_field_rgen error: failed to define "//trim(field_name)
    853 !             write(*,*)trim(nf90_strerror(ierr))
    854 !           endif
    855 !           IF (LEN_TRIM(title) > 0) ierr=NF90_PUT_ATT(nid_restart,nvarid,"title",title)
    856 !           ierr = NF90_ENDDEF(nid_restart)
    857 !           ierr = NF90_PUT_VAR(nid_restart,nvarid,field_glo)
    858 !         else
    859 !           ! check if the variable has already been defined:
    860 !           ierr=NF90_INQ_VARID(nid_restart,field_name,nvarid)
    861 !           if (ierr/=NF90_NOERR) then ! variable not found, define it
    862 !             ierr=NF90_REDEF(nid_restart)
    863 ! #ifdef NC_DOUBLE
    864 !             ierr=NF90_DEF_VAR(nid_restart,field_name,NF90_DOUBLE,&
    865 !                               (/idim2,idim8,idim7/),nvarid)
    866 ! #else
    867 !             ierr=NF90_DEF_VAR(nid_restart,field_name,NF90_FLOAT,&
    868 !                               (/idim2,idim8,idim7/),nvarid)
    869 ! #endif
    870 !            if (ierr.ne.NF90_NOERR) then
    871 !               write(*,*)"put_field_rgen error: failed to define "//trim(field_name)
    872 !               write(*,*)trim(nf90_strerror(ierr))
    873 !             endif
    874 !             IF (LEN_TRIM(title) > 0) ierr=NF90_PUT_ATT(nid_restart,nvarid,"title",title)
    875 !             ierr=NF90_ENDDEF(nid_restart)
    876 !           endif
    877 !           ! Write the variable
    878 !           ierr=NF90_PUT_VAR(nid_restart,nvarid,field_glo,&
    879 !                             start=(/1,1,timeindex/))
    880 
    881 !         endif ! of if (.not.present(time))
    882 
    883 
    884885      ELSE
    885886        PRINT *, "Error phyredem(put_field_rgen) : wrong dimension for ",trim(field_name)
    886887        write(*,*) "  field_size =",field_size
    887         CALL abort_physic("put_field_rgen","Wrong field dimensions",1)
     888        CALL abort_physic("put_field_rgen","wrong field dimension",1)
    888889      ENDIF
    889890
     
    892893        write(*,*) " Error phyredem(put_field_rgen) : failed writing ",trim(field_name)
    893894        write(*,*)trim(nf90_strerror(ierr))
    894         call abort_physic("put_field_rgen","Failed writing variable",1)
     895        CALL abort_physic("put_field_rgen","Failed writing field",1)
    895896      endif
    896897
    897898    ENDIF ! of IF (is_master)
    898    
    899   END SUBROUTINE put_field_rgen 
    900  
    901   SUBROUTINE put_var_r0(var_name,title,var)
     899
     900  END SUBROUTINE put_field_rgen
     901
     902  SUBROUTINE put_var_r0(nid_restart,var_name,title,var)
    902903  ! Put a scalar in file
    903904   IMPLICIT NONE
     905     INTEGER,INTENT(IN)          :: nid_restart
    904906     CHARACTER(LEN=*),INTENT(IN) :: var_name
    905907     CHARACTER(LEN=*),INTENT(IN) :: title
    906908     REAL,INTENT(IN)             :: var
    907909     REAL                        :: varin(1)
    908      
     910
    909911     varin(1)=var
    910      
    911      CALL put_var_rgen(var_name,title,varin,size(varin))
     912
     913     CALL put_var_rgen(nid_restart,var_name,title,varin,size(varin))
    912914
    913915  END SUBROUTINE put_var_r0
    914916
    915917
    916   SUBROUTINE put_var_r1(var_name,title,var)
     918  SUBROUTINE put_var_r1(nid_restart,var_name,title,var)
    917919  ! Put a vector in file
    918920   IMPLICIT NONE
     921     INTEGER,INTENT(IN)          :: nid_restart
    919922     CHARACTER(LEN=*),INTENT(IN) :: var_name
    920923     CHARACTER(LEN=*),INTENT(IN) :: title
    921924     REAL,INTENT(IN)             :: var(:)
    922      
    923      CALL put_var_rgen(var_name,title,var,size(var))
     925
     926     CALL put_var_rgen(nid_restart,var_name,title,var,size(var))
    924927
    925928  END SUBROUTINE put_var_r1
    926  
    927   SUBROUTINE put_var_r2(var_name,title,var)
     929
     930  SUBROUTINE put_var_r2(nid_restart,var_name,title,var)
    928931  ! Put a 2D field in file
    929932   IMPLICIT NONE
     933     INTEGER,INTENT(IN)          :: nid_restart
    930934     CHARACTER(LEN=*),INTENT(IN) :: var_name
    931935     CHARACTER(LEN=*),INTENT(IN) :: title
    932936     REAL,INTENT(IN)             :: var(:,:)
    933      
    934      CALL put_var_rgen(var_name,title,var,size(var))
    935 
    936   END SUBROUTINE put_var_r2     
    937  
    938   SUBROUTINE put_var_r3(var_name,title,var)
     937
     938     CALL put_var_rgen(nid_restart,var_name,title,var,size(var))
     939
     940  END SUBROUTINE put_var_r2
     941
     942  SUBROUTINE put_var_r3(nid_restart,var_name,title,var)
    939943  ! Put a 3D field in file
    940944   IMPLICIT NONE
     945     INTEGER,INTENT(IN)          :: nid_restart
    941946     CHARACTER(LEN=*),INTENT(IN) :: var_name
    942947     CHARACTER(LEN=*),INTENT(IN) :: title
    943948     REAL,INTENT(IN)             :: var(:,:,:)
    944      
    945      CALL put_var_rgen(var_name,title,var,size(var))
     949
     950     CALL put_var_rgen(nid_restart,var_name,title,var,size(var))
    946951
    947952  END SUBROUTINE put_var_r3
    948953
    949   SUBROUTINE put_var_rgen(var_name,title,var,var_size)
     954  SUBROUTINE put_var_rgen(nid_restart,var_name,title,var,var_size)
    950955  USE netcdf, only: NF90_REDEF, NF90_DEF_VAR, NF90_ENDDEF, NF90_PUT_VAR, &
    951956                    NF90_FLOAT, NF90_DOUBLE, &
     
    954959  USE comsoil_h, only: nsoilmx
    955960  USE mod_phys_lmdz_para, only: is_master
    956 !  USE slab_ice_h, only: noceanmx !AF24
    957   ! USE ocean_slab_mod, ONLY: nslay
    958   IMPLICIT NONE
     961!  USE slab_ice_h, only: noceanmx
     962  IMPLICIT NONE
     963    INTEGER,INTENT(IN)          :: nid_restart
    959964     CHARACTER(LEN=*),INTENT(IN) :: var_name
    960965     CHARACTER(LEN=*),INTENT(IN) :: title
    961966     INTEGER,INTENT(IN)          :: var_size
    962967     REAL,INTENT(IN)             :: var(var_size)
    963      
     968
    964969     INTEGER :: ierr
    965970     INTEGER :: nvarid
     
    967972     logical,save :: firsttime=.true.
    968973!$OMP THREADPRIVATE(firsttime)
    969          
     974
    970975    IF (is_master) THEN
    971976
     
    984989          IF (LEN_TRIM(title) > 0) ierr=NF90_PUT_ATT(nid_restart,nvarid,"title",title)
    985990          ierr=NF90_ENDDEF(nid_restart)
    986          
     991
    987992          firsttime=.false.
    988993        endif
     
    9981003          write(*,*)'put_var_rgen: problem writing Time'
    9991004          write(*,*)trim(nf90_strerror(ierr))
    1000           CALL abort_physic("put_var_rgen","Failed writing Time",1)
     1005          CALL abort_physic("put_var_rgen","Failed to write Time",1)
    10011006        ENDIF
    10021007        return ! nothing left to do
     
    10071012        ! We know it is an  "mlayer" kind of 1D array
    10081013        idim1d=idim3
    1009       ! ELSEIF (var_size==nslay) THEN
    1010       !   ! We know it is an  "mlayer" kind of 1D array
    1011       !   idim1d=idim8
    1012       ELSE
     1014      ELSE
    10131015        PRINT *, "put_var_rgen error : wrong dimension"
    10141016        write(*,*) "  var_size =",var_size
    1015         CALL abort_physic("put_var_rgen","Wrong field dimensions",1)
     1017        CALL abort_physic("put_var_rgen","Wrong variable dimension",1)
    10161018
    10171019      ENDIF ! of IF (var_size==length) THEN
     
    10371039      ENDIF
    10381040    ENDIF ! of IF (is_master)
    1039    
    1040   END SUBROUTINE put_var_rgen     
     1041
     1042  END SUBROUTINE put_var_rgen
     1043
     1044  SUBROUTINE put_var_c1(nid_restart,var_name,title,var)
     1045  ! Put a vector of characters in file
     1046
     1047  USE netcdf, only: NF90_REDEF, NF90_DEF_VAR, NF90_ENDDEF, NF90_PUT_VAR, &
     1048                    NF90_CHAR, &
     1049                    NF90_PUT_ATT, NF90_NOERR, nf90_strerror, &
     1050                    nf90_inq_dimid, nf90_inquire_dimension, NF90_INQ_VARID
     1051  USE mod_phys_lmdz_para, only: is_master
     1052
     1053   IMPLICIT NONE
     1054     INTEGER,INTENT(IN)          :: nid_restart
     1055     CHARACTER(LEN=*),INTENT(IN) :: var_name
     1056     CHARACTER(LEN=*),INTENT(IN) :: title
     1057     CHARACTER(LEN=*),INTENT(IN) :: var(:)
     1058
     1059     INTEGER :: ierr
     1060     INTEGER :: nvarid
     1061     INTEGER :: idim1d_1, idim1d_2
     1062     INTEGER :: var_size
     1063
     1064    IF (is_master) THEN
     1065
     1066      var_size = size(var)
     1067      IF (var_size==ldscrpt) THEN
     1068        ! We know it is a "controle descriptor" kind of 1D array
     1069        idim1d_1=idim11
     1070        idim1d_2=idim10
     1071      ELSE
     1072        PRINT *, "put_var_cgen error : wrong dimension"
     1073        write(*,*) "  var_size =",var_size
     1074        CALL abort_physic("put_var_cgen","Wrong variable dimension",1)
     1075
     1076      ENDIF ! of IF (var_size==length) THEN
     1077
     1078      ! Swich to NetCDF define mode
     1079      ierr=NF90_REDEF (nid_restart)
     1080      ! Define the variable
     1081      ierr=NF90_DEF_VAR(nid_restart,var_name,NF90_CHAR,(/idim1d_1,idim1d_2/),nvarid)
     1082      ! Add a "title" attribute
     1083      IF (LEN_TRIM(title)>0) ierr=NF90_PUT_ATT(nid_restart,nvarid,"title",title)
     1084      ! Swich out of define mode
     1085      ierr=NF90_ENDDEF(nid_restart)
     1086      ! Write variable to file
     1087      ierr=NF90_PUT_VAR(nid_restart,nvarid,var)
     1088      IF (ierr/=NF90_NOERR) THEN
     1089        write(*,*)'put_var_cgen: problem writing '//trim(var_name)
     1090        write(*,*)trim(nf90_strerror(ierr))
     1091        CALL abort_physic("put_var_cgen","Failed writing variable",1)
     1092      ENDIF
     1093    ENDIF ! of IF (is_master)
     1094
     1095  END SUBROUTINE put_var_c1
     1096
     1097!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     1098
     1099  SUBROUTINE create_restart1D(filename,nid_restart)
     1100    USE netcdf, only: NF90_CREATE, NF90_CLOBBER, NF90_64BIT_OFFSET, &
     1101                      NF90_NOERR, nf90_strerror, &
     1102                      NF90_PUT_ATT, NF90_GLOBAL, NF90_DEF_DIM, &
     1103                      NF90_UNLIMITED, NF90_ENDDEF
     1104    USE mod_phys_lmdz_para, only: is_master
     1105    USE mod_grid_phy_lmdz, only: klon_glo
     1106    USE dimphy, only: klev, klevp1
     1107    USE tracer_h, only: nqtot
     1108    USE comsoil_h, only: nsoilmx
     1109  !  USE slab_ice_h, only: noceanmx
     1110
     1111    IMPLICIT NONE
     1112      CHARACTER(LEN=*),INTENT(IN) :: filename
     1113      INTEGER,INTENT(INOUT)       :: nid_restart
     1114      INTEGER                     :: ierr
     1115
     1116      IF (is_master) THEN
     1117
     1118          ierr=NF90_CREATE(filename,IOR(NF90_CLOBBER,NF90_64BIT_OFFSET), &
     1119                            nid_restart)
     1120          IF (ierr/=NF90_NOERR) THEN
     1121            write(*,*)'create_restart1D: problem creating file '//trim(filename)
     1122            write(*,*)trim(nf90_strerror(ierr))
     1123            CALL abort_physic("create_restart1D","Failed creating file",1)
     1124          ENDIF
     1125
     1126        ierr=NF90_PUT_ATT(nid_restart,NF90_GLOBAL,"title",&
     1127                          "Physics start file")
     1128        IF (ierr/=NF90_NOERR) THEN
     1129          write(*,*)'create_restart1D: problem writing title '
     1130          write(*,*)trim(nf90_strerror(ierr))
     1131        ENDIF
     1132
     1133        ierr=NF90_DEF_DIM(nid_restart,"physical_points",klon_glo,idim2)
     1134        IF (ierr/=NF90_NOERR) THEN
     1135          write(*,*)'create_restart1D: problem defining physical_points dimension '
     1136          write(*,*)trim(nf90_strerror(ierr))
     1137          CALL abort_physic("create_restart1D","Failed defining physical_points",1)
     1138        ENDIF
     1139
     1140        ierr=NF90_DEF_DIM(nid_restart,"nlayer",klev,idim6)
     1141        IF (ierr/=NF90_NOERR) THEN
     1142          write(*,*)'create_restart1D: problem defining nlayer dimension '
     1143          write(*,*)trim(nf90_strerror(ierr))
     1144          CALL abort_physic("create_restart1D","Failed defining nlayer",1)
     1145        ENDIF
     1146
     1147        ierr=NF90_ENDDEF(nid_restart)
     1148        IF (ierr/=NF90_NOERR) THEN
     1149          write(*,*)'create_restart1D: problem ending definition mode '
     1150          write(*,*)trim(nf90_strerror(ierr))
     1151          CALL abort_physic("create_restart1D","Failed ending definition mode",1)
     1152        ENDIF
     1153      ENDIF
     1154
     1155    END SUBROUTINE create_restart1D
    10411156
    10421157END MODULE iostart
  • trunk/LMDZ.PLUTO/libf/phypluto/phyetat0_mod.F90

    r3635 r3736  
    44
    55real, save :: tab_cntrl_mod(100)
     6
     7integer,save :: nid_start ! NetCDF file identifier for startfi.nc file
    68
    79!$OMP THREADPRIVATE(tab_cntrl_mod)
     
    103105if (startphy_file) then
    104106  ! open physics initial state file:
    105   call open_startphy(fichnom)
     107  call open_startphy(fichnom, nid_start)
    106108
    107109  ! possibility to modify tab_cntrl in tabfi
     
    118120if (startphy_file) then
    119121  ! Load surface geopotential:
    120   call get_field("phisfi",phisfi,found)
     122  call get_field(nid_start,"phisfi",phisfi,found)
    121123  if (.not.found) then
    122124    call abort_physic(modname,"Failed loading <phisfi>",1)
     
    130132if (startphy_file) then
    131133  ! Load bare ground albedo:
    132   call get_field("albedodat",albedodat,found)
     134  call get_field(nid_start,"albedodat",albedodat,found)
    133135  if (.not.found) then
    134136    call abort_physic(modname,"Failed loading <albedodat>",1)
     
    146148! ZMEA
    147149if (startphy_file) then
    148   call get_field("ZMEA",zmea,found)
     150  call get_field(nid_start,"ZMEA",zmea,found)
    149151  if (.not.found) then
    150152    call abort_physic(modname,"Failed loading <ZMEA>",1)
     
    158160! ZSTD
    159161if (startphy_file) then
    160   call get_field("ZSTD",zstd,found)
     162  call get_field(nid_start,"ZSTD",zstd,found)
    161163  if (.not.found) then
    162164    call abort_physic(modname,"Failed loading <ZSTD>",1)
     
    170172! ZSIG
    171173if (startphy_file) then
    172   call get_field("ZSIG",zsig,found)
     174  call get_field(nid_start,"ZSIG",zsig,found)
    173175  if (.not.found) then
    174176    call abort_physic(modname,"Failed loading <ZSIG>",1)
     
    182184! ZGAM
    183185if (startphy_file) then
    184   call get_field("ZGAM",zgam,found)
     186  call get_field(nid_start,"ZGAM",zgam,found)
    185187  if (.not.found) then
    186188    call abort_physic(modname,"Failed loading <ZGAM>",1)
     
    194196! ZTHE
    195197if (startphy_file) then
    196   call get_field("ZTHE",zthe,found)
     198  call get_field(nid_start,"ZTHE",zthe,found)
    197199  if (.not.found) then
    198200    call abort_physic(modname,"Failed loading <ZTHE>",1)
     
    206208! Surface temperature :
    207209if (startphy_file) then
    208   call get_field("tsurf",tsurf,found,indextime)
     210  call get_field(nid_start,"tsurf",tsurf,found,indextime)
    209211  if (.not.found) then
    210212    call abort_physic(modname,"Failed loading <tsurf>",1)
     
    218220! Surface emissivity
    219221if (startphy_file) then
    220   call get_field("emis",emis,found,indextime)
     222  call get_field(nid_start,"emis",emis,found,indextime)
    221223  if (.not.found) then
    222224    call abort_physic(modname,"Failed loading <emis>",1)
     
    236238! pbl wind variance
    237239if (startphy_file) then
    238   call get_field("q2",q2,found,indextime)
     240  call get_field(nid_start,"q2",q2,found,indextime)
    239241  if (.not.found) then
    240242    call abort_physic(modname,"Failed loading <q2>",1)
     
    251253    txt=noms(iq)
    252254    if (startphy_file) then
    253       call get_field(txt,qsurf(:,iq),found,indextime)
     255      call get_field(nid_start,txt,qsurf(:,iq),found,indextime)
    254256      if (.not.found) then
    255257        write(*,*) "phyetat0: Failed loading <",trim(txt),">"
     
    283285! close file:
    284286!
    285 if (startphy_file) call close_startphy
     287if (startphy_file) call close_startphy(nid_start)
    286288
    287289end subroutine phyetat0
  • trunk/LMDZ.PLUTO/libf/phypluto/phyredem.F90

    r3735 r3736  
    22
    33implicit none
     4
     5INTEGER,SAVE :: nid_restart ! NetCDF file identifier for restartfi.nc file
    46
    57contains
     
    1517                       iceradius, dtemisice, phisfi
    1618  use iostart, only : open_restartphy, close_restartphy, &
    17                       put_var, put_field, length
     19                      put_var, put_field, length, ldscrpt, ndscrpt
    1820  use mod_grid_phy_lmdz, only : klon_glo
    1921  use planete_mod, only: year_day, periastr, apoastr, peri_day, &
     
    8183
    8284  ! Create physics start file
    83   call open_restartphy(filename)
     85  call open_restartphy(filename,nid_restart)
    8486
    8587! tab_cntrl() contains run parameters
     
    133135  tab_cntrl(35) = volcapa ! soil volumetric heat capacity
    134136
    135   call put_var("controle","Control parameters",tab_cntrl)
     137  call put_var(nid_restart,"controle","Control parameters",tab_cntrl)
    136138
    137139  ! Write the controle array descriptor
     
    140142
    141143  ! Write the mid-layer depths
    142   call put_var("soildepth","Soil mid-layer depth",mlayer)
     144  call put_var(nid_restart,"soildepth","Soil mid-layer depth",mlayer)
    143145
    144146  ! Write longitudes
    145   call put_field("longitude","Longitudes of physics grid",lonfi)
     147  call put_field(nid_restart,"longitude","Longitudes of physics grid",lonfi)
    146148
    147149  ! Write latitudes
    148   call put_field("latitude","Latitudes of physics grid",latfi)
     150  call put_field(nid_restart,"latitude","Latitudes of physics grid",latfi)
    149151
    150152  ! Write mesh areas
    151   call put_field("area","Mesh area",cell_area)
     153  call put_field(nid_restart,"area","Mesh area",cell_area)
    152154
    153155  ! Write surface geopotential
    154   call put_field("phisfi","Geopotential at the surface",phisfi)
     156  call put_field(nid_restart,"phisfi","Geopotential at the surface",phisfi)
    155157
    156158  ! Write surface albedo
    157   !call put_field("albedodat","Albedo of bare ground",alb)
     159  !call put_field(nid_restart,"albedodat","Albedo of bare ground",alb)
    158160
    159161  ! Subgrid topogaphy variables
    160   call put_field("ZMEA","Relief: mean relief",zmea)
    161   call put_field("ZSTD","Relief: standard deviation",zstd)
    162   call put_field("ZSIG","Relief: sigma parameter",zsig)
    163   call put_field("ZGAM","Relief: gamma parameter",zgam)
    164   call put_field("ZTHE","Relief: theta parameter",zthe)
     162  call put_field(nid_restart,"ZMEA","Relief: mean relief",zmea)
     163  call put_field(nid_restart,"ZSTD","Relief: standard deviation",zstd)
     164  call put_field(nid_restart,"ZSIG","Relief: sigma parameter",zsig)
     165  call put_field(nid_restart,"ZGAM","Relief: gamma parameter",zgam)
     166  call put_field(nid_restart,"ZTHE","Relief: theta parameter",zthe)
    165167
    166168  ! Close file
    167   call close_restartphy
     169  call close_restartphy(nid_restart)
    168170
    169171end subroutine physdem0
     
    197199
    198200  ! Open file
    199   call open_restartphy(filename)
     201  call open_restartphy(filename, nid_restart)
    200202
    201203  ! First variable to write must be "Time", in order to correctly
     
    204206
    205207  ! Surface temperature
    206   call put_field("tsurf","Surface temperature",tsurf)
     208  call put_field(nid_restart,"tsurf","Surface temperature",tsurf)
    207209
    208210  ! Soil inertia
    209   call put_field("inertiedat","Soil thermal inertia",inertiesoil)
     211  call put_field(nid_restart,"inertiedat","Soil thermal inertia",inertiesoil)
    210212
    211213  ! Soil temperature
    212   call put_field("tsoil","Soil temperature",tsoil)
     214  call put_field(nid_restart,"tsoil","Soil temperature",tsoil)
    213215
    214216  ! Emissivity of the surface
    215   call put_field("emis","Surface emissivity",emis)
     217  call put_field(nid_restart,"emis","Surface emissivity",emis)
    216218
    217219  ! Albedo of the surface
    218   call put_field("albedodat","Albedo of bare ground",alb)
     220  call put_field(nid_restart,"albedodat","Albedo of bare ground",alb)
    219221
    220222  ! Planetary Boundary Layer
    221   call put_field("q2","pbl wind variance",q2)
     223  call put_field(nid_restart,"q2","pbl wind variance",q2)
    222224
    223225! cloud fraction and sea ice !AF24: removed
     
    228230  if (nq>0) then
    229231    do iq=1,nq
    230       call put_field(noms(iq),"tracer on surface",qsurf(:,iq))
     232      call put_field(nid_restart,noms(iq),"tracer on surface",qsurf(:,iq))
    231233    enddo
    232234  endif ! of if (nq>0)
     
    235237
    236238! close file
    237       CALL close_restartphy
     239      CALL close_restartphy(nid_restart)
    238240!$OMP BARRIER
    239241
  • trunk/LMDZ.PLUTO/libf/phypluto/soil_settings.F90

    r3503 r3736  
    8282! -------------------
    8383! 1.1 Start by reading how many layers of soil there are
    84         dimlen=inquire_dimension_length("subsurface_layers")
     84        dimlen=inquire_dimension_length(nid,"subsurface_layers")
    8585
    8686        if (dimlen.ne.nsoil) then
     
    9898
    9999        ! check if olmlayer distribution matches current one
    100         call get_var("soildepth",oldmlayer,found)
     100        call get_var(nid,"soildepth",oldmlayer,found)
    101101        if (found) then
    102102          malpha=oldmlayer(2)/oldmlayer(1)
     
    118118
    119119! 1.2 Find out the # of dimensions <inertiedat> was defined as using
    120       ndims=inquire_field_ndims("inertiedat")
     120      ndims=inquire_field_ndims(nid,"inertiedat")
    121121! 1.3 Read depths values or set olddepthdef flag and values
    122122      if (ndims.eq.1) then ! we know that there is none
     
    139139        ! read <depth> coordinate
    140140        if (interpol) then !put values in oldmlayer
    141           call get_var("soildepth",oldmlayer,found)
     141          call get_var(nid,"soildepth",oldmlayer,found)
    142142          if (.not.found) then
    143143            if (is_master) write(*,*)'soil_settings: Problem while reading <soildepth>'
    144144          endif
    145145        else ! put values in mlayer
    146           call get_var("soildepth",mlayer,found)
     146          call get_var(nid,"soildepth",mlayer,found)
    147147          if (is_master) print*,"mlayer",mlayer
    148148          if (.not.found) then
     
    206206       ! Read Surface thermal inertia
    207207       allocate(surfinertia(ngrid))
    208        call get_field("inertiedat",surfinertia,found)
     208       call get_field(nid,"inertiedat",surfinertia,found)
    209209       if (.not.found) then
    210210         if (is_master) write(*,*) "soil_settings: Failed loading <inertiedat>"
     
    229229           endif
    230230         endif ! of if (.not.allocated(oldinertiedat))
    231         call get_field("inertiedat",oldinertiedat,found)
     231        call get_field(nid,"inertiedat",oldinertiedat,found)
    232232        if (.not.found) then
    233233          if (is_master) write(*,*) "soil_settings: Failed loading <inertiedat>"
     
    235235        endif
    236236       else ! put values in therm_i
    237          call get_field("inertiedat",inertiedat,found)
     237         call get_field(nid,"inertiedat",inertiedat,found)
    238238         if (.not.found) then
    239239           if (is_master) write(*,*) "soil_settings: Failed loading <inertiedat>"
     
    247247! -------------------------
    248248!      ierr=nf90_inq_varid(nid,"tsoil",nvarid)
    249       ok=inquire_field("tsoil")
     249      ok=inquire_field(nid,"tsoil")
    250250!      if (ierr.ne.nf90_noerr) then
    251251      if (.not.ok) then
     
    265265           endif
    266266         endif
    267          call get_field("tsoil",oldtsoil,found)
     267         call get_field(nid,"tsoil",oldtsoil,found)
    268268         if (.not.found) then
    269269           if (is_master) write(*,*) "soil_settings: Failed loading <tsoil>"
     
    271271         endif
    272272       else ! put values in tsoil
    273          call get_field("tsoil",tsoil,found,timeindex=indextime)
     273         call get_field(nid,"tsoil",tsoil,found,timeindex=indextime)
    274274         if (.not.found) then
    275275           if (is_master) write(*,*) "soil_settings: Failed loading <tsoil>"
  • trunk/LMDZ.PLUTO/libf/phypluto/tabfi_mod.F90

    r3477 r3736  
    159159!
    160160
    161        call get_var("controle",tab_cntrl,found)
     161       call get_var(nid,"controle",tab_cntrl,found)
    162162       if (.not.found) then
    163163         call abort_physic(modname,"Failed reading <controle> array",1)
Note: See TracChangeset for help on using the changeset viewer.