Changeset 688


Ignore:
Timestamp:
04/09/18 15:22:10 (6 years ago)
Author:
dubos
Message:

devel/unstructured : select double or single precision for physical quantities

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  
    88CONTAINS 
    99 
    10 #define DBL REAL(C_DOUBLE) 
     10#include "unstructured.h90" 
    1111 
    1212#define INDICES1 ij,l,iq,iedge,edge,ivertex,vertex,ij_left,ij_right 
     
    1818#define LENGTHS le_de1,le_de2,le_de3,le_de4,le_de5,le_de6 
    1919#define DECLARE_INDICES INTEGER INDICES1,INDICES2 
    20 #define DECLARE_EDGES DBL SIGNS,LENGTHS ; INTEGER EDGES, EDGE_ENDS 
     20#define DECLARE_EDGES NUM SIGNS,LENGTHS ; INTEGER EDGES, EDGE_ENDS 
    2121#define DECLARE_VERTICES INTEGER VERTICES 
    2222#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) 
    3823 
    3924#define HASNAN(field) (ANY(.NOT.ABS(field)<1e20)) 
     
    4732  FIELD_MASS   :: m_ik, theta   ! IN*2 
    4833  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_preff 
     34  NUM :: tau, gamma, tau2_g, tau2_g2, g2, gm2, vreff, Rd_preff 
    5035  INTEGER :: iter 
    5136  DECLARE_INDICES 
    52   DBL :: rho_ij, X_ij, Y_ij, wil, rho_c2_mik, c2_mik, ml_g2 
     37  NUM :: rho_ij, X_ij, Y_ij, wil, rho_c2_mik, c2_mik, ml_g2 
    5338#define COLUMN 0 
    5439#if COLUMN  
    55   DOUBLE1(llm)  :: pk, Ak, Ck 
    56   DOUBLE1(llm+1):: Rl, Bl, Dl, xl 
     40  NUM1(llm)  :: pk, Ak, Ck 
     41  NUM1(llm+1):: Rl, Bl, Dl, xl 
    5742#define p_ik(l,ij) pk(l) 
    5843#define A_ik(l,ij) Ak(l) 
     
    9075  DECLARE_INDICES 
    9176  DECLARE_EDGES 
    92   DBL :: W_el, W2_el, gPhi2, dP, divG, u2, uu 
     77  NUM :: W_el, W2_el, gPhi2, dP, divG, u2, uu 
    9378  START_TRACE(id_slow_NH, 5,0,3) 
    9479#include "../kernels_unst/caldyn_slow_NH.k90" 
     
    9782 
    9883SUBROUTINE compute_caldyn_solver(tau,rhodz,theta, berni,pres,m_il, pk,geopot,W,dPhi,dW,du) 
    99   DBL, INTENT(IN) :: tau 
     84  NUM, INTENT(IN) :: tau 
    10085  FIELD_MASS   :: rhodz,pk,berni,pres    ! IN, OUT, BUF*2 
    10186  FIELD_THETA  :: theta                  ! IN 
     
    10388  FIELD_U      :: du                     ! OUT 
    10489  DECLARE_INDICES 
    105   DBL :: X_ij, rho_ij, T_ij, gamma, Cvd, vreff, Rd_preff 
     90  NUM :: X_ij, rho_ij, T_ij, gamma, Cvd, vreff, Rd_preff 
    10691#include "../kernels_unst/caldyn_mil.k90" 
    10792  IF(tau>0) THEN ! solve implicit problem for geopotential 
     
    118103  FIELD_U      :: du ! INOUT 
    119104  DECLARE_INDICES 
    120   DBL :: w_ij, wflux_ij 
     105  NUM :: w_ij, wflux_ij 
    121106  START_TRACE(id_vert_NH, 6,0,1) 
    122107#include "../kernels_unst/caldyn_vert_NH.k90" 
     
    132117  FIELD_PS     :: ps        ! OUT 
    133118  DECLARE_INDICES 
    134   DBL :: gdz, ke, uu, chi, gv, exner_ik, temp_ik, p_ik, qv, Rmix 
     119  NUM :: gdz, ke, uu, chi, gv, exner_ik, temp_ik, p_ik, qv, Rmix 
    135120  START_TRACE(id_geopot, 3,0,3) 
    136121#include "../kernels_unst/compute_geopot.k90" 
     
    145130  DECLARE_EDGES 
    146131  LOGICAL, PARAMETER :: zero=.TRUE. 
    147   DBL :: ke, uu 
     132  NUM :: ke, uu 
    148133  START_TRACE(id_slow_hydro, 3,0,3) 
    149134#include "../kernels_unst/caldyn_slow_hydro.k90" 
     
    161146  FIELD_UL     :: wwuu 
    162147  DECLARE_INDICES 
    163   DBL :: dF_deta, dFu_deta 
     148  NUM :: dF_deta, dFu_deta 
    164149  wwuu=0. 
    165150  !$OMP BARRIER 
     
    177162  DECLARE_INDICES 
    178163  DECLARE_EDGES 
    179   DBL :: divF, du_trisk 
     164  NUM :: divF, du_trisk 
    180165  START_TRACE(id_coriolis, 3,4,0) ! primal, dual, edge 
    181166#include "../kernels_unst/coriolis.k90" 
     
    188173  FIELD_THETA :: theta, theta_rhodz 
    189174  DECLARE_INDICES 
    190   DBL :: m 
     175  NUM :: m 
    191176  START_TRACE(id_theta, 3,0,0) ! primal, dual, edge 
    192177#include "../kernels_unst/theta.k90" 
     
    201186  DECLARE_EDGES 
    202187  DECLARE_VERTICES 
    203   DBL :: etav, hv 
     188  NUM :: etav, hv 
    204189  START_TRACE(id_pvort_only, 1,1,2) ! primal, dual, edge 
    205190#include "../kernels_unst/pvort_only.k90" 
     
    208193 
    209194SUBROUTINE compute_caldyn_fast(tau, pk,berni,theta,geopot, du,u) 
    210   DBL, INTENT(IN) :: tau 
     195  NUM, INTENT(IN) :: tau 
    211196  FIELD_MASS   :: pk,berni  ! INOUT, OUT 
    212197  FIELD_THETA  :: theta     ! IN 
     
    215200  DECLARE_INDICES 
    216201  DECLARE_EDGES 
    217   DBL          :: due 
     202  NUM          :: due 
    218203  START_TRACE(id_fast, 4,0,2) ! primal, dual, edge 
    219204#include "../kernels_unst/caldyn_fast.k90" 
     
    224209 
    225210SUBROUTINE gradient(b,grad) BINDC(gradient) 
    226   DOUBLE2(llm,primal_num) :: b 
    227   DOUBLE2(llm,edge_num)  :: grad 
     211  FIELD_MASS :: b 
     212  FIELD_u    :: grad 
    228213  DECLARE_INDICES 
    229214#include "../kernels_unst/gradient.k90" 
     
    231216! 
    232217SUBROUTINE div(u,divu) BINDC(div) 
    233   DOUBLE2(llm,primal_num) :: divu 
    234   DOUBLE2(llm,edge_num)  :: u 
    235   DECLARE_INDICES 
    236   DECLARE_EDGES 
    237   DBL :: div_ij 
     218  FIELD_MASS :: divu 
     219  FIELD_u    :: u 
     220  DECLARE_INDICES 
     221  DECLARE_EDGES 
     222  NUM :: div_ij 
    238223  !$OMP PARALLEL NUM_THREADS(nb_threads) 
    239224#include "../kernels_unst/div.k90" 
  • codes/icosagcm/devel/src/unstructured/data_unstructured.F90

    r683 r688  
    55  SAVE 
    66 
    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" 
    168 
    179  INTEGER, PARAMETER :: eta_mass=1, eta_lag=2, & 
     
    3426  ! circulation is positive when going from down to up 
    3527 
    36   DBL, BIND(C) :: elapsed, g, ptop, cpp, cppv, Rd, Rv, preff, Treff, & 
    37       pbot, Phi_bot, rho_bot 
    38   DBL :: kappa 
    39   DOUBLE1(max_nb_stage), BIND(C)              :: tauj       ! diagonal of fast Butcher tableau 
    40   DOUBLE2(max_nb_stage,max_nb_stage), BIND(C) :: cslj, cflj ! slow and fast modified Butcher tableaus 
    41   DOUBLE1(:), ALLOCATABLE            :: le_de, fv, Av, Ai 
    42   DOUBLE2(:,:), ALLOCATABLE          :: Riv2, wee, ap,bp, mass_bl, mass_dak, mass_dbk 
     28  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 
    4335 
    4436  INTEGER(C_INT), BIND(C) :: comm_icosa 
     
    4739       id_pvort_only=3, id_slow_hydro=4, id_fast=5, id_coriolis=6, id_theta=7, id_geopot=8, id_vert=9, & 
    4840       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 kernel 
     41  TIME, PRIVATE :: start_time, time_spent(nb_routines) ! time spent in each kernel 
    5042  INTEGER, PRIVATE :: current_id, nb_calls(nb_routines) 
    5143  INTEGER(KIND=8), PRIVATE :: bytes(nb_routines) ! bytes read or written by each kernel 
     
    6153          num(:), & ! number of cells to send to / receive from other MPI ranks 
    6254          cells(:) ! local indices of cells to send/receive 
    63      DBL, ALLOCATABLE :: buf2(:,:) 
     55     NUM, ALLOCATABLE :: buf2(:,:) 
    6456  END TYPE Halo_transfer 
    6557  TYPE(Halo_transfer), TARGET :: send_info(transfer_max), recv_info(transfer_max) 
     
    7971  SUBROUTINE print_trace() 
    8072    INTEGER :: id 
    81     DBL :: total_spent 
     73    TIME :: total_spent 
    8274    !$OMP MASTER 
    8375    total_spent=SUM(time_spent) 
     
    10698 
    10799  SUBROUTINE exit_trace() 
    108     DBL :: elapsed 
     100    TIME :: elapsed 
    109101    !$OMP MASTER 
    110102    elapsed = OMP_GET_WTIME()-start_time 
     
    180172  END SUBROUTINE init_mesh 
    181173 
     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 
    182178  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) 
    188181    PRINT *, 'init_metric ...' 
    189182    ALLOC1(Ai,primal_num) 
     
    235228  ! 
    236229  SUBROUTINE init_hybrid(bl,dak,dbk) BINDC(init_hybrid) 
    237     DOUBLE2(llm+1, primal_num) :: bl 
    238     DOUBLE2(llm, primal_num) :: dak,dbk 
     230    DBL :: bl(llm+1, primal_num), & 
     231         dak(llm, primal_num), dbk(llm, primal_num) 
    239232    PRINT *, 'Setting hybrid coefficients ...' 
    240233    ALLOC2(mass_bl, llm+1, primal_num) 
  • codes/icosagcm/devel/src/unstructured/timestep_unstructured.F90

    r683 r688  
    1111  SAVE 
    1212 
    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  
    2313#ifdef CPP_USING_XIOS 
    2414  TYPE(xios_context) :: ctx_hdl 
     
    2717CONTAINS 
    2818 
    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" 
    3620 
    3721#define HASNAN(field) (ANY(.NOT.ABS(field)<1e20)) 
     
    4125                                 dmass_col,drhodz,dtheta_rhodz,du_fast,du_slow, & 
    4226                                 dPhi_fast, dPhi_slow, dW_fast, dW_slow) BINDC(caldyn_unstructured) ! OUT : tendencies 
    43     DBL, VALUE :: tau 
     27    NUM, VALUE :: tau 
    4428    FIELD_MASS   :: rhodz, drhodz, pk, berni          ! IN, OUT, DIAG 
    4529    FIELD_THETA  :: theta_rhodz, dtheta_rhodz, theta  ! IN, OUT, DIAG 
     
    5438    FIELD_UL     :: bufu1, bufu2, bufu3,bufu4 
    5539 
    56     DBL          :: time1,time2 
     40    TIME          :: time1,time2 
    5741    INTEGER :: ij 
    5842     
     
    124108    FIELD_GEOPOT :: geopot, w, wflux                 ! IN, INOUT, DIAG 
    125109    FIELD_Z      :: qv                               ! DIAG 
    126     DOUBLE2(       primal_num, max_nb_stage) :: dmass_col    ! OUT 
    127     DOUBLE3(llm,   primal_num, max_nb_stage) :: drhodz   ! OUT 
    128     DOUBLE4(llm,   primal_num, nqdyn, max_nb_stage) :: dtheta_rhodz ! OUT 
    129     DOUBLE3(llm,   edge_num,   max_nb_stage) :: du_fast,du_slow ! OUT 
    130     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) :: & 
    131115         dPhi_fast, dPhi_slow, dW_fast, dW_slow      ! OUT 
    132116    ! buffers for fields that need to be shared among OpenMP threads 
     
    134118    FIELD_GEOPOT :: bufm1, bufm2, bufm3 
    135119    FIELD_UL     :: bufu1, bufu2, bufu3,bufu4 
    136     DBL       :: time1,time2 
     120    TIME       :: time1,time2 
    137121    INTEGER :: step, stage, iq, ij 
    138122     
     
    240224  SUBROUTINE update(j,sz,clj,field,dfield) 
    241225    INTEGER :: j, sz ! stage in ARK scheme, field size 
    242     DOUBLE2(max_nb_stage,max_nb_stage) :: clj ! modified Butcher tableau 
    243     DOUBLE1(sz) :: field 
    244     DOUBLE2(sz, max_nb_stage) :: dfield 
     226    NUM2(max_nb_stage,max_nb_stage) :: clj ! modified Butcher tableau 
     227    NUM1(sz) :: field 
     228    NUM2(sz, max_nb_stage) :: dfield 
    245229    ! 
    246230    INTEGER :: l, ij 
  • codes/icosagcm/devel/src/unstructured/transfer_unstructured.F90

    r684 r688  
    44  SAVE 
    55  PRIVATE 
     6 
     7#include "unstructured.h90" 
    68 
    79  INCLUDE 'mpif.h' 
     
    4749  SUBROUTINE copy_in(lldata, ndata, llbuf, nbuf, cells, data, buf) 
    4850    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) 
    5052    !$OMP DO 
    5153    DO i=1,nbuf 
     
    5759  SUBROUTINE copy_out(lldata, ndata, llbuf, nbuf, cells, data, buf) 
    5860    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) 
    6062    !$OMP DO SCHEDULE(STATIC) 
    6163    DO i=1,nbuf 
     
    6769  SUBROUTINE update_halo(index, data) 
    6870    INTEGER :: index ! transfer_XXX, cf data_unstructured.F90 
    69     REAL(C_DOUBLE) :: data(:,:)     
     71    NUM :: data(:,:)     
    7072    TYPE(Halo_transfer), POINTER :: halo 
    71     REAL(C_DOUBLE), POINTER :: buf(:,:) 
     73    NUM, POINTER :: buf(:,:) 
    7274    INTEGER :: req(send_info(index)%ranks+recv_info(index)%ranks), & 
    7375         status(MPI_STATUS_SIZE, send_info(index)%ranks+recv_info(index)%ranks) 
     
    8587       num = halo%num(i) 
    8688       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), & 
    8890            42, MPI_COMM_WORLD, req(ireq), ierr) 
    8991       istart = istart+num 
     
    98100       num = halo%num(i) 
    99101       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), & 
    101103            42, MPI_COMM_WORLD, req(ireq), ierr) 
    102104       istart = istart+num 
     
    111113  SUBROUTINE update_halo_c(index, lldata, ndata, data) BIND(C, name='dynamico_update_halo') 
    112114    INTEGER, VALUE :: index, lldata, ndata 
    113     REAL(C_DOUBLE) :: data(lldata, ndata) 
     115    NUM :: data(lldata, ndata) 
    114116    CALL update_halo(index, data) 
    115117  END SUBROUTINE update_halo_c 
  • codes/icosagcm/devel/src/unstructured/transport_unstructured.F90

    r686 r688  
    77  SAVE 
    88 
    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  
    199CONTAINS 
    2010 
    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" 
    2912#define HASNAN(field) (ANY(.NOT.ABS(field)<1e20)) 
    3013 
     
    4023    INTEGER, DIMENSION(primal_num) :: cur_lev 
    4124 
    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 
    4327    INTEGER :: ij, l, level, edge, ij_left, ij_right 
    4428     
Note: See TracChangeset for help on using the changeset viewer.