Ignore:
Timestamp:
Apr 2, 2025, 9:35:59 AM (3 months ago)
Author:
emillour
Message:

Generic PCM:
Add reindexing of columns when reading/writing (re)startfi files. This is not
necessary with the lon-lat (LMDZ.COMMON) dynamical core, but required when
using DYNAMICO (where correspondance between dynamics and physics column
indexes changes with number of computing cores).
EM

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/LMDZ.GENERIC/libf/phystd/iostart.F90

    r3621 r3708  
    283283  SUBROUTINE Get_field_rgen(nid_start,field_name,field,field_size, &
    284284                            corners,edges,found)
    285   USE netcdf
    286   USE dimphy
    287   USE mod_grid_phy_lmdz
    288   USE mod_phys_lmdz_para
     285  USE netcdf, ONLY: NF90_INQ_VARID, NF90_GET_VAR, NF90_NOERR
     286  USE dimphy, ONLY: klon ! number of columns on local grid
     287  USE geometry_mod, ONLY: ind_cell_glo
     288  USE mod_grid_phy_lmdz, ONLY: klon_glo ! number of columns on global grid
     289  USE mod_phys_lmdz_para, ONLY: is_master, bcast, scatter, gather
    289290  IMPLICIT NONE
    290291    INTEGER,INTENT(IN) :: nid_start
    291     CHARACTER(LEN=*) :: Field_name
    292     INTEGER          :: field_size
    293     REAL            :: field(klon,field_size)
     292    CHARACTER(LEN=*),INTENT(IN) :: Field_name
     293    INTEGER,INTENT(IN) :: field_size
     294    REAL,INTENT(OUT) :: field(klon,field_size)
    294295    INTEGER,INTENT(IN) :: corners(4)
    295296    INTEGER,INTENT(IN) :: edges(4)
    296     LOGICAL,OPTIONAL :: found
    297    
    298     REAL    :: field_glo(klon_glo,field_size)
     297    LOGICAL,OPTIONAL,INTENT(OUT) :: found
     298   
     299    REAL    :: field_glo(klon_glo,field_size) ! field on global grid
     300    REAL :: field_glo_tmp(klon_glo,field_size)
     301    INTEGER :: ind_cell_glo_glo(klon_glo) ! cell indexes on global grid
    299302    LOGICAL :: tmp_found
    300303    INTEGER :: varid
    301     INTEGER :: ierr
    302    
     304    INTEGER :: ierr, i
     305   
     306    ! gather columns indexes on global grid
     307    CALL gather(ind_cell_glo,ind_cell_glo_glo)
     308
    303309    IF (is_master) THEN
    304310 
     
    306312     
    307313      IF (ierr==NF90_NOERR) THEN
    308         CALL body(field_glo,nid_start)
     314        CALL body(field_glo_tmp,nid_start)
    309315        tmp_found=.TRUE.
    310316      ELSE
     
    312318      ENDIF
    313319   
    314     ENDIF
     320    ENDIF ! of IF (is_master)
    315321   
    316322    CALL bcast(tmp_found)
    317323
    318324    IF (tmp_found) THEN
     325      IF (is_master) THEN
     326        ! reorder columns according to ind_cell_glo(:) indexes
     327        DO i=1,klon_glo
     328          field_glo(i,:)=field_glo_tmp(ind_cell_glo_glo(i),:)
     329        ENDDO
     330      ENDIF
    319331      CALL scatter(field_glo,field)
    320332    ENDIF
     
    340352           PRINT*, 'get_field_rgen: Failed reading <'//field_name//'>'
    341353
    342 !           IF (field_name=='CLWCON' .OR. field_name=='RNEBCON' .OR. field_name=='RATQS') THEN
    343 !              ! Essaye de lire le variable sur surface uniqument, comme fait avant
    344 !              field_glo(:)=0.
    345 !              ierr=NF90_GET_VAR(nid_start,varid,field_glo(1:klon_glo))
    346 !              IF (ierr/=NF90_NOERR) THEN
    347 !                 PRINT*, 'phyetat0: Lecture echouee aussi en 2D pour <'//field_name//'>'
    348 !                 CALL abort
    349 !              ELSE
    350 !                 PRINT*, 'phyetat0: La variable <'//field_name//'> lu sur surface seulement'!, selon ancien format, le reste mis a zero'
    351 !              END IF
    352 !           ELSE
    353               CALL abort
    354 !           ENDIF
     354           CALL abort_physic("get_field_rgen","Failed to read field",1)
    355355         ENDIF
    356356
     
    428428
    429429  SUBROUTINE Get_var_rgen(nid_start,var_name,var,var_size,found)
    430   USE netcdf
    431   USE dimphy
    432   USE mod_grid_phy_lmdz
    433   USE mod_phys_lmdz_para
     430  USE netcdf, ONLY: NF90_INQ_VARID, NF90_GET_VAR, NF90_NOERR
     431  USE mod_phys_lmdz_para, ONLY: is_master, bcast
    434432  IMPLICIT NONE
    435433    INTEGER,INTENT(IN) :: nid_start
    436     CHARACTER(LEN=*) :: var_name
    437     INTEGER          :: var_size
    438     REAL            :: var(var_size)
    439     LOGICAL,OPTIONAL :: found
     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
    440438   
    441439    LOGICAL :: tmp_found
     
    443441    INTEGER :: ierr
    444442   
    445     IF (is_mpi_root .AND. is_omp_root) THEN
     443    IF (is_master) THEN
    446444 
    447445      ierr=NF90_INQ_VARID(nid_start,var_name,varid)
     
    686684 
    687685  SUBROUTINE put_field_rgen(nid_restart,field_name,title,field,field_size,time)
    688   USE netcdf
    689   USE dimphy
     686  USE netcdf, ONLY: NF90_REDEF, NF90_ENDDEF, NF90_DEF_VAR, NF90_PUT_ATT, &
     687                    NF90_INQ_VARID, NF90_PUT_VAR, NF90_STRERROR, &
     688                    NF90_NOERR, NF90_FLOAT, NF90_DOUBLE
     689  USE dimphy, ONLY: klon, klev, klevp1
    690690  USE comsoil_h, only: nsoilmx
    691   USE mod_grid_phy_lmdz
    692   USE mod_phys_lmdz_para
     691  USE mod_grid_phy_lmdz, ONLY: klon_glo
     692  USE mod_phys_lmdz_para, ONLY: is_master, gather
     693  USE geometry_mod, ONLY: ind_cell_glo
    693694!  USE slab_ice_h, only: noceanmx
    694695  USE ocean_slab_mod, ONLY: nslay
     
    702703  REAL,OPTIONAL,INTENT(IN)       :: time
    703704 
    704   REAL                           :: field_glo(klon_glo,field_size)
     705  REAL :: field_glo(klon_glo,field_size)
     706  REAL :: field_glo_tmp(klon_glo,field_size)
     707  INTEGER :: ind_cell_glo_glo(klon_glo) ! cell indexes on global grid
     708 
    705709  INTEGER                        :: ierr
    706710  INTEGER                        :: nvarid
    707711  INTEGER                        :: idim
    708    
    709     CALL gather(field,field_glo)
    710    
    711     IF (is_master) THEN
    712 
     712  INTEGER :: i
     713 
     714    ! gather indexes on global grid
     715    CALL gather(ind_cell_glo,ind_cell_glo_glo)
     716    ! gather field on master
     717    CALL gather(field,field_glo_tmp)
     718   
     719    IF (is_master) THEN
     720      ! reorder columns
     721      DO i=1,klon_glo
     722        field_glo(ind_cell_glo_glo(i),:)=field_glo_tmp(i,:)
     723      ENDDO
     724     
    713725      IF (field_size==1) THEN
    714726        ! input is a 1D "surface field" array
Note: See TracChangeset for help on using the changeset viewer.