Changeset 879 for codes/icosagcm/devel/src/parallel
- Timestamp:
- 06/04/19 18:03:54 (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
codes/icosagcm/devel/src/parallel/domain.f90
r867 r879 1 1 MODULE domain_mod 2 2 USE domain_param 3 IMPLICIT NONE 4 SAVE 5 6 TYPE t_cellset 7 ! derived type containing arrays for lat,lon of center and bounds of cells of primal or dual mesh 8 ! this information is needed to write CF-compliant NetCDF files 9 ! and by XIOS 10 INTEGER :: ncell 11 INTEGER, ALLOCATABLE :: ij(:), & ! ij(n) = local index of cell n 12 ind_glo(:), & ! ind_glo(n) = global index of cell n 13 sgn(:) ! sign to apply before writing to disk (velocities) 14 REAL, ALLOCATABLE :: lon(:), lat(:), bnds_lon(:,:), bnds_lat(:,:) 15 END type t_cellset 3 16 4 17 TYPE t_domain … … 60 73 INTEGER :: u_pos(6) 61 74 INTEGER :: z_pos(6) 62 75 76 TYPE(t_cellset), POINTER :: primal_own, dual_own, edge_own, & 77 primal_all, dual_all, edge_all ! halo included, used for debug by writefield 63 78 END TYPE t_domain 64 79 65 INTEGER,SAVE :: ndomain 66 INTEGER,SAVE :: ndomain_glo 80 TYPE t_mesh 81 INTEGER :: ndomain, primal_num, edge_num, dual_num 82 TYPE(t_domain), ALLOCATABLE :: domain(:) 83 TYPE(t_cellset), ALLOCATABLE :: primal_own(:), dual_own(:), edge_own(:), & 84 primal_all(:), dual_all(:), edge_all(:) 85 END type t_mesh 86 87 INTEGER :: ndomain 88 INTEGER :: ndomain_glo 67 89 68 90 LOGICAL :: swap_needed=.TRUE. ! .FALSE. if a thread always computes on the same domain 69 91 !$OMP THREADPRIVATE(swap_needed) 70 92 71 TYPE(t_ domain),SAVE,ALLOCATABLE,TARGET :: domain(:)72 TYPE(t_domain), SAVE,ALLOCATABLE,TARGET ::domain_glo(:)73 74 INTEGER,ALLOCATABLE ,SAVE:: domglo_rank(:) ! size : ndomain_glo : mpi rank assigned to a domain75 INTEGER,ALLOCATABLE ,SAVE:: domglo_loc_ind(:) ! size : ndomain_glo : corresponding local indice for a global domain indice76 INTEGER,ALLOCATABLE ,SAVE:: domloc_glo_ind(:) ! size : ndomain : corresponding global indice for a local domain indice77 78 LOGICAL, ALLOCATABLE , SAVE:: assigned_domain(:) ! size : ndomain : is an omp task is assigned to this domain93 TYPE(t_mesh), TARGET :: mesh_loc, mesh_glo 94 TYPE(t_domain), POINTER :: domain(:), domain_glo(:) 95 96 INTEGER,ALLOCATABLE :: domglo_rank(:) ! size : ndomain_glo : mpi rank assigned to a domain 97 INTEGER,ALLOCATABLE :: domglo_loc_ind(:) ! size : ndomain_glo : corresponding local indice for a global domain indice 98 INTEGER,ALLOCATABLE :: domloc_glo_ind(:) ! size : ndomain : corresponding global indice for a local domain indice 99 100 LOGICAL, ALLOCATABLE :: assigned_domain(:) ! size : ndomain : is an omp task is assigned to this domain 79 101 !$OMP THREADPRIVATE(assigned_domain) 80 102 81 103 CONTAINS 104 105 SUBROUTINE allocate_mesh(ndom, mesh) 106 INTEGER, INTENT(IN) :: ndom 107 TYPE(t_mesh), TARGET, INTENT(OUT) :: mesh 108 INTEGER :: ind 109 mesh%ndomain = ndom 110 ALLOCATE(mesh%domain(ndom)) 111 ALLOCATE(mesh%primal_own(ndom)) 112 ALLOCATE(mesh%primal_all(ndom)) 113 ALLOCATE(mesh%dual_own(ndom)) 114 ALLOCATE(mesh%dual_all(ndom)) 115 ALLOCATE(mesh%edge_own(ndom)) 116 ALLOCATE(mesh%edge_all(ndom)) 117 DO ind=1, ndom 118 mesh%domain(ind)%primal_own => mesh%primal_own(ind) 119 mesh%domain(ind)%primal_all => mesh%primal_all(ind) 120 mesh%domain(ind)%dual_own => mesh%dual_own(ind) 121 mesh%domain(ind)%dual_all => mesh%dual_all(ind) 122 mesh%domain(ind)%edge_own => mesh%edge_own(ind) 123 mesh%domain(ind)%edge_all => mesh%edge_all(ind) 124 END DO 125 END SUBROUTINE allocate_mesh 82 126 83 127 SUBROUTINE create_domain … … 85 129 USE mpipara 86 130 USE ioipsl 87 IMPLICIT NONE88 131 INTEGER :: ind,nf,ni,nj,i,j 89 132 INTEGER :: quotient, rest … … 93 136 94 137 ndomain_glo=nsplit_i*nsplit_j*nb_face 95 ALLOCATE(domain_glo(ndomain_glo)) 138 CALL allocate_mesh(ndomain_glo, mesh_glo) 139 domain_glo => mesh_glo%domain 96 140 ALLOCATE(domglo_rank(ndomain_glo)) 97 141 ALLOCATE(domglo_loc_ind(ndomain_glo)) … … 178 222 179 223 SUBROUTINE copy_domain(d1,d2) 180 IMPLICIT NONE181 224 INTEGER :: face 182 225 TYPE(t_domain),TARGET,INTENT(IN) :: d1 … … 245 288 SUBROUTINE assign_cell 246 289 USE metric 247 IMPLICIT NONE248 290 INTEGER :: ind_d,ind,ind2,e,v 249 291 INTEGER :: nf,nf2 … … 365 407 SUBROUTINE compute_boundary 366 408 USE spherical_geom_mod 367 IMPLICIT NONE368 409 INTEGER :: ind_d 369 410 INTEGER :: i,j,k … … 388 429 SUBROUTINE set_neighbour_indice 389 430 USE metric 390 IMPLICIT NONE391 431 INTEGER :: ind_d 392 432 TYPE(t_domain),POINTER :: d … … 444 484 USE mpipara 445 485 USE grid_param 446 IMPLICIT NONE447 486 INTEGER :: nb_domain(0:mpi_size-1) 448 487 INTEGER :: rank, ind,ind_glo … … 456 495 457 496 ndomain=nb_domain(mpi_rank) 458 ALLOCATE(domain(ndomain)) 497 498 ! ALLOCATE(domain(ndomain)) 499 CALL allocate_mesh(ndomain, mesh_loc) 500 domain => mesh_loc%domain 501 459 502 ALLOCATE(domloc_glo_ind(ndomain)) 460 503 … … 588 631 USE omp_para 589 632 USE mpipara 590 IMPLICIT NONE591 633 INTEGER :: nb_domain 592 634 INTEGER :: rank, ind, i … … 629 671 SUBROUTINE compute_domain 630 672 USE grid_param, ONLY : grid_type, grid_unst, grid_ico 631 I MPLICIT NONE673 INTEGER :: ind 632 674 SELECT CASE(grid_type) 633 675 CASE(grid_unst) 634 676 ! FIXME temporary, sequential hack 635 677 ndomain_glo=1 636 ALLOCATE(domain_glo(ndomain_glo)) 678 CALL allocate_mesh(ndomain_glo, mesh_glo) 679 domain_glo => mesh_glo%domain 637 680 ALLOCATE(domglo_rank(ndomain_glo)) 638 681 ALLOCATE(domglo_loc_ind(ndomain_glo)) … … 641 684 642 685 ndomain=1 643 ALLOCATE(domain(ndomain)) 686 CALL allocate_mesh(ndomain, mesh_loc) 687 domain => mesh_loc%domain 644 688 ALLOCATE(domloc_glo_ind(ndomain)) 645 689 ALLOCATE(assigned_domain(ndomain)) … … 658 702 CALL assign_domain 659 703 END SELECT 704 705 ! ALLOCATE(primal_cells(ndomain)) 706 ! ALLOCATE(dual_cells(ndomain)) 707 ! ALLOCATE(primal_cells_single(ndomain)) 708 ! ALLOCATE(dual_cells_single(ndomain)) 709 ! DO ind=1, ndomain 710 ! domain(ind)%primal_cells => primal_cells(ind) 711 ! domain(ind)%dual_cells => dual_cells(ind) 712 ! domain(ind)%primal_cells_single => primal_cells_single(ind) 713 ! domain(ind)%dual_cells_single => dual_cells_single(ind) 714 ! END DO 715 660 716 END SUBROUTINE compute_domain 661 717
Note: See TracChangeset
for help on using the changeset viewer.