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/parallel/domain.f90

    r867 r879  
    11MODULE domain_mod 
    22  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 
    316 
    417  TYPE t_domain 
     
    6073    INTEGER :: u_pos(6) 
    6174    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 
    6378  END TYPE t_domain 
    6479 
    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 
    6789 
    6890  LOGICAL :: swap_needed=.TRUE. ! .FALSE. if a thread always computes on the same domain 
    6991  !$OMP THREADPRIVATE(swap_needed) 
    7092 
    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 domain  
    75   INTEGER,ALLOCATABLE,SAVE :: domglo_loc_ind(:) ! size : ndomain_glo : corresponding local indice for a global domain indice 
    76   INTEGER,ALLOCATABLE,SAVE :: domloc_glo_ind(:) ! size : ndomain : corresponding global indice for a local domain indice 
    77  
    78   LOGICAL, ALLOCATABLE, SAVE :: assigned_domain(:) ! size : ndomain : is an omp task is assigned to this domain 
     93  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 
    79101!$OMP THREADPRIVATE(assigned_domain) 
    80102     
    81103CONTAINS 
     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 
    82126 
    83127  SUBROUTINE create_domain 
     
    85129  USE mpipara 
    86130  USE ioipsl 
    87   IMPLICIT NONE 
    88131  INTEGER :: ind,nf,ni,nj,i,j 
    89132  INTEGER :: quotient, rest 
     
    93136  
    94137    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 
    96140    ALLOCATE(domglo_rank(ndomain_glo)) 
    97141    ALLOCATE(domglo_loc_ind(ndomain_glo)) 
     
    178222   
    179223  SUBROUTINE copy_domain(d1,d2) 
    180   IMPLICIT NONE 
    181224  INTEGER :: face 
    182225  TYPE(t_domain),TARGET,INTENT(IN) :: d1 
     
    245288  SUBROUTINE assign_cell 
    246289  USE metric 
    247   IMPLICIT NONE 
    248290    INTEGER :: ind_d,ind,ind2,e,v 
    249291    INTEGER :: nf,nf2 
     
    365407  SUBROUTINE compute_boundary 
    366408  USE spherical_geom_mod 
    367   IMPLICIT NONE 
    368409    INTEGER :: ind_d 
    369410    INTEGER :: i,j,k 
     
    388429  SUBROUTINE set_neighbour_indice 
    389430  USE metric 
    390   IMPLICIT NONE 
    391431    INTEGER :: ind_d 
    392432    TYPE(t_domain),POINTER :: d  
     
    444484  USE mpipara 
    445485  USE grid_param 
    446   IMPLICIT NONE 
    447486    INTEGER :: nb_domain(0:mpi_size-1) 
    448487    INTEGER :: rank, ind,ind_glo 
     
    456495     
    457496    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 
    459502    ALLOCATE(domloc_glo_ind(ndomain)) 
    460503     
     
    588631  USE omp_para 
    589632  USE mpipara 
    590   IMPLICIT NONE 
    591633    INTEGER :: nb_domain 
    592634    INTEGER :: rank, ind, i 
     
    629671  SUBROUTINE compute_domain 
    630672    USE grid_param, ONLY : grid_type, grid_unst, grid_ico 
    631     IMPLICIT NONE 
     673    INTEGER :: ind 
    632674    SELECT CASE(grid_type) 
    633675    CASE(grid_unst) 
    634676       ! FIXME temporary, sequential hack 
    635677       ndomain_glo=1 
    636        ALLOCATE(domain_glo(ndomain_glo)) 
     678       CALL allocate_mesh(ndomain_glo, mesh_glo) 
     679       domain_glo => mesh_glo%domain 
    637680       ALLOCATE(domglo_rank(ndomain_glo)) 
    638681       ALLOCATE(domglo_loc_ind(ndomain_glo)) 
     
    641684 
    642685       ndomain=1 
    643        ALLOCATE(domain(ndomain)) 
     686       CALL allocate_mesh(ndomain, mesh_loc) 
     687       domain => mesh_loc%domain 
    644688       ALLOCATE(domloc_glo_ind(ndomain)) 
    645689       ALLOCATE(assigned_domain(ndomain)) 
     
    658702       CALL assign_domain 
    659703    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 
    660716  END SUBROUTINE compute_domain 
    661717           
Note: See TracChangeset for help on using the changeset viewer.