Changeset 396


Ignore:
Timestamp:
06/06/16 20:40:35 (8 years ago)
Author:
ymipsl
Message:

New field function : extract_slice and insert_slice

YM

File:
1 edited

Legend:

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

    r350 r396  
    302302  END SUBROUTINE deallocate_field_glo 
    303303     
     304  SUBROUTINE extract_slice(field_in, field_out, l)   
     305  USE domain_mod 
     306  USE omp_para 
     307  IMPLICIT NONE   
     308    TYPE(t_field) :: field_in(:) 
     309    TYPE(t_field) :: field_out(:) 
     310    INTEGER,INTENT(IN) :: l 
     311     
     312    INTEGER :: ind 
     313    INTEGER :: data_type 
     314 
     315!$OMP BARRIER 
     316    DO ind=1,ndomain 
     317      data_type=field_in(ind)%data_type 
     318      IF (.NOT. assigned_domain(ind)  .OR. .NOT. is_omp_level_master) CYCLE 
     319       
     320      IF (field_in(ind)%ndim==3 .AND. field_out(ind)%ndim==2) THEN   
     321        IF (data_type==type_integer)  field_out(ind)%ival2d=field_in(ind)%ival3d(:,l) 
     322        IF (data_type==type_real)     field_out(ind)%rval2d=field_in(ind)%rval3d(:,l) 
     323        IF (data_type==type_logical)  field_out(ind)%lval2d=field_in(ind)%lval3d(:,l) 
     324      ELSE IF  (field_in(ind)%ndim==4 .AND. field_out(ind)%ndim==3) THEN 
     325        IF (data_type==type_integer)  field_out(ind)%ival3d=field_in(ind)%ival4d(:,:,l) 
     326        IF (data_type==type_real)     field_out(ind)%rval3d=field_in(ind)%rval4d(:,:,l) 
     327        IF (data_type==type_logical)  field_out(ind)%lval3d=field_in(ind)%lval4d(:,:,l) 
     328      ELSE 
     329        PRINT *, 'extract_slice : cannot extract slice, dimension incompatible' 
     330        STOP        
     331      ENDIF 
     332   ENDDO  
     333!$OMP BARRIER     
     334  END  SUBROUTINE extract_slice   
     335   
     336   
     337  SUBROUTINE insert_slice(field_in, field_out, l)   
     338  USE domain_mod 
     339  USE omp_para 
     340  IMPLICIT NONE   
     341    TYPE(t_field) :: field_in(:) 
     342    TYPE(t_field) :: field_out(:) 
     343    INTEGER,INTENT(IN) :: l 
     344     
     345    INTEGER :: ind 
     346    INTEGER :: data_type 
     347 
     348!$OMP BARRIER 
     349    DO ind=1,ndomain 
     350      data_type=field_in(ind)%data_type 
     351      IF (.NOT. assigned_domain(ind)  .OR. .NOT. is_omp_level_master) CYCLE 
     352       
     353      IF (field_in(ind)%ndim==2 .AND. field_out(ind)%ndim==3) THEN   
     354        IF (data_type==type_integer)  field_out(ind)%ival3d(:,l)=field_in(ind)%ival2d(:) 
     355        IF (data_type==type_real)     field_out(ind)%rval3d(:,l)=field_in(ind)%rval2d(:) 
     356        IF (data_type==type_logical)  field_out(ind)%lval3d(:,l)=field_in(ind)%lval2d(:) 
     357      ELSE IF  (field_in(ind)%ndim==4 .AND. field_out(ind)%ndim==3) THEN 
     358        IF (data_type==type_integer)  field_out(ind)%ival4d(:,:,l)=field_out(ind)%ival3d(:,:) 
     359        IF (data_type==type_real)     field_out(ind)%rval4d(:,:,l)=field_out(ind)%rval3d(:,:) 
     360        IF (data_type==type_logical)  field_out(ind)%lval4d(:,:,l)=field_out(ind)%lval3d(:,:) 
     361      ELSE 
     362        PRINT *, 'extract_slice : cannot insert slice, dimension incompatible' 
     363        STOP        
     364      ENDIF 
     365   ENDDO  
     366!$OMP BARRIER     
     367   
     368  END SUBROUTINE insert_slice 
     369     
    304370  SUBROUTINE getval_r2d(field_pt,field) 
    305371  IMPLICIT NONE   
Note: See TracChangeset for help on using the changeset viewer.