Ignore:
Timestamp:
06/04/19 18:03:54 (5 years ago)
Author:
dubos
Message:

devel : introduced derived type to store cell bounds

File:
1 edited

Legend:

Unmodified
Added
Removed
  • codes/icosagcm/devel/src/unstructured/init_unstructured.f90

    r863 r879  
    22  USE mpipara, ONLY : is_mpi_master 
    33  USE data_unstructured_mod 
    4   USE geometry, ONLY : de 
     4  USE geometry, ONLY : swap_geometry 
    55  IMPLICIT NONE 
    66  SAVE 
     
    128128 
    129129 
     130  SUBROUTINE read_field(id_nc, field) 
     131    USE field_mod, ONLY : t_field, type_integer, type_real 
     132    INTEGER :: id_nc 
     133    TYPE(t_field), POINTER :: field(:), fld 
     134    fld=>field(1) 
     135    SELECT CASE(fld%data_type) 
     136    CASE(type_integer) 
     137       CALL read_from_gridfile(id_nc, 'integer', TRIM(fld%name)) 
     138       SELECT CASE(field(1)%ndim) 
     139       CASE(2) 
     140          fld%ival2d = Idata_read1 
     141       CASE(3) 
     142          fld%ival3d = Idata_read2 
     143       END SELECT 
     144    CASE(type_real) 
     145       CALL read_from_gridfile(id_nc, 'float', TRIM(fld%name)) 
     146       SELECT CASE(field(1)%ndim) 
     147       CASE(2) 
     148          fld%rval2d = Ddata_read1 
     149       CASE(3) 
     150          fld%rval3d = Ddata_read2 
     151       END SELECT 
     152    END SELECT 
     153  END SUBROUTINE read_field 
     154 
    130155  SUBROUTINE read_local_mesh 
    131156    USE field_mod 
    132     USE geometry, ONLY : lon_i, lat_i, lon_e, lat_e, ep_e 
     157    USE geometry, ONLY : geom, lon_i, lat_i, lon_e, lat_e, ep_e 
     158    USE domain_mod, ONLY : domain, domain_glo, t_domain, swap_needed 
    133159    IMPLICIT NONE 
    134160    INTEGER :: ij 
     161    INTEGER, ALLOCATABLE :: cell_ij(:) 
    135162    REAL(rstd), ALLOCATABLE :: angle_e(:) 
    136163    REAL(rstd) :: clon, slon, clat, slat, & ! COS/SIN of lon/lat 
    137164         elon(3), elat(3) ! lon/lat unit vectors 
    138165     
    139     !status = nf90_get_att(id_nc, nf90_global, "primal_num", primal_num) 
    140     !status = nf90_get_att(id_nc, nf90_global, "dual_num", dual_num) 
    141     !status = nf90_get_att(id_nc, nf90_global, "edge_num", edge_num) 
    142     !print *,primal_num,dual_num,edge_num 
    143  
     166    ! if possible data is read into fields allocated in geom(1) using read_field 
     167    CALL read_field(id_nc, geom%Ai) 
     168    CALL read_field(id_nc, geom%Av) 
     169    CALL read_field(id_nc, geom%fv) 
     170    CALL read_field(id_nc, geom%le_de) 
     171    CALL read_field(id_nc, geom%le) 
     172    CALL read_field(id_nc, geom%de) 
     173    CALL read_field(id_nc, geom%lon_i) 
     174    CALL read_field(id_nc, geom%lat_i) 
     175    CALL read_field(id_nc, geom%lon_e) 
     176    CALL read_field(id_nc, geom%lat_e) 
     177 
     178    swap_needed = .TRUE. 
     179    CALL swap_geometry(1) 
     180 
     181    ! cell centers and bounds are read into domain(1)%primal_own 
     182    domain(1)%primal_own%ncell = primal_num 
     183    domain_glo(1)%primal_own%ncell = primal_num 
     184    ALLOCATE(domain(1)%primal_own%lon,     source=lon_i) 
     185    ALLOCATE(domain_glo(1)%primal_own%lon, source=lon_i) 
     186    ALLOCATE(domain(1)%primal_own%lat,     source=lat_i) 
     187    ALLOCATE(domain_glo(1)%primal_own%lat, source=lat_i) 
     188 
     189    CALL read_from_gridfile(id_nc, 'float', 'primal_bounds_lon') 
     190    ALLOCATE(domain(1)%primal_own%bnds_lon,     source=Ddata_read2) 
     191    ALLOCATE(domain_glo(1)%primal_own%bnds_lon, source=Ddata_read2) 
     192    CALL read_from_gridfile(id_nc, 'float', 'primal_bounds_lat') 
     193    ALLOCATE(domain(1)%primal_own%bnds_lat,     source=Ddata_read2) 
     194    ALLOCATE(domain_glo(1)%primal_own%bnds_lat, source=Ddata_read2) 
     195    PRINT *, 'read_local_mesh : primal_num =', primal_num, domain_glo(1)%primal_own%ncell 
     196 
     197    ! other fields are defined only in the case of an unstructured mesh 
     198    ! those fields are read into simple arrays 
    144199    CALL read_from_gridfile(id_nc, 'integer', 'primal_deg') 
    145200    ALLOCATE(primal_deg, source = Idata_read1) 
     
    148203    CALL read_from_gridfile(id_nc, 'integer', 'primal_ne') 
    149204    ALLOCATE(primal_ne, source = Idata_read2) 
     205    CALL read_from_gridfile(id_nc, 'integer', 'primal_vertex')  
     206    ALLOCATE(primal_vertex, source = Idata_read2) 
     207 
    150208    CALL read_from_gridfile(id_nc, 'integer', 'dual_deg') 
    151209    ALLOCATE(dual_deg, source = Idata_read1) 
     
    154212    CALL read_from_gridfile(id_nc, 'integer', 'dual_ne') 
    155213    ALLOCATE(dual_ne, source = Idata_read2) 
    156     CALL read_from_gridfile(id_nc, 'integer', 'primal_vertex')  
    157     ALLOCATE(primal_vertex, source = Idata_read2) 
     214    CALL read_from_gridfile(id_nc, 'integer', 'dual_vertex')  
     215    ALLOCATE(dual_vertex, source = Idata_read2) 
     216 
    158217    CALL read_from_gridfile(id_nc, 'integer', 'left') 
    159218    ALLOCATE(left, source = Idata_read1) 
     
    164223    CALL read_from_gridfile(id_nc, 'integer', 'down') 
    165224    ALLOCATE(down, source = Idata_read1) 
     225    CALL read_from_gridfile(id_nc, 'float', 'angle_e') 
     226    ALLOCATE(angle_e, source = Ddata_read1) 
    166227    CALL read_from_gridfile(id_nc, 'integer', 'trisk_deg') 
    167228    ALLOCATE(trisk_deg, source = Idata_read1) 
    168229    CALL read_from_gridfile(id_nc, 'integer', 'trisk') 
    169230    ALLOCATE(trisk, source = Idata_read2) 
    170     CALL read_from_gridfile(id_nc, 'float', 'Ai') 
    171     ALLOCATE(Ai, source = Ddata_read1) 
    172     CALL read_from_gridfile(id_nc, 'float', 'Av') 
    173     ALLOCATE(Av, source = Ddata_read1) 
    174     CALL read_from_gridfile(id_nc, 'float', 'le_de') 
    175     ALLOCATE(le_de, source = Ddata_read1) 
    176     CALL read_from_gridfile(id_nc, 'float', 'le') 
    177     ALLOCATE(le, source = Ddata_read1) 
    178     CALL read_from_gridfile(id_nc, 'float', 'de') 
    179     ALLOCATE(de, source = Ddata_read1) 
    180231    CALL read_from_gridfile(id_nc, 'float', 'Riv2') 
    181232    ALLOCATE(Riv2, source = Ddata_read2) 
    182233    CALL read_from_gridfile(id_nc, 'float', 'wee') 
    183234    ALLOCATE(wee, source = Ddata_read2) 
    184     CALL read_from_gridfile(id_nc, 'float', 'fv') !  
    185     ALLOCATE(fv, source = Ddata_read1) 
    186     CALL read_from_gridfile(id_nc, 'integer', 'dual_vertex')  
    187     ALLOCATE(dual_vertex, source = Idata_read2) 
    188  
    189     CALL read_from_gridfile(id_nc, 'float', 'lon_i') 
    190     ALLOCATE(lon_i, source = Ddata_read1) 
    191     CALL read_from_gridfile(id_nc, 'float', 'lat_i') 
    192     ALLOCATE(lat_i, source = Ddata_read1) 
    193     CALL read_from_gridfile(id_nc, 'float', 'lon_e') 
    194     ALLOCATE(lon_e, source = Ddata_read1) 
    195     CALL read_from_gridfile(id_nc, 'float', 'lat_e') 
    196     ALLOCATE(lat_e, source = Ddata_read1) 
    197     CALL read_from_gridfile(id_nc, 'float', 'angle_e') 
    198     ALLOCATE(angle_e, source = Ddata_read1) 
    199235 
    200236    CALL free_data_read ! free buffers after reading all data from grid file 
    201237 
    202     edge_num = SIZE(le_de) 
    203     primal_num = SIZE(Ai) 
    204     dual_num = SIZE(Av) 
     238 
     239!    edge_num = SIZE(le_de) 
     240!    primal_num = SIZE(Ai) 
     241!    dual_num = SIZE(Av) 
    205242    max_primal_deg = SIZE(primal_edge,1) 
    206243    max_dual_deg = SIZE(dual_edge,1) 
     
    221258     
    222259    DEALLOCATE(angle_e) 
     260 
     261    ALLOCATE(domain(1)%primal_own%ij(primal_num)) 
     262    domain(1)%primal_own%ij(:) = (/(ij,ij=1,primal_num)/) 
     263    PRINT *, 'read_local_mesh :', SHAPE(domain), primal_num, & 
     264         SHAPE(domain(1)%primal_own%ij) 
     265 
     266    ALLOCATE(cell_ij(dual_num)) 
     267    cell_ij(:) = (/(ij,ij=1,dual_num)/) 
     268    ALLOCATE(domain(1)%dual_own%ij, source=cell_ij) 
     269    DEALLOCATE(cell_ij) 
     270 
     271    CALL swap_geometry(1) 
     272    swap_needed = .FALSE. 
    223273  END SUBROUTINE read_local_mesh 
    224274 
Note: See TracChangeset for help on using the changeset viewer.