Ignore:
Timestamp:
Feb 2, 2016, 10:21:39 AM (9 years ago)
Author:
ymipsl
Message:

Add global index array in order to be able of correctly restart when changing data distribution between 2 jobs (not same number of mpi process or openmp threads)

YM

Location:
dynamico_lmdz/aquaplanet/LMDZ5/libf/phylmd
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • dynamico_lmdz/aquaplanet/LMDZ5/libf/phylmd/geometry_mod.f90

    r3825 r3900  
    2929!$OMP THREADPRIVATE(cell_area)
    3030
     31  INTEGER,SAVE,ALLOCATABLE :: ind_cell_glo(:)      ! global indice of a local cell
     32!$OMP THREADPRIVATE(ind_cell_glo)
    3133
    3234CONTAINS
    3335
    34   SUBROUTINE init_geometry(longitude_, latitude_, boundslon_, boundslat_, cell_area_, dx_, dy_)
     36  SUBROUTINE init_geometry(longitude_, latitude_, boundslon_, boundslat_, cell_area_,ind_cell_glo_, dx_, dy_)
    3537  USE dimphy, ONLY: klon
    3638  USE mod_grid_phy_lmdz, ONLY: nvertex
     
    4244    REAL :: boundslat_(klon,nvertex)
    4345    REAL :: cell_area_(klon)
     46    INTEGER :: ind_cell_glo_(klon)
    4447    REAL,OPTIONAL :: dx_(klon)
    4548    REAL,OPTIONAL :: dy_(klon)
     
    5255    ALLOCATE(boundslat(klon,nvertex))
    5356    ALLOCATE(cell_area(klon))
     57    ALLOCATE(ind_cell_glo(klon))
    5458    IF (PRESENT(dx_)) ALLOCATE(dx(klon))
    5559    IF (PRESENT(dy_))ALLOCATE(dy(klon))
     
    6266    boundslat(:,:) = boundslat_(:,:)
    6367    cell_area(:) = cell_area_(:)
     68    ind_cell_glo(:) = ind_cell_glo_(:)
    6469    IF (PRESENT(dx_)) dx(:) = dx_(:)
    6570    IF (PRESENT(dy_)) dy(:) = dy_(:)
  • dynamico_lmdz/aquaplanet/LMDZ5/libf/phylmd/iostart.F90

    r3814 r3900  
    129129  USE netcdf
    130130  USE dimphy
     131  USE geometry_mod
    131132  USE mod_grid_phy_lmdz
    132133  USE mod_phys_lmdz_para
     
    138139   
    139140    REAL    :: field_glo(klon_glo,field_size)
     141    REAL    :: field_glo_tmp(klon_glo,field_size)
     142    INTEGER :: ind_cell_glo_glo(klon_glo)
    140143    LOGICAL :: tmp_found
    141144    INTEGER :: varid
    142     INTEGER :: ierr
    143    
    144     IF (is_mpi_root .AND. is_omp_root) THEN
     145    INTEGER :: ierr,i
     146
     147!    IF (is_master) ALLOCATE(ind_cell_glo_glo(1:klon_glo))
     148    CALL gather(ind_cell_glo,ind_cell_glo_glo)
     149   
     150    IF (is_master) THEN
    145151 
    146152      ierr=NF90_INQ_VARID(nid_start,Field_name,varid)
    147153     
    148154      IF (ierr==NF90_NOERR) THEN
    149         CALL body(field_glo)
     155        CALL body(field_glo_tmp)
    150156        tmp_found=.TRUE.
    151157      ELSE
     
    158164
    159165    IF (tmp_found) THEN
     166      IF (is_master) THEN 
     167        DO i=1,klon_glo
     168         field_glo(i,:)=field_glo_tmp(ind_cell_glo_glo(i),:)
     169        ENDDO
     170      ENDIF
    160171      CALL scatter(field_glo,field)
    161172    ENDIF
     
    384395  USE netcdf
    385396  USE dimphy
     397  USE geometry_mod
    386398  USE mod_grid_phy_lmdz
    387399  USE mod_phys_lmdz_para
     
    393405 
    394406  REAL                           :: field_glo(klon_glo,field_size)
    395   INTEGER                        :: ierr
     407  REAL                           :: field_glo_tmp(klon_glo,field_size)
     408  INTEGER,ALLOCATABLE            :: ind_cell_glo_glo(:)
     409  INTEGER                        :: ierr,i
    396410  INTEGER                        :: nvarid
    397411  INTEGER                        :: idim
    398412   
    399413   
    400     CALL gather(field,field_glo)
    401    
    402     IF (is_mpi_root .AND. is_omp_root) THEN
     414    IF (is_master) ALLOCATE(ind_cell_glo_glo(klon_glo))
     415    CALL gather(ind_cell_glo,ind_cell_glo_glo)
     416
     417    CALL gather(field,field_glo_tmp)
     418   
     419    IF (is_master) THEN
     420
     421      DO i=1,klon_glo
     422       field_glo(ind_cell_glo_glo(i),:)=field_glo_tmp(i,:)
     423      ENDDO
     424
    403425
    404426      IF (field_size==1) THEN
  • dynamico_lmdz/aquaplanet/LMDZ5/libf/phylmd/wxios.F90

    r3882 r3900  
    314314
    315315    SUBROUTINE wxios_domain_param_unstructured
    316         USE geometry_mod, ONLY : longitude, latitude, boundslon, boundslat
     316        USE geometry_mod, ONLY : longitude, latitude, boundslon, boundslat,ind_cell_glo
    317317        USE mod_grid_phy_lmdz, ONLY : nvertex, klon_glo
    318318        USE mod_phys_lmdz_para
     
    323323        REAL :: boundslon_mpi(klon_mpi,nvertex)
    324324        REAL :: boundslat_mpi(klon_mpi,nvertex)
     325        INTEGER :: ind_cell_glo_mpi(klon_mpi)
    325326        TYPE(xios_domaingroup) :: dom
    326327
     
    330331        CALL gather_omp(boundslon*180/PI,boundslon_mpi)
    331332        CALL gather_omp(boundslat*180/PI,boundslat_mpi)
     333        CALL gather_omp(ind_cell_glo,ind_cell_glo_mpi)
     334       
    332335
    333336!$OMP MASTER
     
    336339        !On parametrise le domaine:
    337340        CALL xios_set_attr(dom, ni_glo=klon_glo, ibegin=ij_begin-1, ni=ij_nb, type="unstructured")
    338         CALL xios_set_attr(dom, nvertex=nvertex, lonvalue_1d=lon_mpi, latvalue_1d=lat_mpi, bounds_lon_1d=TRANSPOSE(boundslon_mpi), bounds_lat_1d=TRANSPOSE(boundslat_mpi) )
     341        CALL xios_set_attr(dom, nvertex=nvertex, lonvalue_1d=lon_mpi, latvalue_1d=lat_mpi, &
     342                           bounds_lon_1d=TRANSPOSE(boundslon_mpi), bounds_lat_1d=TRANSPOSE(boundslat_mpi) )
     343        CALL xios_set_attr(dom, i_index=ind_cell_glo_mpi(:)-1)
    339344!$OMP END MASTER
    340345
Note: See TracChangeset for help on using the changeset viewer.