Changeset 919


Ignore:
Timestamp:
06/18/19 22:57:38 (5 years ago)
Author:
dubos
Message:

devel : DYSL for compute_omega

Location:
codes/icosagcm/devel
Files:
4 edited
1 moved

Legend:

Unmodified
Added
Removed
  • codes/icosagcm/devel/Python/src/hexagonal/macros.jin

    r723 r919  
    2020#define WEE wee(ij+{{edge}},{{itrisk}}) 
    2121#define DE de(ij+{{edge}}) 
     22#define LE le(ij+{{edge}}) 
    2223#define RIV2 Riv2({{vertex}},{{vertex_dir}}) 
    2324#define AI Ai(ij) 
  • codes/icosagcm/devel/Python/src/unstructured/macros.jin

    r685 r919  
    9393{{ define('EDGE', 'l,edge') }} 
    9494{{ cdef(thecode, 'LE_DE', 'le_de(edge)') }} 
     95{{ cdef(thecode, 'LE', 'le(edge)') }} 
     96{{ cdef(thecode, 'DE', 'de(edge)') }} 
    9597{{ cdef(thecode, 'SIGN', '1.') }} 
    9698{{ cdef(thecode, 'CELL1', 'l,ij_left') }} 
     
    285287{{ define('EDGE', 'l,edge') }} 
    286288{{ cdef(thecode, 'LE_DE', 'le_de(edge)') }} 
     289{{ cdef(thecode, 'DE', 'de(edge)') }} 
     290{{ cdef(thecode, 'LE', 'le(edge)') }} 
    287291{{ cdef(thecode, 'SIGN', '1.') }} 
    288292{{ cdef(thecode, 'CELL1', 'l,ij_left') }} 
  • codes/icosagcm/devel/make_python

    r857 r919  
    5757# make sure that ./rebuild recompiles dynamics 
    5858    cd $DYNAMICO_ROOT 
    59     touch src/dynamics/*.F90 src/diagnostics/*.F90 src/transport/*.F90 src/unstructured/*.F90 
     59#    touch src/dynamics/*.F90 src/diagnostics/*.F90 src/transport/*.F90 src/unstructured/*.F90 
    6060} 
    6161 
  • codes/icosagcm/devel/src/diagnostics/compute_omega.F90

    r912 r919  
    1 MODULE omega_mod 
    2  
     1MODULE compute_omega_mod 
    32  USE icosa 
     3  IMPLICIT NONE 
    44  PRIVATE 
    55 
     
    2323  END SUBROUTINE W_omega 
    2424 
    25  
     25#ifdef BEGIN_DYSL 
     26 
     27KERNEL(compute_omega) 
     28 
     29  ! Pressure 
     30  FORALL_CELLS_EXT() 
     31    ON_PRIMAL 
     32      p(CELL) = AP(CELL) + BP(CELL)*ps(HIDX(CELL)) 
     33    END_BLOCK 
     34  END_BLOCK 
     35 
     36  BARRIER 
     37 
     38  ! Mass and grad(ps) 
     39  FORALL_CELLS_EXT() 
     40    ON_PRIMAL 
     41      rhodz(CELL) = (p(CELL)-p(UP(CELL)))*(1./g) 
     42    END_BLOCK 
     43    ON_EDGES 
     44      CST_IFTHEN(IS_BOTTOM_LEVEL) 
     45        gradps(HIDX(EDGE)) = (ps(HIDX(CELL2))-ps(HIDX(CELL1)))*SIGN*LE 
     46      CST_ENDIF 
     47    END_BLOCK 
     48  END_BLOCK 
     49   
     50  ! Mass flux 
     51  FORALL_CELLS_EXT() 
     52    ON_EDGES 
     53      Fe(EDGE)=0.5*(rhodz(CELL1)+rhodz(CELL2)*LE 
     54    END_BLOCK 
     55  END_BLOCK 
     56 
     57  ! Mass flux divergence 
     58  ! convm = +div(mass flux), sign convention as in Ringler et al. 2012, eq. 21 
     59  FORALL_CELLS() 
     60    ON_PRIMAL 
     61      divflux=0. 
     62      FORALL_EDGES 
     63        divflux = divflux + SIGN*Fe(EDGE) 
     64      END_BLOCK 
     65      convm(CELL) = divflux*(1./AI) 
     66    END_BLOCK 
     67  END_BLOCK 
     68 
     69  ! Barrier needed before and after doing a vertical recurrence 
     70  BARRIER 
     71 
     72  ! vertical integration from up to down 
     73  SEQUENCE_C1 
     74    PROLOGUE('llm') 
     75      convm(CELL)=0. 
     76    END_BLOCK 
     77    BODY('llm-1,1,-1')  
     78      convm(CELL) = convm(CELL) + convm(UP(CELL)) 
     79    END_BLOCK 
     80  END_BLOCK 
     81 
     82  BARRIER 
     83 
     84  ! omega = dp/dt = u.grad p + \pdiff{p}{t} 
     85  FORALL_CELLS() 
     86    ON_PRIMAL 
     87      ugradps=0. 
     88      FORALL_EDGES 
     89        ugradps = ugradps + u(EDGE)*gradps(HIDX(EDGE)) 
     90      END_BLOCK 
     91      ugradps = .5*(BP(CELL)+BP(UP(CELL)))*ugradps/(-4.*AI)  ! sign convention as in Ringler et al. 2010, Eq. 22 p.3072 
     92      w(CELL) =  ugradps - g*.5*(convm(CELL)+convm(UP(CELL))) 
     93    END_BLOCK 
     94  END_BLOCK 
     95END_BLOCK 
     96 
     97#endif END_DYSL 
    2698 
    2799  SUBROUTINE compute_omega(ps,u, w) 
    28100    USE disvert_mod, ONLY : ap,bp 
    29101    USE omp_para 
    30     IMPLICIT NONE 
    31102    REAL(rstd),INTENT(IN) :: u(iim*3*jjm,llm), ps(iim*jjm) 
    32103    REAL(rstd),INTENT(OUT):: w(iim*jjm,llm) 
    33104    REAL(rstd):: convm(iim*jjm,llm+1) 
    34105    REAL(rstd):: p(iim*jjm,llm+1), rhodz(iim*jjm,llm), Fe(iim*3*jjm,llm) 
     106    REAL(rstd):: gradps(3*iim*jjm) 
    35107    REAL(rstd):: ugradps 
    36108     
     
    57129         ENDDO 
    58130      ENDDO 
     131 
     132      !DIR$ SIMD 
     133      DO ij=ij_begin_ext, ij_end_ext 
     134         gradps(ij+u_right) = (ps(ij)-ps(ij+t_right))*ne_right*le(ij+u_right) 
     135         gradps(ij+u_lup)   = (ps(ij)-ps(ij+t_lup))  *ne_lup  *le(ij+u_lup) 
     136         gradps(ij+u_ldown) = (ps(ij)-ps(ij+t_ldown))*ne_ldown*le(ij+u_ldown) 
     137      END DO 
    59138     
    60139!!!  Compute mass flux 
     
    99178      convm(:,llm+1)=0. 
    100179 
    101 !!! Compute dps 
    102     !  DO j=jj_begin,jj_end 
    103     !    DO i=ii_begin,ii_end 
    104     !      ij=(j-1)*iim+i 
    105     !      ! dps/dt = -int(div flux)dz 
    106     !      dps(ij)=-convm(ij,1) * g  
    107     !      convm(ij,llm+1)=0. 
    108     !    ENDDO 
    109     !  ENDDO 
    110      
    111     ! Compute Omega = Dp/Dt 
    112     ! with p = A(eta)+B(eta)ps 
    113     !      Dp/Dt = dp/deta.Deta/Dt + B(eta)Dps/Dt 
    114     !            = -mg.Deta/Dt + B.Dps/Dt 
    115     ! By definition the mass flux through model levels is W=m.Deta/Dt with m=-1/g dp/deta 
    116     ! therefore  
    117     !  Dp/Dt = -g.W + B.dps/dt + Bu.grad ps 
    118     !        = B.u.grad ps - g*convm 
    119      
    120 !!! Compute vertical flux through model layers 
    121     !  DO l = 1,llm-1 
    122     !    DO j=jj_begin,jj_end 
    123     !      DO i=ii_begin,ii_end 
    124     !        ij=(j-1)*iim+i 
    125     !        ! w = int(z,ztop,div(flux)dz) + B(eta)dps/dt 
    126     !        ! => w>0 for upward transport 
    127     !        w( ij, l+1 ) = convm( ij, l+1 ) - bp(l+1) * convm( ij, 1 ) ! g.W = g.convm + B dps/dt 
    128     !      ENDDO 
    129     !    ENDDO 
    130     !  ENDDO 
    131      
    132      
    133180!!! Compute omega 
    134     ! -grad ps : ( ne(ij,ldown)*ps(ij,l) + ne(ij+t_ldown,rup)*ps(ij+t_ldown,l) ) ) / de(ij+u_ldown) 
    135181 
    136182       DO l = 1,llm 
     
    139185             ij=(j-1)*iim+i 
    140186             ugradps = & 
    141                   le(ij+u_right)*u(ij+u_right,l)*( ne(ij,right)*ps(ij) + ne(ij+t_right,left)*ps(ij+t_right) )  & 
    142                   + le(ij+u_rup)*u(ij+u_rup,l)*( ne(ij,rup)*ps(ij) + ne(ij+t_rup,ldown)*ps(ij+t_rup) )  & 
    143                   + le(ij+u_lup)*u(ij+u_lup,l)*( ne(ij,lup)*ps(ij) + ne(ij+t_lup,rdown)*ps(ij+t_lup) )         & 
    144                   + le(ij+u_left)*u(ij+u_left,l)*( ne(ij,left)*ps(ij) + ne(ij+t_left,right)*ps(ij+t_left) )    & 
    145                   + le(ij+u_ldown)*u(ij+u_ldown,l)*( ne(ij,ldown)*ps(ij) + ne(ij+t_ldown,rup)*ps(ij+t_ldown) ) & 
    146                   + le(ij+u_rdown)*u(ij+u_rdown,l)*( ne(ij,rdown)*ps(ij) + ne(ij+t_rdown,lup)*ps(ij+t_rdown) ) 
     187                  u(ij+u_rup,l)*gradps(ij+u_rup)       & 
     188                  + u(ij+u_lup,l)*gradps(ij+u_lup)     & 
     189                  + u(ij+u_left,l)*gradps(ij+u_left)   & 
     190                  + u(ij+u_ldown,l)*gradps(ij+u_ldown) & 
     191                  + u(ij+u_rdown,l)*gradps(ij+u_rdown) & 
     192                  + u(ij+u_right,l)*gradps(ij+u_right) 
     193 
    147194             ugradps = .5*(bp(l)+bp(l+1)) *ugradps/(-4*Ai(ij))  ! sign convention as in Ringler et al. 2010, Eq. 22 p.3072 
    148195             w( ij, l) =  ugradps - g*.5*(convm( ij,l+1)+convm(ij,l))  
     
    155202  END SUBROUTINE compute_omega 
    156203   
    157 END MODULE omega_mod 
     204END MODULE compute_omega_mod 
  • codes/icosagcm/devel/src/diagnostics/observable.f90

    r914 r919  
    4848    USE vertical_interp_mod 
    4949    USE theta2theta_rhodz_mod 
    50     USE omega_mod 
     50    USE compute_omega_mod, ONLY : w_omega 
    5151    USE kinetic_mod 
    5252    USE grid_param 
Note: See TracChangeset for help on using the changeset viewer.