Changeset 688
- Timestamp:
- 04/09/18 15:22:10 (6 years ago)
- Location:
- codes/icosagcm/devel/src/unstructured
- Files:
-
- 1 added
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
codes/icosagcm/devel/src/unstructured/caldyn_unstructured.F90
r665 r688 8 8 CONTAINS 9 9 10 # define DBL REAL(C_DOUBLE)10 #include "unstructured.h90" 11 11 12 12 #define INDICES1 ij,l,iq,iedge,edge,ivertex,vertex,ij_left,ij_right … … 18 18 #define LENGTHS le_de1,le_de2,le_de3,le_de4,le_de5,le_de6 19 19 #define DECLARE_INDICES INTEGER INDICES1,INDICES2 20 #define DECLARE_EDGES DBLSIGNS,LENGTHS ; INTEGER EDGES, EDGE_ENDS20 #define DECLARE_EDGES NUM SIGNS,LENGTHS ; INTEGER EDGES, EDGE_ENDS 21 21 #define DECLARE_VERTICES INTEGER VERTICES 22 22 #define PHI_BOT(ij) Phi_bot 23 24 #define BINDC_(thename) BIND(C, name=#thename)25 #define BINDC(thename) BINDC_(dynamico_ ## thename)26 27 #define DOUBLE1(m) DBL, DIMENSION(m)28 #define DOUBLE2(m,n) DBL, DIMENSION(m,n)29 #define DOUBLE3(m,n,p) DBL, DIMENSION(m,n,p)30 31 #define FIELD_PS DOUBLE1(primal_num)32 #define FIELD_MASS DOUBLE2(llm, primal_num)33 #define FIELD_Z DOUBLE2(llm, dual_num)34 #define FIELD_U DOUBLE2(llm, edge_num)35 #define FIELD_UL DOUBLE2(llm+1, edge_num)36 #define FIELD_THETA DOUBLE3(llm, primal_num, nqdyn)37 #define FIELD_GEOPOT DOUBLE2(llm+1, primal_num)38 23 39 24 #define HASNAN(field) (ANY(.NOT.ABS(field)<1e20)) … … 47 32 FIELD_MASS :: m_ik, theta ! IN*2 48 33 FIELD_GEOPOT :: m_il, W_il, Phi_il, Phi_star_il ! IN,INOUT*2, LOCAL 49 DBL:: tau, gamma, tau2_g, tau2_g2, g2, gm2, vreff, Rd_preff34 NUM :: tau, gamma, tau2_g, tau2_g2, g2, gm2, vreff, Rd_preff 50 35 INTEGER :: iter 51 36 DECLARE_INDICES 52 DBL:: rho_ij, X_ij, Y_ij, wil, rho_c2_mik, c2_mik, ml_g237 NUM :: rho_ij, X_ij, Y_ij, wil, rho_c2_mik, c2_mik, ml_g2 53 38 #define COLUMN 0 54 39 #if COLUMN 55 DOUBLE1(llm) :: pk, Ak, Ck56 DOUBLE1(llm+1):: Rl, Bl, Dl, xl40 NUM1(llm) :: pk, Ak, Ck 41 NUM1(llm+1):: Rl, Bl, Dl, xl 57 42 #define p_ik(l,ij) pk(l) 58 43 #define A_ik(l,ij) Ak(l) … … 90 75 DECLARE_INDICES 91 76 DECLARE_EDGES 92 DBL:: W_el, W2_el, gPhi2, dP, divG, u2, uu77 NUM :: W_el, W2_el, gPhi2, dP, divG, u2, uu 93 78 START_TRACE(id_slow_NH, 5,0,3) 94 79 #include "../kernels_unst/caldyn_slow_NH.k90" … … 97 82 98 83 SUBROUTINE compute_caldyn_solver(tau,rhodz,theta, berni,pres,m_il, pk,geopot,W,dPhi,dW,du) 99 DBL, INTENT(IN) :: tau84 NUM, INTENT(IN) :: tau 100 85 FIELD_MASS :: rhodz,pk,berni,pres ! IN, OUT, BUF*2 101 86 FIELD_THETA :: theta ! IN … … 103 88 FIELD_U :: du ! OUT 104 89 DECLARE_INDICES 105 DBL:: X_ij, rho_ij, T_ij, gamma, Cvd, vreff, Rd_preff90 NUM :: X_ij, rho_ij, T_ij, gamma, Cvd, vreff, Rd_preff 106 91 #include "../kernels_unst/caldyn_mil.k90" 107 92 IF(tau>0) THEN ! solve implicit problem for geopotential … … 118 103 FIELD_U :: du ! INOUT 119 104 DECLARE_INDICES 120 DBL:: w_ij, wflux_ij105 NUM :: w_ij, wflux_ij 121 106 START_TRACE(id_vert_NH, 6,0,1) 122 107 #include "../kernels_unst/caldyn_vert_NH.k90" … … 132 117 FIELD_PS :: ps ! OUT 133 118 DECLARE_INDICES 134 DBL:: gdz, ke, uu, chi, gv, exner_ik, temp_ik, p_ik, qv, Rmix119 NUM :: gdz, ke, uu, chi, gv, exner_ik, temp_ik, p_ik, qv, Rmix 135 120 START_TRACE(id_geopot, 3,0,3) 136 121 #include "../kernels_unst/compute_geopot.k90" … … 145 130 DECLARE_EDGES 146 131 LOGICAL, PARAMETER :: zero=.TRUE. 147 DBL:: ke, uu132 NUM :: ke, uu 148 133 START_TRACE(id_slow_hydro, 3,0,3) 149 134 #include "../kernels_unst/caldyn_slow_hydro.k90" … … 161 146 FIELD_UL :: wwuu 162 147 DECLARE_INDICES 163 DBL:: dF_deta, dFu_deta148 NUM :: dF_deta, dFu_deta 164 149 wwuu=0. 165 150 !$OMP BARRIER … … 177 162 DECLARE_INDICES 178 163 DECLARE_EDGES 179 DBL:: divF, du_trisk164 NUM :: divF, du_trisk 180 165 START_TRACE(id_coriolis, 3,4,0) ! primal, dual, edge 181 166 #include "../kernels_unst/coriolis.k90" … … 188 173 FIELD_THETA :: theta, theta_rhodz 189 174 DECLARE_INDICES 190 DBL:: m175 NUM :: m 191 176 START_TRACE(id_theta, 3,0,0) ! primal, dual, edge 192 177 #include "../kernels_unst/theta.k90" … … 201 186 DECLARE_EDGES 202 187 DECLARE_VERTICES 203 DBL:: etav, hv188 NUM :: etav, hv 204 189 START_TRACE(id_pvort_only, 1,1,2) ! primal, dual, edge 205 190 #include "../kernels_unst/pvort_only.k90" … … 208 193 209 194 SUBROUTINE compute_caldyn_fast(tau, pk,berni,theta,geopot, du,u) 210 DBL, INTENT(IN) :: tau195 NUM, INTENT(IN) :: tau 211 196 FIELD_MASS :: pk,berni ! INOUT, OUT 212 197 FIELD_THETA :: theta ! IN … … 215 200 DECLARE_INDICES 216 201 DECLARE_EDGES 217 DBL:: due202 NUM :: due 218 203 START_TRACE(id_fast, 4,0,2) ! primal, dual, edge 219 204 #include "../kernels_unst/caldyn_fast.k90" … … 224 209 225 210 SUBROUTINE gradient(b,grad) BINDC(gradient) 226 DOUBLE2(llm,primal_num):: b227 DOUBLE2(llm,edge_num):: grad211 FIELD_MASS :: b 212 FIELD_u :: grad 228 213 DECLARE_INDICES 229 214 #include "../kernels_unst/gradient.k90" … … 231 216 ! 232 217 SUBROUTINE div(u,divu) BINDC(div) 233 DOUBLE2(llm,primal_num):: divu234 DOUBLE2(llm,edge_num):: u235 DECLARE_INDICES 236 DECLARE_EDGES 237 DBL:: div_ij218 FIELD_MASS :: divu 219 FIELD_u :: u 220 DECLARE_INDICES 221 DECLARE_EDGES 222 NUM :: div_ij 238 223 !$OMP PARALLEL NUM_THREADS(nb_threads) 239 224 #include "../kernels_unst/div.k90" -
codes/icosagcm/devel/src/unstructured/data_unstructured.F90
r683 r688 5 5 SAVE 6 6 7 #define BINDC_(thename) BIND(C, name=#thename) 8 #define BINDC(thename) BINDC_(dynamico_ ## thename) 9 10 #define DBL REAL(C_DOUBLE) 11 #define DOUBLE1(m) DBL, DIMENSION(m) 12 #define DOUBLE2(m,n) DBL, DIMENSION(m,n) 13 #define DOUBLE3(m,n,p) DBL, DIMENSION(m,n,p) 14 #define DOUBLE4(m,n,p,q) DBL, DIMENSION(m,n,p,q) 15 #define INDEX INTEGER(C_INT) 7 #include "unstructured.h90" 16 8 17 9 INTEGER, PARAMETER :: eta_mass=1, eta_lag=2, & … … 34 26 ! circulation is positive when going from down to up 35 27 36 DBL, BIND(C) :: elapsed, g, ptop, cpp, cppv, Rd, Rv, preff, Treff, &37 38 DBL:: kappa39 DOUBLE1(max_nb_stage), BIND(C) :: tauj ! diagonal of fast Butcher tableau40 DOUBLE2(max_nb_stage,max_nb_stage), BIND(C) :: cslj, cflj ! slow and fast modified Butcher tableaus41 DOUBLE1(:), ALLOCATABLE :: le_de, fv, Av, Ai42 DOUBLE2(:,:), ALLOCATABLE :: Riv2, wee, ap,bp, mass_bl, mass_dak, mass_dbk28 TIME, BIND(C) :: elapsed 29 NUM, BIND(C) :: g, ptop, cpp, cppv, Rd, Rv, preff, Treff, pbot, Phi_bot, rho_bot 30 NUM :: kappa 31 NUM1(max_nb_stage), BIND(C) :: tauj ! diagonal of fast Butcher tableau 32 NUM2(max_nb_stage,max_nb_stage), BIND(C) :: cslj, cflj ! slow and fast modified Butcher tableaus 33 NUM1(:), ALLOCATABLE :: le_de, fv, Av, Ai 34 NUM2(:,:), ALLOCATABLE :: Riv2, wee, ap,bp, mass_bl, mass_dak, mass_dbk 43 35 44 36 INTEGER(C_INT), BIND(C) :: comm_icosa … … 47 39 id_pvort_only=3, id_slow_hydro=4, id_fast=5, id_coriolis=6, id_theta=7, id_geopot=8, id_vert=9, & 48 40 id_solver=10, id_slow_NH=11, id_NH_geopot=12, id_vert_NH=13, id_update=14, nb_routines=14 49 DBL, PRIVATE :: start_time, time_spent(nb_routines) ! time spent in each kernel41 TIME, PRIVATE :: start_time, time_spent(nb_routines) ! time spent in each kernel 50 42 INTEGER, PRIVATE :: current_id, nb_calls(nb_routines) 51 43 INTEGER(KIND=8), PRIVATE :: bytes(nb_routines) ! bytes read or written by each kernel … … 61 53 num(:), & ! number of cells to send to / receive from other MPI ranks 62 54 cells(:) ! local indices of cells to send/receive 63 DBL, ALLOCATABLE :: buf2(:,:)55 NUM, ALLOCATABLE :: buf2(:,:) 64 56 END TYPE Halo_transfer 65 57 TYPE(Halo_transfer), TARGET :: send_info(transfer_max), recv_info(transfer_max) … … 79 71 SUBROUTINE print_trace() 80 72 INTEGER :: id 81 DBL:: total_spent73 TIME :: total_spent 82 74 !$OMP MASTER 83 75 total_spent=SUM(time_spent) … … 106 98 107 99 SUBROUTINE exit_trace() 108 DBL:: elapsed100 TIME :: elapsed 109 101 !$OMP MASTER 110 102 elapsed = OMP_GET_WTIME()-start_time … … 180 172 END SUBROUTINE init_mesh 181 173 174 ! Input arrays to init_metric and init_hybrid are declared DBL 175 ! => always float64 on the Python side 176 ! They are copied to Fortran arrays of type NUM (float or double) 177 182 178 SUBROUTINE init_metric(Ai_, Av_, fv_, le_de_, Riv2_, wee_) BINDC(init_metric) 183 DOUBLE1(primal_num) :: Ai_ 184 DOUBLE1(dual_num) :: Av_, fv_ 185 DOUBLE1(edge_num) :: le_de_ 186 DOUBLE2(max_dual_deg,dual_num) :: Riv2_ 187 DOUBLE2(max_trisk_deg,edge_num) :: wee_ 179 DBL :: Ai_(primal_num), Av_(dual_num), fv_(dual_num), le_de_(edge_num), & 180 Riv2_(max_dual_deg,dual_num), wee_(max_trisk_deg,edge_num) 188 181 PRINT *, 'init_metric ...' 189 182 ALLOC1(Ai,primal_num) … … 235 228 ! 236 229 SUBROUTINE init_hybrid(bl,dak,dbk) BINDC(init_hybrid) 237 D OUBLE2(llm+1, primal_num) :: bl238 DOUBLE2(llm, primal_num) :: dak,dbk230 DBL :: bl(llm+1, primal_num), & 231 dak(llm, primal_num), dbk(llm, primal_num) 239 232 PRINT *, 'Setting hybrid coefficients ...' 240 233 ALLOC2(mass_bl, llm+1, primal_num) -
codes/icosagcm/devel/src/unstructured/timestep_unstructured.F90
r683 r688 11 11 SAVE 12 12 13 #define BINDC_(thename) BIND(C, name=#thename)14 #define BINDC(thename) BINDC_(dynamico_ ## thename)15 16 #define DBL REAL(C_DOUBLE)17 #define DOUBLE1(m) DBL, DIMENSION(m)18 #define DOUBLE2(m,n) DBL, DIMENSION(m,n)19 #define DOUBLE3(m,n,p) DBL, DIMENSION(m,n,p)20 #define DOUBLE4(m,n,p,q) DBL, DIMENSION(m,n,p,q)21 #define INDEX INTEGER(C_INT)22 23 13 #ifdef CPP_USING_XIOS 24 14 TYPE(xios_context) :: ctx_hdl … … 27 17 CONTAINS 28 18 29 #define FIELD_PS DOUBLE1(primal_num) 30 #define FIELD_MASS DOUBLE2(llm, primal_num) 31 #define FIELD_Z DOUBLE2(llm, dual_num) 32 #define FIELD_U DOUBLE2(llm, edge_num) 33 #define FIELD_UL DOUBLE2(llm+1, edge_num) 34 #define FIELD_THETA DOUBLE3(llm, primal_num, nqdyn) 35 #define FIELD_GEOPOT DOUBLE2(llm+1, primal_num) 19 #include "unstructured.h90" 36 20 37 21 #define HASNAN(field) (ANY(.NOT.ABS(field)<1e20)) … … 41 25 dmass_col,drhodz,dtheta_rhodz,du_fast,du_slow, & 42 26 dPhi_fast, dPhi_slow, dW_fast, dW_slow) BINDC(caldyn_unstructured) ! OUT : tendencies 43 DBL, VALUE :: tau27 NUM, VALUE :: tau 44 28 FIELD_MASS :: rhodz, drhodz, pk, berni ! IN, OUT, DIAG 45 29 FIELD_THETA :: theta_rhodz, dtheta_rhodz, theta ! IN, OUT, DIAG … … 54 38 FIELD_UL :: bufu1, bufu2, bufu3,bufu4 55 39 56 DBL:: time1,time240 TIME :: time1,time2 57 41 INTEGER :: ij 58 42 … … 124 108 FIELD_GEOPOT :: geopot, w, wflux ! IN, INOUT, DIAG 125 109 FIELD_Z :: qv ! DIAG 126 DOUBLE2( primal_num, max_nb_stage) :: dmass_col ! OUT127 DOUBLE3(llm, primal_num, max_nb_stage) :: drhodz ! OUT128 DOUBLE4(llm, primal_num, nqdyn, max_nb_stage) :: dtheta_rhodz ! OUT129 DOUBLE3(llm, edge_num, max_nb_stage) :: du_fast,du_slow ! OUT130 DOUBLE3(llm+1, primal_num, max_nb_stage) :: &110 NUM2( primal_num, max_nb_stage) :: dmass_col ! OUT 111 NUM3(llm, primal_num, max_nb_stage) :: drhodz ! OUT 112 NUM4(llm, primal_num, nqdyn, max_nb_stage) :: dtheta_rhodz ! OUT 113 NUM3(llm, edge_num, max_nb_stage) :: du_fast,du_slow ! OUT 114 NUM3(llm+1, primal_num, max_nb_stage) :: & 131 115 dPhi_fast, dPhi_slow, dW_fast, dW_slow ! OUT 132 116 ! buffers for fields that need to be shared among OpenMP threads … … 134 118 FIELD_GEOPOT :: bufm1, bufm2, bufm3 135 119 FIELD_UL :: bufu1, bufu2, bufu3,bufu4 136 DBL:: time1,time2120 TIME :: time1,time2 137 121 INTEGER :: step, stage, iq, ij 138 122 … … 240 224 SUBROUTINE update(j,sz,clj,field,dfield) 241 225 INTEGER :: j, sz ! stage in ARK scheme, field size 242 DOUBLE2(max_nb_stage,max_nb_stage) :: clj ! modified Butcher tableau243 DOUBLE1(sz) :: field244 DOUBLE2(sz, max_nb_stage) :: dfield226 NUM2(max_nb_stage,max_nb_stage) :: clj ! modified Butcher tableau 227 NUM1(sz) :: field 228 NUM2(sz, max_nb_stage) :: dfield 245 229 ! 246 230 INTEGER :: l, ij -
codes/icosagcm/devel/src/unstructured/transfer_unstructured.F90
r684 r688 4 4 SAVE 5 5 PRIVATE 6 7 #include "unstructured.h90" 6 8 7 9 INCLUDE 'mpif.h' … … 47 49 SUBROUTINE copy_in(lldata, ndata, llbuf, nbuf, cells, data, buf) 48 50 INTEGER :: ndata, lldata, nbuf, llbuf, cells(nbuf), i 49 REAL(C_DOUBLE):: data(lldata,ndata), buf(llbuf,nbuf)51 NUM :: data(lldata,ndata), buf(llbuf,nbuf) 50 52 !$OMP DO 51 53 DO i=1,nbuf … … 57 59 SUBROUTINE copy_out(lldata, ndata, llbuf, nbuf, cells, data, buf) 58 60 INTEGER :: ndata, lldata, nbuf, llbuf, cells(nbuf), i 59 REAL(C_DOUBLE):: data(lldata,ndata), buf(llbuf,nbuf)61 NUM :: data(lldata,ndata), buf(llbuf,nbuf) 60 62 !$OMP DO SCHEDULE(STATIC) 61 63 DO i=1,nbuf … … 67 69 SUBROUTINE update_halo(index, data) 68 70 INTEGER :: index ! transfer_XXX, cf data_unstructured.F90 69 REAL(C_DOUBLE):: data(:,:)71 NUM :: data(:,:) 70 72 TYPE(Halo_transfer), POINTER :: halo 71 REAL(C_DOUBLE), POINTER :: buf(:,:)73 NUM, POINTER :: buf(:,:) 72 74 INTEGER :: req(send_info(index)%ranks+recv_info(index)%ranks), & 73 75 status(MPI_STATUS_SIZE, send_info(index)%ranks+recv_info(index)%ranks) … … 85 87 num = halo%num(i) 86 88 ireq = ireq+1 87 call MPI_ISEND(buf(1,istart), llbuf*num, MPI_ REAL8, halo%rank(i), &89 call MPI_ISEND(buf(1,istart), llbuf*num, MPI_NUM, halo%rank(i), & 88 90 42, MPI_COMM_WORLD, req(ireq), ierr) 89 91 istart = istart+num … … 98 100 num = halo%num(i) 99 101 ireq = ireq+1 100 call MPI_IRECV(buf(1,istart), llbuf*num, MPI_ REAL8, halo%rank(i), &102 call MPI_IRECV(buf(1,istart), llbuf*num, MPI_NUM, halo%rank(i), & 101 103 42, MPI_COMM_WORLD, req(ireq), ierr) 102 104 istart = istart+num … … 111 113 SUBROUTINE update_halo_c(index, lldata, ndata, data) BIND(C, name='dynamico_update_halo') 112 114 INTEGER, VALUE :: index, lldata, ndata 113 REAL(C_DOUBLE):: data(lldata, ndata)115 NUM :: data(lldata, ndata) 114 116 CALL update_halo(index, data) 115 117 END SUBROUTINE update_halo_c -
codes/icosagcm/devel/src/unstructured/transport_unstructured.F90
r686 r688 7 7 SAVE 8 8 9 #define BINDC_(thename) BIND(C, name=#thename)10 #define BINDC(thename) BINDC_(dynamico_ ## thename)11 12 #define DBL REAL(C_DOUBLE)13 #define DOUBLE1(m) DBL, DIMENSION(m)14 #define DOUBLE2(m,n) DBL, DIMENSION(m,n)15 #define DOUBLE3(m,n,p) DBL, DIMENSION(m,n,p)16 #define DOUBLE4(m,n,p,q) DBL, DIMENSION(m,n,p,q)17 #define INDEX INTEGER(C_INT)18 19 9 CONTAINS 20 10 21 #define FIELD_PS DOUBLE1(primal_num) 22 #define FIELD_MASS DOUBLE2(llm, primal_num) 23 #define FIELD_Z DOUBLE2(llm, dual_num) 24 #define FIELD_U DOUBLE2(llm, edge_num) 25 #define FIELD_UL DOUBLE2(llm+1, edge_num) 26 #define FIELD_THETA DOUBLE3(llm, primal_num, nqdyn) 27 #define FIELD_GEOPOT DOUBLE2(llm+1, primal_num) 28 11 #include "unstructured.h90" 29 12 #define HASNAN(field) (ANY(.NOT.ABS(field)<1e20)) 30 13 … … 40 23 INTEGER, DIMENSION(primal_num) :: cur_lev 41 24 42 DBL :: rhodz_cum_target, rhodz_cum_lev, rhodz_cum_levp1, X, time1,time2 25 NUM :: rhodz_cum_target, rhodz_cum_lev, rhodz_cum_levp1, X 26 TIME :: time1,time2 43 27 INTEGER :: ij, l, level, edge, ij_left, ij_right 44 28
Note: See TracChangeset
for help on using the changeset viewer.