Ignore:
Timestamp:
07/26/12 15:25:40 (12 years ago)
Author:
ymipsl
Message:

Implementation of parallelism
implementation of iterative laplacian for dissipation

File:
1 edited

Legend:

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

    r12 r26  
    2626    INTEGER :: field_type 
    2727    INTEGER :: data_type  
     28    INTEGER :: dim3 
     29    INTEGER :: dim4 
    2830  END TYPE t_field    
    2931 
     
    5961      IF (PRESENT(dim2)) THEN 
    6062        field(ind)%ndim=4  
     63        field(ind)%dim4=dim2  
    6164      ELSE IF (PRESENT(dim1)) THEN 
    6265        field(ind)%ndim=3 
     66        field(ind)%dim3=dim1 
    6367      ELSE 
    6468        field(ind)%ndim=2 
     
    96100    
    97101  END SUBROUTINE allocate_field 
    98    
     102 
     103  SUBROUTINE allocate_field_glo(field,field_type,data_type,dim1,dim2) 
     104  USE domain_mod 
     105  IMPLICIT NONE 
     106    TYPE(t_field),POINTER :: field(:) 
     107    INTEGER,INTENT(IN) :: field_type 
     108    INTEGER,INTENT(IN) :: data_type 
     109    INTEGER,OPTIONAL :: dim1,dim2 
     110    INTEGER :: ind 
     111    INTEGER :: ii_size,jj_size 
     112 
     113    ALLOCATE(field(ndomain_glo))     
     114 
     115    DO ind=1,ndomain_glo 
     116   
     117      IF (PRESENT(dim2)) THEN 
     118        field(ind)%ndim=4  
     119        field(ind)%dim4=dim2  
     120      ELSE IF (PRESENT(dim1)) THEN 
     121        field(ind)%ndim=3 
     122        field(ind)%dim3=dim1  
     123      ELSE 
     124        field(ind)%ndim=2 
     125      ENDIF 
     126     
     127     
     128      field(ind)%data_type=data_type 
     129      field(ind)%field_type=field_type 
     130     
     131      IF (field_type==field_T) THEN  
     132        jj_size=domain_glo(ind)%jjm 
     133      ELSE IF (field_type==field_U) THEN  
     134        jj_size=3*domain_glo(ind)%jjm 
     135      ELSE IF (field_type==field_Z) THEN  
     136        jj_size=2*domain_glo(ind)%jjm 
     137      ENDIF 
     138       
     139      ii_size=domain_glo(ind)%iim 
     140         
     141      IF (field(ind)%ndim==4) THEN 
     142        IF (data_type==type_integer) ALLOCATE(field(ind)%ival4d(ii_size*jj_size,dim1,dim2)) 
     143        IF (data_type==type_real)    ALLOCATE(field(ind)%rval4d(ii_size*jj_size,dim1,dim2)) 
     144        IF (data_type==type_logical) ALLOCATE(field(ind)%lval4d(ii_size*jj_size,dim1,dim2)) 
     145      ELSE IF (field(ind)%ndim==3) THEN 
     146        IF (data_type==type_integer) ALLOCATE(field(ind)%ival3d(ii_size*jj_size,dim1)) 
     147        IF (data_type==type_real)    ALLOCATE(field(ind)%rval3d(ii_size*jj_size,dim1)) 
     148        IF (data_type==type_logical) ALLOCATE(field(ind)%lval3d(ii_size*jj_size,dim1)) 
     149      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)) 
     153      ENDIF 
     154       
     155   ENDDO 
     156   
     157  END SUBROUTINE allocate_field_glo 
     158 
     159  SUBROUTINE deallocate_field(field) 
     160  USE domain_mod 
     161  IMPLICIT NONE 
     162    TYPE(t_field),POINTER :: field(:) 
     163    INTEGER :: data_type 
     164    INTEGER :: ind 
     165 
     166    DO ind=1,ndomain 
     167 
     168      data_type=field(ind)%data_type 
     169         
     170      IF (field(ind)%ndim==4) THEN 
     171        IF (data_type==type_integer) DEALLOCATE(field(ind)%ival4d) 
     172        IF (data_type==type_real)    DEALLOCATE(field(ind)%rval4d) 
     173        IF (data_type==type_logical) DEALLOCATE(field(ind)%lval4d) 
     174      ELSE IF (field(ind)%ndim==3) THEN 
     175        IF (data_type==type_integer) DEALLOCATE(field(ind)%ival3d) 
     176        IF (data_type==type_real)    DEALLOCATE(field(ind)%rval3d) 
     177        IF (data_type==type_logical) DEALLOCATE(field(ind)%lval3d) 
     178      ELSE IF (field(ind)%ndim==2) THEN 
     179        IF (data_type==type_integer) DEALLOCATE(field(ind)%ival2d) 
     180        IF (data_type==type_real)    DEALLOCATE(field(ind)%rval2d) 
     181        IF (data_type==type_logical) DEALLOCATE(field(ind)%lval2d) 
     182      ENDIF 
     183       
     184   ENDDO 
     185   DEALLOCATE(field) 
     186        
     187  END SUBROUTINE deallocate_field 
     188 
     189  SUBROUTINE deallocate_field_glo(field) 
     190  USE domain_mod 
     191  IMPLICIT NONE 
     192    TYPE(t_field),POINTER :: field(:) 
     193    INTEGER :: data_type 
     194    INTEGER :: ind 
     195 
     196    DO ind=1,ndomain_glo 
     197 
     198      data_type=field(ind)%data_type 
     199         
     200      IF (field(ind)%ndim==4) THEN 
     201        IF (data_type==type_integer) DEALLOCATE(field(ind)%ival4d) 
     202        IF (data_type==type_real)    DEALLOCATE(field(ind)%rval4d) 
     203        IF (data_type==type_logical) DEALLOCATE(field(ind)%lval4d) 
     204      ELSE IF (field(ind)%ndim==3) THEN 
     205        IF (data_type==type_integer) DEALLOCATE(field(ind)%ival3d) 
     206        IF (data_type==type_real)    DEALLOCATE(field(ind)%rval3d) 
     207        IF (data_type==type_logical) DEALLOCATE(field(ind)%lval3d) 
     208      ELSE IF (field(ind)%ndim==2) THEN 
     209        IF (data_type==type_integer) DEALLOCATE(field(ind)%ival2d) 
     210        IF (data_type==type_real)    DEALLOCATE(field(ind)%rval2d) 
     211        IF (data_type==type_logical) DEALLOCATE(field(ind)%lval2d) 
     212      ENDIF 
     213       
     214   ENDDO 
     215   DEALLOCATE(field) 
     216        
     217  END SUBROUTINE deallocate_field_glo 
     218     
    99219  SUBROUTINE getval_r2d(field_pt,field) 
    100220  IMPLICIT NONE   
Note: See TracChangeset for help on using the changeset viewer.