Changeset 624 for codes/icosagcm/devel
- Timestamp:
- 12/08/17 15:08:49 (7 years ago)
- Location:
- codes/icosagcm/devel/src
- Files:
-
- 4 added
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
codes/icosagcm/devel/src/base/earth_const.f90
r564 r624 28 28 !$OMP THREADPRIVATE(boussinesq) 29 29 !$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) 32 32 33 33 CONTAINS -
codes/icosagcm/devel/src/dynamics/caldyn_gcm.F90
r586 r624 34 34 dysl_caldyn_coriolis=dysl 35 35 CALL getin("dysl_caldyn_coriolis",dysl_caldyn_coriolis) 36 dysl_caldyn_vert=dysl 37 CALL getin("dysl_caldyn_vert",dysl_caldyn_vert) 36 38 37 39 def='energy' -
codes/icosagcm/devel/src/dynamics/caldyn_kernels_base.F90
r612 r624 180 180 REAL(rstd),INTENT(INOUT) :: dtheta_rhodz(iim*jjm,llm,nqdyn) 181 181 REAL(rstd),INTENT(OUT) :: dps(iim*jjm) 182 INTEGER, PARAMETER :: caldyn_vert_cons=1, caldyn_vert_variant=caldyn_vert_cons 182 183 183 184 ! temporary variable 184 185 INTEGER :: i,j,ij,l,iq 185 REAL(rstd) :: p_ik, exner_ik 186 REAL(rstd) :: p_ik, exner_ik, dF_deta, dFu_deta 186 187 INTEGER :: ij_omp_begin, ij_omp_end 187 188 … … 190 191 CALL distrib_level(ij_begin,ij_end, ij_omp_begin,ij_omp_end) 191 192 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 197 201 198 202 !$OMP BARRIER 199 203 !!! cumulate mass flux convergence from top to bottom 200 ! IF (is_omp_level_master) THEN201 204 DO l = llm-1, 1, -1 202 ! IF (caldyn_conserv==energy) CALL test_message(req_qu)203 204 !!$OMP DO SCHEDULE(STATIC)205 205 !DIR$ SIMD 206 206 DO ij=ij_omp_begin,ij_omp_end … … 212 212 !$OMP BARRIER 213 213 ! FLUSH on convm 214 !!!!!!!!!!!!!!!!!!!!!!!!! 215 216 ! compute dps 214 ! compute dmass_col 217 215 IF (is_omp_first_level) THEN 218 216 !DIR$ SIMD … … 277 275 ENDDO 278 276 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 287 278 288 279 CALL trace_end("compute_caldyn_vert") -
codes/icosagcm/devel/src/kernels_unst/caldyn_vert.k90
r614 r624 1 1 !-------------------------------------------------------------------------- 2 2 !---------------------------- caldyn_vert ---------------------------------- 3 !$OMP DO SCHEDULE(STATIC)4 DO ij=1,primal_num5 DO l = llm-1,1,-16 ! cumulate mass flux convergence from top to bottom7 convm(l,ij) = convm(l,ij) + convm(l+1,ij)8 END DO9 l=110 dmass_col(ij) = convm(l,ij)11 DO l = 2,llm12 ! 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 DO15 END DO16 !$OMP END DO17 ! make sure wflux is up to date18 !$OMP BARRIER19 !$OMP DO SCHEDULE(STATIC)20 DO edge = 1, edge_num21 ij_left = left(edge)22 ij_right = right(edge)23 DO l = 2, llm24 wwuu(l,edge) = .5*(wflux(l,ij_left)+wflux(l,ij_right))*(u(l,edge)-u(l-1,edge))25 END DO26 END DO27 !$OMP END DO28 ! make sure wwuu is up to date29 !$OMP BARRIER30 !$OMP DO SCHEDULE(STATIC)31 DO ij = 1, primal_num32 DO l = 1, llm33 convm(l,ij) = mass_dbk(l,ij) * dmass_col(ij) ! FIXME : we shoud prognose mass_col34 END DO35 END DO36 !$OMP END DO37 !$OMP DO SCHEDULE(STATIC)38 DO edge = 1, edge_num39 ij_left = left(edge)40 ij_right = right(edge)41 DO l = 1, llm42 du(l,edge) = du(l,edge) - (wwuu(l,edge)+wwuu(l+1,edge)) / (rhodz(l,ij_left)+rhodz(l,ij_right))43 END DO44 END DO45 !$OMP END DO46 3 DO iq=1,nqdyn 47 4 !$OMP DO SCHEDULE(STATIC) … … 60 17 !$OMP END DO 61 18 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 62 65 !---------------------------- caldyn_vert ---------------------------------- 63 66 !-------------------------------------------------------------------------- -
codes/icosagcm/devel/src/unstructured/caldyn_unstructured.F90
r615 r624 2 2 USE ISO_C_BINDING 3 3 USE OMP_LIB 4 #ifdef CPP_USING_XIOS 4 5 USE xios 6 #endif 5 7 IMPLICIT NONE 6 8 PRIVATE 7 9 SAVE 8 10 9 #define BINDC(thename) BIND(C, name='dynamico_' // #thename) 11 #define BINDC_(thename) BIND(C, name=#thename) 12 #define BINDC(thename) BINDC_(dynamico_ ## thename) 10 13 ! 11 14 #define DBL REAL(C_DOUBLE) … … 15 18 #define INDEX INTEGER(C_INT) 16 19 #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 21 27 LOGICAL(C_BOOL), BIND(C) :: hydrostatic=.TRUE., debug_hevi_solver=.TRUE., rigid=.TRUE. 22 28 ! … … 40 46 ! 41 47 INTEGER(C_INT), BIND(C) :: comm_icosa 48 49 #ifdef CPP_USING_XIOS 42 50 TYPE(xios_context) :: ctx_hdl 51 #endif 43 52 44 53 CONTAINS … … 199 208 DOUBLE2(llm+1, edge_num) :: wwuu 200 209 DECLARE_INDICES 210 DBL :: dF_deta, dFu_deta 201 211 wwuu=0. 212 #include "../kernels_unst/caldyn_wflux.k90" 213 #include "../kernels_unst/caldyn_dmass.k90" 202 214 #include "../kernels_unst/caldyn_vert.k90" 203 215 END SUBROUTINE caldyn_vert … … 392 404 !---------------------------------------------- XIOS ----------------------------------------- 393 405 406 #ifdef CPP_USING_XIOS 407 394 408 SUBROUTINE setup_xios() BINDC(setup_xios) 395 409 ! MPI_INIT / MPI_finalize are assumed to be called BEFORE/AFTER this routine … … 443 457 END SUBROUTINE call_xios_update_calendar 444 458 459 #endif 460 445 461 END MODULE caldyn_unstructured_mod
Note: See TracChangeset
for help on using the changeset viewer.