Changeset 839 for codes/icosagcm/devel


Ignore:
Timestamp:
05/03/19 14:15:16 (5 years ago)
Author:
dubos
Message:

devel : allocate_field for unstructured mesh

Location:
codes/icosagcm/devel/src/base
Files:
2 edited

Legend:

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

    r533 r839  
    8585 
    8686  SUBROUTINE allocate_field_(field,field_type,data_type,dim1,dim2,name) 
    87   USE domain_mod 
    88   USE omp_para 
    89   IMPLICIT NONE 
     87    USE domain_mod 
     88    USE omp_para 
     89    USE grid_param 
    9090    TYPE(t_field) :: field(:) 
    9191    INTEGER,INTENT(IN) :: field_type 
     
    9494    CHARACTER(*), OPTIONAL :: name 
    9595    INTEGER :: ind 
    96     INTEGER :: ii_size,jj_size 
     96    INTEGER :: ij_size 
    9797 
    9898    DO ind=1,ndomain 
     
    119119      field(ind)%data_type=data_type 
    120120      field(ind)%field_type=field_type 
    121      
    122       IF (field_type==field_T) THEN  
    123         jj_size=domain(ind)%jjm 
    124       ELSE IF (field_type==field_U) THEN  
    125         jj_size=3*domain(ind)%jjm 
    126       ELSE IF (field_type==field_Z) THEN  
    127         jj_size=2*domain(ind)%jjm 
    128       ENDIF 
    129        
    130       ii_size=domain(ind)%iim 
     121       
     122      SELECT CASE(grid_type) 
     123         CASE(grid_ico) 
     124            ij_size=domain(ind)%iim 
     125            IF (field_type==field_T) THEN  
     126               ij_size=ij_size*domain(ind)%jjm 
     127            ELSE IF (field_type==field_U) THEN  
     128               ij_size=3*ij_size*domain(ind)%jjm 
     129            ELSE IF (field_type==field_Z) THEN  
     130               ij_size=2*ij_size*domain(ind)%jjm 
     131            ENDIF      
    131132         
    132       IF (field(ind)%ndim==4) THEN 
    133         IF (data_type==type_integer) ALLOCATE(field(ind)%ival4d(ii_size*jj_size,dim1,dim2)) 
    134         IF (data_type==type_real)    ALLOCATE(field(ind)%rval4d(ii_size*jj_size,dim1,dim2)) 
    135         IF (data_type==type_logical) ALLOCATE(field(ind)%lval4d(ii_size*jj_size,dim1,dim2)) 
    136       ELSE IF (field(ind)%ndim==3) THEN 
    137         IF (data_type==type_integer) ALLOCATE(field(ind)%ival3d(ii_size*jj_size,dim1)) 
    138         IF (data_type==type_real)    ALLOCATE(field(ind)%rval3d(ii_size*jj_size,dim1)) 
    139         IF (data_type==type_logical) ALLOCATE(field(ind)%lval3d(ii_size*jj_size,dim1)) 
    140       ELSE IF (field(ind)%ndim==2) THEN 
    141         IF (data_type==type_integer) ALLOCATE(field(ind)%ival2d(ii_size*jj_size)) 
    142         IF (data_type==type_real)    ALLOCATE(field(ind)%rval2d(ii_size*jj_size)) 
    143         IF (data_type==type_logical) ALLOCATE(field(ind)%lval2d(ii_size*jj_size)) 
    144       ENDIF 
    145        
    146    ENDDO 
     133            IF (field(ind)%ndim==4) THEN 
     134               IF (data_type==type_integer) ALLOCATE(field(ind)%ival4d(ij_size,dim1,dim2)) 
     135               IF (data_type==type_real)    ALLOCATE(field(ind)%rval4d(ij_size,dim1,dim2)) 
     136               IF (data_type==type_logical) ALLOCATE(field(ind)%lval4d(ij_size,dim1,dim2)) 
     137            ELSE IF (field(ind)%ndim==3) THEN 
     138               IF (data_type==type_integer) ALLOCATE(field(ind)%ival3d(ij_size,dim1)) 
     139               IF (data_type==type_real)    ALLOCATE(field(ind)%rval3d(ij_size,dim1)) 
     140               IF (data_type==type_logical) ALLOCATE(field(ind)%lval3d(ij_size,dim1)) 
     141            ELSE IF (field(ind)%ndim==2) THEN 
     142               IF (data_type==type_integer) ALLOCATE(field(ind)%ival2d(ij_size)) 
     143               IF (data_type==type_real)    ALLOCATE(field(ind)%rval2d(ij_size)) 
     144               IF (data_type==type_logical) ALLOCATE(field(ind)%lval2d(ij_size)) 
     145            ENDIF 
     146 
     147         CASE(grid_unst) 
     148            PRINT *, 'Allocating field ', field(ind)%name 
     149            IF (field_type==field_T) THEN  
     150               ij_size=primal_num 
     151            ELSE IF (field_type==field_U) THEN  
     152               ij_size=edge_num 
     153            ELSE IF (field_type==field_Z) THEN  
     154               ij_size=dual_num 
     155            ENDIF      
     156 
     157            IF (field(ind)%ndim==4) THEN 
     158               IF (data_type==type_integer) ALLOCATE(field(ind)%ival4d(dim1,ij_size,dim2)) 
     159               IF (data_type==type_real)    ALLOCATE(field(ind)%rval4d(dim1,ij_size,dim2)) 
     160               IF (data_type==type_logical) ALLOCATE(field(ind)%lval4d(dim1,ij_size,dim2)) 
     161            ELSE IF (field(ind)%ndim==3) THEN 
     162               IF (data_type==type_integer) ALLOCATE(field(ind)%ival3d(dim1,ij_size)) 
     163               IF (data_type==type_real)    ALLOCATE(field(ind)%rval3d(dim1,ij_size)) 
     164               IF (data_type==type_logical) ALLOCATE(field(ind)%lval3d(dim1,ij_size)) 
     165            ELSE IF (field(ind)%ndim==2) THEN 
     166               IF (data_type==type_integer) ALLOCATE(field(ind)%ival2d(ij_size)) 
     167               IF (data_type==type_real)    ALLOCATE(field(ind)%rval2d(ij_size)) 
     168               IF (data_type==type_logical) ALLOCATE(field(ind)%lval2d(ij_size)) 
     169            ENDIF 
     170 
     171         END SELECT 
     172      ENDDO 
    147173!$OMP BARRIER 
    148174    
  • codes/icosagcm/devel/src/base/grid_param.f90

    r830 r839  
    11MODULE grid_param 
     2  USE ISO_C_BINDING 
    23  IMPLICIT NONE 
    34  SAVE 
     5 
     6! Some variable are BIND(C) to be accessible from Python                                                                                                                                                   ! They are declared using C sizes 
     7 
    48  INTEGER  :: iim_glo=40 
    59  INTEGER  :: jjm_glo 
     
    711  INTEGER, PARAMETER :: grid_unst=1, grid_ico = 2 
    812  INTEGER  :: grid_type ! unstructured or icosahedral 
    9   INTEGER, BIND(C) :: llm=19 
     13 
     14  INTEGER(C_INT), BIND(C) :: llm=19, &  ! number of vertical levels 
     15                             nqdyn      ! number of dynamical tracers : 1 if dry, more if moist 
     16 
    1017  INTEGER  :: nqtot ! number of tracers handled by advection scheme 
    11   INTEGER, BIND(C) :: nqdyn ! number of dynamical tracers : 1 if dry, more if moist 
     18 
     19  INTEGER(C_INT), BIND(C) :: edge_num, primal_num, dual_num, & 
     20       max_primal_deg, max_dual_deg, max_trisk_deg 
     21 
    1222END MODULE grid_param 
Note: See TracChangeset for help on using the changeset viewer.