- Timestamp:
- 06/11/19 17:38:17 (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
codes/icosagcm/devel/src/unstructured/init_unstructured.f90
r879 r883 1 1 MODULE init_unstructured_mod 2 USE prec, ONLY : rstd 3 USE math_const, ONLY : radian_to_degree 2 4 USE mpipara, ONLY : is_mpi_master 3 5 USE data_unstructured_mod … … 95 97 END SUBROUTINE read_from_gridfile 96 98 97 98 99 SUBROUTINE open_local_mesh_file 99 100 USE netcdf_mod … … 153 154 END SUBROUTINE read_field 154 155 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 155 218 SUBROUTINE read_local_mesh 156 219 USE field_mod 220 USE domain_mod, ONLY : swap_needed, domain, domain_glo 157 221 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_needed222 USE netcdf_mod, ONLY : nf90_close 159 223 IMPLICIT NONE 160 INTEGER :: ij 224 INTEGER :: ij, ierr 161 225 INTEGER, ALLOCATABLE :: cell_ij(:) 162 226 REAL(rstd), ALLOCATABLE :: angle_e(:) … … 178 242 swap_needed = .TRUE. 179 243 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 195 245 PRINT *, 'read_local_mesh : primal_num =', primal_num, domain_glo(1)%primal_own%ncell 196 246 … … 234 284 ALLOCATE(wee, source = Ddata_read2) 235 285 286 ! read cell centers and bounds 287 CALL read_local_mesh_bounds(domain(1)) 288 CALL read_local_mesh_bounds(domain_glo(1)) 289 236 290 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 242 295 max_primal_deg = SIZE(primal_edge,1) 243 296 max_dual_deg = SIZE(dual_edge,1) 244 297 max_trisk_deg = SIZE(trisk,1) 245 298 246 ! now post-process some of the data we just read247 ALLOCATE(ep_e(edge_num,3))248 299 DO ij=1,edge_num 249 300 clon = COS(lon_e(ij)) … … 254 305 elon = (/ -slon, clon, 0. /) 255 306 elat = (/ -slat*clon, -slat*slon, clat /) 256 ep_e( ij,:) = COS(angle_e(ij))*elon + SIN(angle_e(ij))*elat307 ep_e(:,ij) = COS(angle_e(ij))*elon + SIN(angle_e(ij))*elat 257 308 END DO 258 309 259 310 DEALLOCATE(angle_e) 260 311 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 312 CALL swap_geometry(1) 272 313 swap_needed = .FALSE. 314 273 315 END SUBROUTINE read_local_mesh 274 316
Note: See TracChangeset
for help on using the changeset viewer.