Ignore:
Timestamp:
05/28/19 22:44:58 (5 years ago)
Author:
jisesh
Message:

devel: moved DYSL into compute_caldyn_slow_NH.F90 and compute_caldyn_Coriolis.F90

File:
1 edited

Legend:

Unmodified
Added
Removed
  • codes/icosagcm/devel/src/dynamics/compute_caldyn_slow_NH.F90

    r851 r876  
    44  PRIVATE 
    55 
     6#include "../unstructured/unstructured.h90" 
     7 
    68  PUBLIC :: compute_caldyn_slow_NH 
    79 
    810CONTAINS 
     11 
     12#ifdef BEGIN_DYSL 
     13 
     14KERNEL(caldyn_slow_NH) 
     15  FORALL_CELLS_EXT('1', 'llm+1') 
     16     ON_PRIMAL 
     17        CST_IF(IS_INNER_INTERFACE, w_il(CELL) = 2.*W(CELL)/(rhodz(KDOWN(CELL))+rhodz(KUP(CELL))) ) 
     18        CST_IF(IS_BOTTOM_LEVEL,    w_il(CELL) = 2.*W(CELL)/rhodz(KUP(CELL)) ) 
     19        CST_IF(IS_TOP_INTERFACE,   w_il(CELL) = 2.*W(CELL)/rhodz(KDOWN(CELL)) ) 
     20     END_BLOCK 
     21  END_BLOCK 
     22  FORALL_CELLS_EXT('1', 'llm+1') 
     23     ON_EDGES 
     24       ! compute DePhi, v_el, G_el, F_el 
     25       ! v_el, W2_el and therefore G_el incorporate metric factor le_de 
     26       ! while DePhil, W_el and F_el do not  
     27       W_el         = .5*( W(CELL2)+W(CELL1) ) 
     28       DePhil(EDGE) = SIGN*(Phi(CELL2)-Phi(CELL1)) 
     29       F_el(EDGE)   = DePhil(EDGE)*W_el 
     30       W2_el        = .5*LE_DE * ( W(CELL1)*w_il(CELL1) + W(CELL2)*w_il(CELL2) ) 
     31       v_el(EDGE)   = .5*LE_DE*(u(KUP(EDGE))+u(KDOWN(EDGE))) ! checked 
     32       G_el(EDGE)   = v_el(EDGE)*W_el - DePhil(EDGE)*W2_el 
     33     END_BLOCK 
     34  END_BLOCK 
     35 
     36  FORALL_CELLS_EXT('1', 'llm+1') 
     37    ! compute GradPhi2, dPhi, dW 
     38    ON_PRIMAL 
     39       gPhi2=0. 
     40       dP=0. 
     41       divG=0 
     42       FORALL_EDGES     
     43         gPhi2 = gPhi2 + LE_DE*DePhil(EDGE)**2 
     44         dP = dP + LE_DE*DePhil(EDGE)*v_el(EDGE) 
     45         divG = divG + SIGN*G_el(EDGE) ! -div(G_el), G_el already has le_de 
     46       END_BLOCK 
     47       gradPhi2(CELL) = 1./(2.*AI) * gPhi2 
     48       dPhi(CELL) = gradPhi2(CELL)*w_il(CELL) - 1./(2.*AI)*dP 
     49       dW(CELL) = (-1./AI)*divG 
     50    END_BLOCK 
     51  END_BLOCK 
     52 
     53  ! We need a barrier here because we compute gradPhi2, F_el and w_il above and do a vertical average below 
     54  BARRIER 
     55 
     56  FORALL_CELLS_EXT() 
     57    ! Compute berni at scalar points 
     58    ON_PRIMAL 
     59       u2=0. 
     60       FORALL_EDGES     
     61         u2 = u2 + LE_DE*u(EDGE)**2 
     62       END_BLOCK 
     63       berni(CELL) = 1./(4.*AI) * u2 - .25*( gradPhi2(CELL)*w_il(CELL)**2 + gradPhi2(UP(CELL))*w_il(UP(CELL))**2 ) 
     64    END_BLOCK 
     65  END_BLOCK 
     66 
     67  FORALL_CELLS_EXT() 
     68    ON_EDGES 
     69    ! Compute mass flux and grad(berni) 
     70      uu = .5*(rhodz(CELL1)+rhodz(CELL2))*u(EDGE) - .5*( F_el(EDGE)+F_el(UP(EDGE)) ) 
     71      hflux(EDGE) = LE_DE*uu 
     72      du(EDGE) = SIGN*(berni(CELL1)-berni(CELL2)) 
     73    END_BLOCK 
     74  END_BLOCK 
     75 
     76END_BLOCK 
     77 
     78#endif END_DYSL 
     79 
     80  SUBROUTINE compute_caldyn_vert_NH_unst(mass,geopot,W,wflux, eta_dot,wcov,W_etadot, du,dPhi,dW) 
     81    USE ISO_C_BINDING, only : C_DOUBLE, C_FLOAT 
     82    USE data_unstructured_mod, ONLY : left,right,edge_num,primal_num,dual_num,id_vert_NH, & 
     83        enter_trace, exit_trace 
     84    FIELD_MASS   :: mass, eta_dot, wcov, W_etadot ! IN, BUF*3 
     85    FIELD_GEOPOT :: geopot,W,wflux,dPhi,dW ! IN*3, INOUT*2 
     86    FIELD_U      :: du ! INOUT 
     87    DECLARE_INDICES 
     88    NUM :: w_ij, wflux_ij 
     89    START_TRACE(id_vert_NH, 6,0,1) 
     90#include "../kernels_unst/caldyn_vert_NH.k90" 
     91    STOP_TRACE 
     92  END SUBROUTINE compute_caldyn_vert_NH_unst 
    993 
    1094  SUBROUTINE compute_caldyn_slow_NH(u,rhodz,Phi,W, F_el,gradPhi2,w_il, hflux,du,dPhi,dW) 
Note: See TracChangeset for help on using the changeset viewer.