Changeset 1053


Ignore:
Timestamp:
09/24/20 18:17:18 (4 years ago)
Author:
dubos
Message:

trunk : simplify allocate_field -- tested on 4 GPUs (TBC)

Location:
codes/icosagcm/trunk/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • codes/icosagcm/trunk/src/base/field.f90

    r963 r1053  
    1313  TYPE t_field 
    1414    CHARACTER(30)      :: name 
     15 
    1516    REAL(rstd),POINTER, CONTIGUOUS :: rval2d(:) => null() 
    1617    REAL(rstd),POINTER, CONTIGUOUS :: rval3d(:,:) => null() 
     
    9091  END SUBROUTINE allocate_fields 
    9192 
    92   SUBROUTINE allocate_field_(field,field_type,data_type,dim1,dim2,name,ondevice) 
     93  SUBROUTINE allocate_field_(field,field_type,data_type,dim3,dim4,name,ondevice) 
    9394  USE domain_mod 
    9495  USE omp_para 
     
    9798    INTEGER,INTENT(IN) :: field_type 
    9899    INTEGER,INTENT(IN) :: data_type 
    99     INTEGER,OPTIONAL :: dim1,dim2 
     100    INTEGER,OPTIONAL :: dim3,dim4 
    100101    CHARACTER(*), OPTIONAL :: name 
    101102    LOGICAL, INTENT(IN), OPTIONAL :: ondevice 
    102103    INTEGER :: ind 
    103     INTEGER :: ii_size,jj_size 
     104    INTEGER :: ij_size 
    104105 
    105106    DO ind=1,ndomain 
     
    112113      END IF 
    113114 
    114       IF (PRESENT(dim2)) THEN 
     115      IF (PRESENT(dim4)) THEN 
    115116        field(ind)%ndim=4  
    116         field(ind)%dim4=dim2  
    117         field(ind)%dim3=dim1 
    118       ELSE IF (PRESENT(dim1)) THEN 
     117        field(ind)%dim4=dim4  
     118        field(ind)%dim3=dim3 
     119      ELSE IF (PRESENT(dim3)) THEN 
    119120        field(ind)%ndim=3 
    120         field(ind)%dim3=dim1 
     121        field(ind)%dim3=dim3 
     122        field(ind)%dim4=1 
    121123      ELSE 
    122124        field(ind)%ndim=2 
     125        field(ind)%dim3=1 
     126        field(ind)%dim4=1 
    123127      ENDIF 
    124128     
     
    128132 
    129133      IF (field_type==field_T) THEN  
    130         jj_size=domain(ind)%jjm 
     134         ij_size=domain(ind)%iim*domain(ind)%jjm 
    131135      ELSE IF (field_type==field_U) THEN  
    132         jj_size=3*domain(ind)%jjm 
     136         ij_size=3*domain(ind)%iim*domain(ind)%jjm 
    133137      ELSE IF (field_type==field_Z) THEN  
    134         jj_size=2*domain(ind)%jjm 
    135       ENDIF 
    136        
    137       ii_size=domain(ind)%iim 
    138          
    139       IF (field(ind)%ndim==4) THEN 
    140          IF (data_type==type_integer) ALLOCATE(field(ind)%ival4d(ii_size*jj_size,dim1,dim2)) 
    141          IF (data_type==type_real)    ALLOCATE(field(ind)%rval4d(ii_size*jj_size,dim1,dim2)) 
    142          IF (data_type==type_logical) ALLOCATE(field(ind)%lval4d(ii_size*jj_size,dim1,dim2)) 
    143  
    144       ELSE IF (field(ind)%ndim==3) THEN 
    145          IF (data_type==type_integer) ALLOCATE(field(ind)%ival3d(ii_size*jj_size,dim1)) 
    146          IF (data_type==type_real)    ALLOCATE(field(ind)%rval3d(ii_size*jj_size,dim1)) 
    147          IF (data_type==type_logical) ALLOCATE(field(ind)%lval3d(ii_size*jj_size,dim1)) 
     138         ij_size=2*domain(ind)%iim*domain(ind)%jjm 
     139      ENDIF 
     140      
     141      IF (data_type==type_integer) ALLOCATE(field(ind)%ival4d(ij_size, field(ind)%dim3, field(ind)%dim4)) 
     142      IF (data_type==type_real)    ALLOCATE(field(ind)%rval4d(ij_size, field(ind)%dim3, field(ind)%dim4)) 
     143      IF (data_type==type_logical) ALLOCATE(field(ind)%lval4d(ij_size, field(ind)%dim3, field(ind)%dim4)) 
     144 
     145      IF (field(ind)%ndim==3) THEN 
     146         IF (data_type==type_integer) field(ind)%ival3d => field(ind)%ival4d(:,:,1) 
     147         IF (data_type==type_real)    field(ind)%rval3d => field(ind)%rval4d(:,:,1) 
     148         IF (data_type==type_logical) field(ind)%lval3d => field(ind)%lval4d(:,:,1) 
    148149 
    149150      ELSE IF (field(ind)%ndim==2) THEN 
    150          IF (data_type==type_integer) ALLOCATE(field(ind)%ival2d(ii_size*jj_size)) 
    151          IF (data_type==type_real)    ALLOCATE(field(ind)%rval2d(ii_size*jj_size)) 
    152          IF (data_type==type_logical) ALLOCATE(field(ind)%lval2d(ii_size*jj_size)) 
     151         IF (data_type==type_integer) field(ind)%ival2d => field(ind)%ival4d(:,1,1) 
     152         IF (data_type==type_real)    field(ind)%rval2d => field(ind)%rval4d(:,1,1) 
     153         IF (data_type==type_logical) field(ind)%lval2d => field(ind)%lval4d(:,1,1) 
    153154 
    154155      ENDIF 
     
    272273       data_type=field(ind)%data_type 
    273274 
    274        IF (field(ind)%ndim==4) THEN 
    275           IF (data_type==type_integer) THEN 
    276              IF (field(ind)%ondevice) THEN 
    277                 !$acc exit data delete(field(ind)%ival4d(:,:,:)) 
    278                 CONTINUE 
    279              END IF 
    280              DEALLOCATE(field(ind)%ival4d) 
     275       IF (data_type==type_integer) THEN 
     276          IF (field(ind)%ondevice) THEN 
     277             !$acc exit data delete(field(ind)%ival4d(:,:,:)) 
     278             CONTINUE 
    281279          END IF 
    282  
    283           IF (data_type==type_real) THEN 
    284              IF (field(ind)%ondevice) THEN 
    285                 !$acc exit data delete(field(ind)%rval4d(:,:,:)) 
    286                 CONTINUE 
    287              END IF 
    288              DEALLOCATE(field(ind)%rval4d) 
     280          DEALLOCATE(field(ind)%ival4d) 
     281       END IF 
     282 
     283       IF (data_type==type_real) THEN 
     284          IF (field(ind)%ondevice) THEN 
     285             !$acc exit data delete(field(ind)%rval4d(:,:,:)) 
     286             CONTINUE 
    289287          END IF 
    290  
    291           IF (data_type==type_logical) THEN 
    292              IF (field(ind)%ondevice) THEN 
    293                 !$acc exit data delete(field(ind)%lval4d(:,:,:)) 
    294                 CONTINUE 
    295              END IF 
    296              DEALLOCATE(field(ind)%lval4d) 
     288          DEALLOCATE(field(ind)%rval4d) 
     289       END IF 
     290 
     291       IF (data_type==type_logical) THEN 
     292          IF (field(ind)%ondevice) THEN 
     293             !$acc exit data delete(field(ind)%lval4d(:,:,:)) 
     294             CONTINUE 
    297295          END IF 
    298  
    299        ELSE IF (field(ind)%ndim==3) THEN 
    300           IF (data_type==type_integer) THEN 
    301              IF (field(ind)%ondevice) THEN 
    302                 !$acc exit data delete(field(ind)%ival3d(:,:)) 
    303                 CONTINUE 
    304              END IF 
    305              DEALLOCATE(field(ind)%ival3d) 
    306           END IF 
    307  
    308           IF (data_type==type_real) THEN 
    309              IF (field(ind)%ondevice) THEN 
    310                 !$acc exit data delete(field(ind)%rval3d(:,:)) 
    311                 CONTINUE 
    312              END IF 
    313              DEALLOCATE(field(ind)%rval3d) 
    314           END IF 
    315  
    316           IF (data_type==type_logical) THEN 
    317              IF (field(ind)%ondevice) THEN 
    318                 !$acc exit data delete(field(ind)%lval3d(:,:)) 
    319                 CONTINUE 
    320              END IF 
    321              DEALLOCATE(field(ind)%lval3d) 
    322           END IF 
    323  
    324        ELSE IF (field(ind)%ndim==2) THEN 
    325           IF (data_type==type_integer) THEN 
    326              IF (field(ind)%ondevice) THEN 
    327                 !$acc exit data delete(field(ind)%ival2d(:)) 
    328                 CONTINUE 
    329              END IF 
    330              DEALLOCATE(field(ind)%ival2d) 
    331           END IF 
    332  
    333           IF (data_type==type_real) THEN 
    334              IF (field(ind)%ondevice) THEN 
    335                 !$acc exit data delete(field(ind)%rval2d(:)) 
    336                 CONTINUE 
    337              END IF 
    338              DEALLOCATE(field(ind)%rval2d) 
    339           END IF 
    340  
    341           IF (data_type==type_logical) THEN 
    342              IF (field(ind)%ondevice) THEN 
    343                 !$acc exit data delete(field(ind)%lval2d(:)) 
    344                 CONTINUE 
    345              END IF 
    346              DEALLOCATE(field(ind)%lval2d) 
    347           END IF 
    348  
    349        ENDIF 
    350     ENDDO 
     296          DEALLOCATE(field(ind)%lval4d) 
     297       END IF 
     298    END DO 
     299 
    351300  END SUBROUTINE deallocate_field_ 
    352301 
  • codes/icosagcm/trunk/src/parallel/transfert_mpi.f90

    r1018 r1053  
    135135    if( request(1)%field_type /= field(1)%field_type ) call dynamico_abort( "init_message : field_type/request mismatch" ) 
    136136    field_type = request(1)%field_type 
    137  
    138     ! Set field%rval4d pointer to always use 4d array 
    139     do ind = 1, ndomain 
    140       if( field(ind)%ndim == 2 ) field(ind)%rval4d(1:size(field(ind)%rval2d,1),1:1,1:1) => field(ind)%rval2d 
    141       ! This is Fortran 2008 : can be avoided by using a subroutine with rval3d as a 1D dummy argument 
    142       ! (/!\ : using a subroutine might generate a temporary contiguous array) 
    143       if( field(ind)%ndim == 3 ) field(ind)%rval4d(1:size(field(ind)%rval3d,1), & 
    144         1:size(field(ind)%rval3d,2), 1:1) => field(ind)%rval3d 
    145     end do 
     137     
    146138    dim3 = size(field(1)%rval4d,2) 
    147139    dim4 = size(field(1)%rval4d,3) 
Note: See TracChangeset for help on using the changeset viewer.