Ignore:
Timestamp:
06/11/19 17:38:17 (5 years ago)
Author:
dubos
Message:

devel/unstructured : XIOS output

File:
1 edited

Legend:

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

    r879 r883  
    11MODULE init_unstructured_mod 
     2  USE prec, ONLY : rstd 
     3  USE math_const, ONLY : radian_to_degree 
    24  USE mpipara, ONLY : is_mpi_master 
    35  USE data_unstructured_mod 
     
    9597  END SUBROUTINE read_from_gridfile 
    9698 
    97  
    9899  SUBROUTINE open_local_mesh_file 
    99100    USE netcdf_mod 
     
    153154  END SUBROUTINE read_field 
    154155 
     156 
     157  SUBROUTINE setup_cellset(set, lon, lat) 
     158    USE domain_mod, ONLY : t_cellset 
     159    TYPE(t_cellset) :: set 
     160    REAL(rstd) :: lon(:), lat(:) 
     161    INTEGER :: ij 
     162    set%ncell = SIZE(lon) 
     163    ALLOCATE(set%lon, SOURCE=lon*radian_to_degree) 
     164    ALLOCATE(set%lat, SOURCE=lat*radian_to_degree) 
     165    ALLOCATE(set%ij, SOURCE = (/(ij,ij=1,set%ncell)/)) 
     166    ALLOCATE(set%ind_glo, SOURCE = set%ij(:)-1) 
     167  END SUBROUTINE setup_cellset 
     168 
     169  SUBROUTINE read_local_mesh_bounds(dom) 
     170    USE domain_mod, ONLY : t_domain 
     171    USE geometry, ONLY : lon_i, lat_i, lon_e, lat_e 
     172    TYPE(t_domain), INTENT(IN) :: dom 
     173    REAL(rstd) :: bounds_e(2,edge_num) 
     174    REAL(rstd), ALLOCATABLE :: lon_v(:), lat_v(:) 
     175    INTEGER :: ij, vup, vdown 
     176 
     177    ! read dual cell positions, not stored in geom 
     178    CALL read_from_gridfile(id_nc, 'float', 'lon_v') 
     179    ALLOCATE(lon_v, SOURCE=Ddata_read1) 
     180    CALL read_from_gridfile(id_nc, 'float', 'lat_v') 
     181    ALLOCATE(lat_v, SOURCE=Ddata_read1) 
     182 
     183    CALL setup_cellset(dom%primal_own, lon_i, lat_i) 
     184    CALL setup_cellset(dom%dual_own, lon_v, lat_v) 
     185    CALL setup_cellset(dom%edge_own, lon_e, lat_e) 
     186 
     187    PRINT *, 'read_local_mesh :', primal_num, SHAPE(dom%primal_own%ij) 
     188 
     189    ! read primal cell bounds 
     190    CALL read_from_gridfile(id_nc, 'float', 'primal_bounds_lon') 
     191    ALLOCATE(dom%primal_own%bnds_lon,     source=Ddata_read2*radian_to_degree) 
     192    CALL read_from_gridfile(id_nc, 'float', 'primal_bounds_lat') 
     193    ALLOCATE(dom%primal_own%bnds_lat,     source=Ddata_read2*radian_to_degree) 
     194    ! read dual cell bounds 
     195    CALL read_from_gridfile(id_nc, 'float', 'dual_bounds_lon') 
     196    ALLOCATE(dom%dual_own%bnds_lon,     source=Ddata_read2*radian_to_degree) 
     197    CALL read_from_gridfile(id_nc, 'float', 'dual_bounds_lat') 
     198    ALLOCATE(dom%dual_own%bnds_lat,     source=Ddata_read2*radian_to_degree) 
     199 
     200    CALL collect_lonlat_e(lat_v) 
     201    ALLOCATE(dom%edge_own%bnds_lat, SOURCE=bounds_e) 
     202    CALL collect_lonlat_e(lon_v) 
     203    ALLOCATE(dom%edge_own%bnds_lon, SOURCE=bounds_e) 
     204 
     205    CONTAINS 
     206      SUBROUTINE collect_lonlat_e(lonlat) 
     207        REAL(rstd) :: lonlat(dual_num) 
     208        DO ij=1, edge_num 
     209           vdown = down(ij) 
     210           vup = up(ij) 
     211           bounds_e(1,ij) = lonlat(vdown)*radian_to_degree 
     212           bounds_e(2,ij) = lonlat(vup)*radian_to_degree 
     213        END DO 
     214      END SUBROUTINE collect_lonlat_e 
     215 
     216  END SUBROUTINE read_local_mesh_bounds 
     217 
    155218  SUBROUTINE read_local_mesh 
    156219    USE field_mod 
     220    USE domain_mod, ONLY : swap_needed, domain, domain_glo 
    157221    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 
     222    USE netcdf_mod, ONLY : nf90_close 
    159223    IMPLICIT NONE 
    160     INTEGER :: ij 
     224    INTEGER :: ij, ierr 
    161225    INTEGER, ALLOCATABLE :: cell_ij(:) 
    162226    REAL(rstd), ALLOCATABLE :: angle_e(:) 
     
    178242    swap_needed = .TRUE. 
    179243    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) 
     244     
    195245    PRINT *, 'read_local_mesh : primal_num =', primal_num, domain_glo(1)%primal_own%ncell 
    196246 
     
    234284    ALLOCATE(wee, source = Ddata_read2) 
    235285 
     286    ! read cell centers and bounds 
     287    CALL read_local_mesh_bounds(domain(1)) 
     288    CALL read_local_mesh_bounds(domain_glo(1)) 
     289 
    236290    CALL free_data_read ! free buffers after reading all data from grid file 
    237  
    238  
    239 !    edge_num = SIZE(le_de) 
    240 !    primal_num = SIZE(Ai) 
    241 !    dual_num = SIZE(Av) 
     291    ierr = nf90_close(id_nc) 
     292 
     293    ! now process some of the data we just read 
     294 
    242295    max_primal_deg = SIZE(primal_edge,1) 
    243296    max_dual_deg = SIZE(dual_edge,1) 
    244297    max_trisk_deg = SIZE(trisk,1) 
    245298 
    246     ! now post-process some of the data we just read 
    247     ALLOCATE(ep_e(edge_num,3)) 
    248299    DO ij=1,edge_num 
    249300       clon = COS(lon_e(ij)) 
     
    254305       elon = (/ -slon, clon, 0. /) 
    255306       elat = (/ -slat*clon, -slat*slon, clat /) 
    256        ep_e(ij,:) = COS(angle_e(ij))*elon + SIN(angle_e(ij))*elat 
     307       ep_e(:,ij) = COS(angle_e(ij))*elon + SIN(angle_e(ij))*elat 
    257308    END DO 
    258309     
    259310    DEALLOCATE(angle_e) 
    260311 
    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  
    271312    CALL swap_geometry(1) 
    272313    swap_needed = .FALSE. 
     314 
    273315  END SUBROUTINE read_local_mesh 
    274316 
Note: See TracChangeset for help on using the changeset viewer.