Changeset 624


Ignore:
Timestamp:
12/08/17 15:08:49 (6 years ago)
Author:
dubos
Message:

devel : introduced kernels for caldyn_vert (optional)

Location:
codes/icosagcm/devel/src
Files:
4 added
5 edited

Legend:

Unmodified
Added
Removed
  • codes/icosagcm/devel/src/base/earth_const.f90

    r564 r624  
    2828  !$OMP THREADPRIVATE(boussinesq) 
    2929  !$OMP THREADPRIVATE(hydrostatic)  
    30   LOGICAL :: dysl, dysl_geopot, dysl_pvort_only, dysl_caldyn_fast, dysl_caldyn_coriolis, dysl_slow_hydro 
    31   !$OMP THREADPRIVATE(dysl, dysl_geopot, dysl_pvort_only, dysl_caldyn_fast, dysl_caldyn_coriolis, dysl_slow_hydro) 
     30  LOGICAL :: dysl, dysl_geopot, dysl_pvort_only, dysl_caldyn_fast, dysl_caldyn_coriolis, dysl_slow_hydro, dysl_caldyn_vert 
     31  !$OMP THREADPRIVATE(dysl, dysl_geopot, dysl_pvort_only, dysl_caldyn_fast, dysl_caldyn_coriolis, dysl_slow_hydro, dysl_caldyn_vert) 
    3232 
    3333CONTAINS 
  • codes/icosagcm/devel/src/dynamics/caldyn_gcm.F90

    r586 r624  
    3434    dysl_caldyn_coriolis=dysl 
    3535    CALL getin("dysl_caldyn_coriolis",dysl_caldyn_coriolis) 
     36    dysl_caldyn_vert=dysl 
     37    CALL getin("dysl_caldyn_vert",dysl_caldyn_vert) 
    3638 
    3739    def='energy' 
  • codes/icosagcm/devel/src/dynamics/caldyn_kernels_base.F90

    r612 r624  
    180180    REAL(rstd),INTENT(INOUT) :: dtheta_rhodz(iim*jjm,llm,nqdyn) 
    181181    REAL(rstd),INTENT(OUT) :: dps(iim*jjm) 
     182    INTEGER, PARAMETER :: caldyn_vert_cons=1, caldyn_vert_variant=caldyn_vert_cons 
    182183 
    183184    ! temporary variable     
    184185    INTEGER :: i,j,ij,l,iq 
    185     REAL(rstd) :: p_ik, exner_ik 
     186    REAL(rstd) :: p_ik, exner_ik, dF_deta, dFu_deta 
    186187    INTEGER    :: ij_omp_begin, ij_omp_end 
    187188 
     
    190191    CALL distrib_level(ij_begin,ij_end, ij_omp_begin,ij_omp_end) 
    191192 
    192     !    REAL(rstd) :: wwuu(iim*3*jjm,llm+1) ! tmp var, don't know why but gain 30% on the whole code in opemp 
    193     ! need to be understood 
    194  
    195     !    wwuu=wwuu_out 
    196     CALL trace_start("compute_caldyn_vert") 
     193    IF(dysl_caldyn_vert) THEN 
     194#define mass_bl(ij,l) bp(ij) 
     195#define dmass_col(ij) dps(ij) 
     196#include "../kernels_hex/caldyn_wflux.k90" 
     197#include "../kernels_hex/caldyn_vert.k90" 
     198#undef mass_bl 
     199#undef dmass_col 
     200    ELSE 
    197201 
    198202    !$OMP BARRIER    
    199203!!! cumulate mass flux convergence from top to bottom 
    200     !  IF (is_omp_level_master) THEN 
    201204    DO  l = llm-1, 1, -1 
    202        !    IF (caldyn_conserv==energy) CALL test_message(req_qu)  
    203  
    204 !!$OMP DO SCHEDULE(STATIC)  
    205205       !DIR$ SIMD 
    206206       DO ij=ij_omp_begin,ij_omp_end          
     
    212212    !$OMP BARRIER 
    213213    ! FLUSH on convm 
    214 !!!!!!!!!!!!!!!!!!!!!!!!! 
    215  
    216     ! compute dps 
     214    ! compute dmass_col 
    217215    IF (is_omp_first_level) THEN 
    218216       !DIR$ SIMD 
     
    277275    ENDDO 
    278276 
    279     !  DO l=ll_beginp1,ll_end 
    280     !!DIR$ SIMD 
    281     !      DO ij=ij_begin,ij_end          
    282     !        wwuu_out(ij+u_right,l) = wwuu(ij+u_right,l) 
    283     !        wwuu_out(ij+u_lup,l)   = wwuu(ij+u_lup,l) 
    284     !        wwuu_out(ij+u_ldown,l) = wwuu(ij+u_ldown,l) 
    285     !     ENDDO 
    286     !   ENDDO 
     277    END IF ! dysl 
    287278 
    288279    CALL trace_end("compute_caldyn_vert") 
  • codes/icosagcm/devel/src/kernels_unst/caldyn_vert.k90

    r614 r624  
    11   !-------------------------------------------------------------------------- 
    22   !---------------------------- caldyn_vert ---------------------------------- 
    3    !$OMP DO SCHEDULE(STATIC) 
    4    DO ij=1,primal_num 
    5       DO l = llm-1,1,-1 
    6          ! cumulate mass flux convergence from top to bottom 
    7          convm(l,ij) = convm(l,ij) + convm(l+1,ij) 
    8       END DO 
    9       l=1 
    10       dmass_col(ij) = convm(l,ij) 
    11       DO l = 2,llm 
    12          ! Compute vertical mass flux (l=1,llm+1 set to zero at init) 
    13          wflux(l,ij) = mass_bl(l,ij) * dmass_col(ij) - convm(l,ij) 
    14       END DO 
    15    END DO 
    16    !$OMP END DO 
    17    ! make sure wflux is up to date 
    18    !$OMP BARRIER 
    19    !$OMP DO SCHEDULE(STATIC) 
    20    DO edge = 1, edge_num 
    21       ij_left = left(edge) 
    22       ij_right = right(edge) 
    23       DO l = 2, llm 
    24          wwuu(l,edge) = .5*(wflux(l,ij_left)+wflux(l,ij_right))*(u(l,edge)-u(l-1,edge)) 
    25       END DO 
    26    END DO 
    27    !$OMP END DO 
    28    ! make sure wwuu is up to date 
    29    !$OMP BARRIER 
    30    !$OMP DO SCHEDULE(STATIC) 
    31    DO ij = 1, primal_num 
    32       DO l = 1, llm 
    33          convm(l,ij) = mass_dbk(l,ij) * dmass_col(ij) ! FIXME : we shoud prognose mass_col 
    34       END DO 
    35    END DO 
    36    !$OMP END DO 
    37    !$OMP DO SCHEDULE(STATIC) 
    38    DO edge = 1, edge_num 
    39       ij_left = left(edge) 
    40       ij_right = right(edge) 
    41       DO l = 1, llm 
    42          du(l,edge) = du(l,edge) - (wwuu(l,edge)+wwuu(l+1,edge)) / (rhodz(l,ij_left)+rhodz(l,ij_right)) 
    43       END DO 
    44    END DO 
    45    !$OMP END DO 
    463   DO iq=1,nqdyn 
    474      !$OMP DO SCHEDULE(STATIC) 
     
    6017      !$OMP END DO 
    6118   END DO 
     19   IF(caldyn_vert_variant == caldyn_vert_cons) THEN 
     20      ! conservative vertical transport of momentum : (F/m)du/deta = 1/m (d/deta(Fu)-u.dF/deta) 
     21      !$OMP DO SCHEDULE(STATIC) 
     22      DO edge = 1, edge_num 
     23         ij_left = left(edge) 
     24         ij_right = right(edge) 
     25         DO l = 2, llm 
     26            wwuu(l,edge) = .25*(wflux(l,ij_left)+wflux(l,ij_right))*(u(l,edge)+u(l-1,edge)) ! Fu 
     27         END DO 
     28      END DO 
     29      !$OMP END DO 
     30      ! make sure wwuu is up to date 
     31      !$OMP BARRIER 
     32      !$OMP DO SCHEDULE(STATIC) 
     33      DO edge = 1, edge_num 
     34         ij_left = left(edge) 
     35         ij_right = right(edge) 
     36         DO l = 1, llm 
     37            dFu_deta = wwuu(l+1,edge)-wwuu(l,edge) ! d/deta (F*u) 
     38            dF_deta = .5*(wflux(l+1,ij_left)+wflux(l+1,ij_right)-(wflux(l,ij_left)+wflux(l,ij_right))) ! d/deta(F) 
     39            du(l,edge) = du(l,edge) - (dFu_deta-u(l,edge)*dF_deta) / (.5*(rhodz(l,ij_left)+rhodz(l,ij_right))) ! (F/m)du/deta 
     40         END DO 
     41      END DO 
     42      !$OMP END DO 
     43   ELSE 
     44      !$OMP DO SCHEDULE(STATIC) 
     45      DO edge = 1, edge_num 
     46         ij_left = left(edge) 
     47         ij_right = right(edge) 
     48         DO l = 2, llm 
     49            wwuu(l,edge) = .5*(wflux(l,ij_left)+wflux(l,ij_right))*(u(l,edge)-u(l-1,edge)) 
     50         END DO 
     51      END DO 
     52      !$OMP END DO 
     53      ! make sure wwuu is up to date 
     54      !$OMP BARRIER 
     55      !$OMP DO SCHEDULE(STATIC) 
     56      DO edge = 1, edge_num 
     57         ij_left = left(edge) 
     58         ij_right = right(edge) 
     59         DO l = 1, llm 
     60            du(l,edge) = du(l,edge) - (wwuu(l,edge)+wwuu(l+1,edge)) / (rhodz(l,ij_left)+rhodz(l,ij_right)) 
     61         END DO 
     62      END DO 
     63      !$OMP END DO 
     64   END IF 
    6265   !---------------------------- caldyn_vert ---------------------------------- 
    6366   !-------------------------------------------------------------------------- 
  • codes/icosagcm/devel/src/unstructured/caldyn_unstructured.F90

    r615 r624  
    22  USE ISO_C_BINDING 
    33  USE OMP_LIB 
     4#ifdef CPP_USING_XIOS 
    45  USE xios 
     6#endif 
    57  IMPLICIT NONE 
    68  PRIVATE 
    79  SAVE 
    810 
    9 #define BINDC(thename) BIND(C, name='dynamico_' // #thename) 
     11#define BINDC_(thename) BIND(C, name=#thename) 
     12#define BINDC(thename) BINDC_(dynamico_ ## thename) 
    1013! 
    1114#define DBL REAL(C_DOUBLE) 
     
    1518#define INDEX INTEGER(C_INT) 
    1619#define PHI_BOT(ij) Phi_bot 
    17 #define PHI_BOT_VAR 0.d0 
    18 ! 
    19   INTEGER, PARAMETER :: eta_mass=1, eta_lag=2, thermo_theta=1, thermo_entropy=2, thermo_moist=3, thermo_boussinesq=4 
    20   INTEGER(C_INT),  BIND(C) :: caldyn_thermo=thermo_theta, caldyn_eta=eta_lag, nb_threads=1 
     20#define PHI_BOT_VAR 0. 
     21! 
     22  INTEGER, PARAMETER :: eta_mass=1, eta_lag=2, & 
     23       thermo_theta=1, thermo_entropy=2, thermo_moist=3, thermo_boussinesq=4, & 
     24       caldyn_vert_cons=1 
     25  INTEGER(C_INT),  BIND(C) :: caldyn_thermo=thermo_theta, caldyn_eta=eta_lag, & 
     26       caldyn_vert_variant=caldyn_vert_cons, nb_threads=1 
    2127  LOGICAL(C_BOOL), BIND(C) :: hydrostatic=.TRUE., debug_hevi_solver=.TRUE., rigid=.TRUE. 
    2228! 
     
    4046! 
    4147  INTEGER(C_INT), BIND(C) :: comm_icosa 
     48 
     49#ifdef CPP_USING_XIOS 
    4250  TYPE(xios_context) :: ctx_hdl 
     51#endif 
    4352 
    4453CONTAINS 
     
    199208  DOUBLE2(llm+1, edge_num) :: wwuu 
    200209  DECLARE_INDICES 
     210  DBL :: dF_deta, dFu_deta 
    201211  wwuu=0. 
     212#include "../kernels_unst/caldyn_wflux.k90" 
     213#include "../kernels_unst/caldyn_dmass.k90" 
    202214#include "../kernels_unst/caldyn_vert.k90" 
    203215END SUBROUTINE caldyn_vert 
     
    392404!---------------------------------------------- XIOS ----------------------------------------- 
    393405 
     406#ifdef CPP_USING_XIOS 
     407 
    394408  SUBROUTINE setup_xios() BINDC(setup_xios) 
    395409    ! MPI_INIT / MPI_finalize are assumed to be called BEFORE/AFTER this routine 
     
    443457  END SUBROUTINE call_xios_update_calendar 
    444458 
     459#endif 
     460 
    445461END MODULE caldyn_unstructured_mod 
Note: See TracChangeset for help on using the changeset viewer.