Changeset 481


Ignore:
Timestamp:
09/16/16 15:39:08 (8 years ago)
Author:
ymipsl
Message:

Physic column : OpenMP on vertical levsl is managed.

YM

File:
1 edited

Legend:

Unmodified
Added
Removed
  • codes/icosagcm/trunk/src/physics.f90

    r472 r481  
    99 
    1010  INTEGER :: phys_type 
    11   TYPE(t_field),POINTER :: f_extra_physics_2D(:), f_extra_physics_3D(:) 
    12   TYPE(t_field),POINTER :: f_dulon(:), f_dulat(:) 
    13   TYPE(t_field),POINTER :: f_temp(:) 
    14  
    15   CHARACTER(LEN=255) :: physics_type 
     11  TYPE(t_field),POINTER,SAVE :: f_extra_physics_2D(:), f_extra_physics_3D(:) 
     12  TYPE(t_field),POINTER,SAVE :: f_dulon(:), f_dulat(:) 
     13  TYPE(t_field),POINTER,SAVE :: f_ulon(:), f_ulat(:) 
     14  TYPE(t_field),POINTER,SAVE :: f_p(:), f_pk(:) 
     15  TYPE(t_field),POINTER,SAVE :: f_temp(:) 
     16 
     17  CHARACTER(LEN=255),SAVE :: physics_type 
    1618!$OMP THREADPRIVATE(physics_type) 
    1719 
     
    5557       CALL allocate_field(f_dulat,field_t,type_real,llm, name='dulat') 
    5658       CALL allocate_field(f_temp,field_t,type_real,llm, name='temp') 
     59       CALL allocate_field(f_ulon,field_t,type_real,llm, name='ulon') 
     60       CALL allocate_field(f_ulat,field_t,type_real,llm, name='ulat') 
     61       CALL allocate_field(f_p,field_t,type_real,llm+1, name='p') 
     62       CALL allocate_field(f_pk,field_t,type_real,llm, name='pk') 
    5763       CALL init_pack_before ! Compute physics_inout%ngrid and offsets used by pack/unpack 
    5864       CALL init_physics_dcmip 
     
    6369       CALL allocate_field(f_dulat,field_t,type_real,llm, name='dulat') 
    6470       CALL allocate_field(f_temp,field_t,type_real,llm, name='temp') 
     71       CALL allocate_field(f_ulon,field_t,type_real,llm, name='ulon') 
     72       CALL allocate_field(f_ulat,field_t,type_real,llm, name='ulat') 
     73       CALL allocate_field(f_p,field_t,type_real,llm+1, name='p') 
     74       CALL allocate_field(f_pk,field_t,type_real,llm, name='pk') 
    6575       CALL init_pack_before ! Compute physics_inout%ngrid and offsets used by pack/unpack 
    6676       CALL init_physics_dcmip2016 
     
    139149    USE theta2theta_rhodz_mod 
    140150    USE mpipara 
     151    USE omp_para 
     152    USE checksum_mod 
    141153    IMPLICIT NONE 
    142154    TYPE(t_field),POINTER :: f_phis(:) 
     
    152164    REAL(rstd),POINTER :: dulat(:,:) 
    153165    REAL(rstd),POINTER :: q(:,:,:) 
     166    REAL(rstd),POINTER :: p(:,:) 
     167    REAL(rstd),POINTER :: pk(:,:) 
     168    REAL(rstd),POINTER :: ulon(:,:) 
     169    REAL(rstd),POINTER :: ulat(:,:) 
    154170    INTEGER :: it, ind 
    155171 
     
    165181       ue=f_ue(ind) 
    166182       q=f_q(ind) 
    167        CALL pack_physics(pack_info(ind), phis, ps, temp, ue, q) 
     183       p=f_p(ind) 
     184       pk=f_pk(ind) 
     185       ulon=f_ulon(ind) 
     186       ulat=f_ulat(ind) 
     187       CALL pack_physics(pack_info(ind), phis, ps, temp, ue, q, p, pk, ulon, ulat) 
    168188    END DO 
    169189 
    170190    SELECT CASE(phys_type) 
    171191    CASE (phys_DCMIP) 
    172        CALL full_physics_dcmip 
     192       IF (is_omp_level_master) CALL full_physics_dcmip 
    173193    CASE (phys_DCMIP2016) 
    174        CALL full_physics_dcmip2016 
     194       IF (is_omp_level_master) CALL full_physics_dcmip2016 
    175195    CASE DEFAULT 
    176        IF(is_mpi_master) PRINT *,'Internal error : illegal value of phys_type', phys_type 
     196       IF(is_master) PRINT *,'Internal error : illegal value of phys_type', phys_type 
    177197       STOP 
    178198    END SELECT 
     
    189209       CALL unpack_physics(pack_info(ind), ps, temp, q, dulon, dulat) 
    190210    END DO 
     211     
    191212    CALL temperature2theta_rhodz(f_ps,f_temp,f_theta_rhodz) 
    192213 
     
    207228  END SUBROUTINE physics_column 
    208229 
    209   SUBROUTINE pack_physics(info, phis, ps, temp, ue, q ) 
     230  SUBROUTINE pack_physics(info, phis, ps, temp, ue, q, p, pk, ulon, ulat ) 
    210231    USE icosa 
    211232    USE wind_mod 
     
    214235    USE physics_interface_mod 
    215236    USE exner_mod 
     237    USE omp_para 
    216238    IMPLICIT NONE 
    217239    TYPE(t_pack_info) :: info 
     
    236258    CALL compute_wind_centered(ue,uc) 
    237259    CALL compute_wind_centered_lonlat_compound(uc, ulon, ulat) 
    238  
    239     CALL pack_domain(info, phis, physics_inout%phis) 
    240     CALL pack_domain(info, p, physics_inout%p) 
    241     CALL pack_domain(info, pk, physics_inout%pk) 
    242     CALL pack_domain(info, Temp, physics_inout%Temp) 
    243     CALL pack_domain(info, ulon, physics_inout%ulon) 
    244     CALL pack_domain(info, ulat, physics_inout%ulat) 
    245     CALL pack_domain(info, q, physics_inout%q) 
     260!$OMP BARRIER 
     261    IF (is_omp_level_master) THEN 
     262      CALL pack_domain(info, phis, physics_inout%phis) 
     263      CALL pack_domain(info, p, physics_inout%p) 
     264      CALL pack_domain(info, pk, physics_inout%pk) 
     265      CALL pack_domain(info, Temp, physics_inout%Temp) 
     266      CALL pack_domain(info, ulon, physics_inout%ulon) 
     267      CALL pack_domain(info, ulat, physics_inout%ulat) 
     268      CALL pack_domain(info, q, physics_inout%q) 
     269    ENDIF 
     270!$OMP BARRIER 
    246271  END SUBROUTINE pack_physics 
    247272 
     
    250275    USE physics_interface_mod 
    251276    USE theta2theta_rhodz_mod 
     277    USE omp_para 
    252278    IMPLICIT NONE 
    253279    TYPE(t_pack_info) :: info 
     
    260286    REAL(rstd) :: dq(iim*jjm,llm,nqtot) 
    261287    REAL(rstd) :: dTemp(iim*jjm,llm) 
    262     CALL unpack_domain(info, dulon, physics_inout%dulon) 
    263     CALL unpack_domain(info, dulat, physics_inout%dulat) 
    264     CALL unpack_domain(info, dq, physics_inout%dq) 
    265     CALL unpack_domain(info, Temp, physics_inout%Temp) 
    266     CALL unpack_domain(info, dTemp, physics_inout%dTemp) 
    267     q = q + physics_inout%dt_phys * dq 
    268     Temp = Temp + physics_inout%dt_phys * dTemp 
     288 
     289!$OMP BARRIER 
     290    IF (is_omp_level_master) THEN 
     291      CALL unpack_domain(info, dulon, physics_inout%dulon) 
     292      CALL unpack_domain(info, dulat, physics_inout%dulat) 
     293      CALL unpack_domain(info, dq, physics_inout%dq) 
     294      CALL unpack_domain(info, Temp, physics_inout%Temp) 
     295      CALL unpack_domain(info, dTemp, physics_inout%dTemp) 
     296      q = q + physics_inout%dt_phys * dq 
     297      Temp = Temp + physics_inout%dt_phys * dTemp 
     298    ENDIF 
     299!$OMP BARRIER 
     300 
    269301!    CALL compute_temperature2theta_rhodz(ps,Temp,theta_rhodz,0) 
    270302  END SUBROUTINE unpack_physics 
     
    274306    USE physics_interface_mod 
    275307    USE wind_mod 
     308    USE omp_para 
    276309    IMPLICIT NONE 
    277310    REAL(rstd) :: dulon(iim*jjm,llm) 
     
    284317    CALL compute_wind_centered_from_lonlat_compound(dulon,dulat,duc) 
    285318    dt2=.5*physics_inout%dt_phys 
    286     DO l=1,llm 
     319    DO l=ll_begin,ll_end 
    287320      DO j=jj_begin,jj_end 
    288321        DO i=ii_begin,ii_end 
Note: See TracChangeset for help on using the changeset viewer.