Changeset 1053
- Timestamp:
- 09/24/20 18:17:18 (4 years ago)
- Location:
- codes/icosagcm/trunk/src
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
codes/icosagcm/trunk/src/base/field.f90
r963 r1053 13 13 TYPE t_field 14 14 CHARACTER(30) :: name 15 15 16 REAL(rstd),POINTER, CONTIGUOUS :: rval2d(:) => null() 16 17 REAL(rstd),POINTER, CONTIGUOUS :: rval3d(:,:) => null() … … 90 91 END SUBROUTINE allocate_fields 91 92 92 SUBROUTINE allocate_field_(field,field_type,data_type,dim 1,dim2,name,ondevice)93 SUBROUTINE allocate_field_(field,field_type,data_type,dim3,dim4,name,ondevice) 93 94 USE domain_mod 94 95 USE omp_para … … 97 98 INTEGER,INTENT(IN) :: field_type 98 99 INTEGER,INTENT(IN) :: data_type 99 INTEGER,OPTIONAL :: dim 1,dim2100 INTEGER,OPTIONAL :: dim3,dim4 100 101 CHARACTER(*), OPTIONAL :: name 101 102 LOGICAL, INTENT(IN), OPTIONAL :: ondevice 102 103 INTEGER :: ind 103 INTEGER :: i i_size,jj_size104 INTEGER :: ij_size 104 105 105 106 DO ind=1,ndomain … … 112 113 END IF 113 114 114 IF (PRESENT(dim 2)) THEN115 IF (PRESENT(dim4)) THEN 115 116 field(ind)%ndim=4 116 field(ind)%dim4=dim 2117 field(ind)%dim3=dim 1118 ELSE IF (PRESENT(dim 1)) THEN117 field(ind)%dim4=dim4 118 field(ind)%dim3=dim3 119 ELSE IF (PRESENT(dim3)) THEN 119 120 field(ind)%ndim=3 120 field(ind)%dim3=dim1 121 field(ind)%dim3=dim3 122 field(ind)%dim4=1 121 123 ELSE 122 124 field(ind)%ndim=2 125 field(ind)%dim3=1 126 field(ind)%dim4=1 123 127 ENDIF 124 128 … … 128 132 129 133 IF (field_type==field_T) THEN 130 jj_size=domain(ind)%jjm134 ij_size=domain(ind)%iim*domain(ind)%jjm 131 135 ELSE IF (field_type==field_U) THEN 132 jj_size=3*domain(ind)%jjm136 ij_size=3*domain(ind)%iim*domain(ind)%jjm 133 137 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) 148 149 149 150 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) 153 154 154 155 ENDIF … … 272 273 data_type=field(ind)%data_type 273 274 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 281 279 END IF 282 283 IF (data_type==type_real) THEN284 IF (field(ind)%ondevice) THEN 285 !$acc exit data delete(field(ind)%rval4d(:,:,:))286 CONTINUE287 END IF288 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 289 287 END IF 290 291 IF (data_type==type_logical) THEN292 IF (field(ind)%ondevice) THEN 293 !$acc exit data delete(field(ind)%lval4d(:,:,:))294 CONTINUE295 END IF296 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 297 295 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 351 300 END SUBROUTINE deallocate_field_ 352 301 -
codes/icosagcm/trunk/src/parallel/transfert_mpi.f90
r1018 r1053 135 135 if( request(1)%field_type /= field(1)%field_type ) call dynamico_abort( "init_message : field_type/request mismatch" ) 136 136 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 146 138 dim3 = size(field(1)%rval4d,2) 147 139 dim4 = size(field(1)%rval4d,3)
Note: See TracChangeset
for help on using the changeset viewer.