Changeset 928


Ignore:
Timestamp:
06/21/19 01:01:34 (5 years ago)
Author:
dubos
Message:

devel : separate modules for caldyn_vert and caldyn_vert_NH

Location:
codes/icosagcm/devel
Files:
1 added
7 edited
1 moved

Legend:

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

    r878 r928  
    1 KERNEL(caldyn_wflux) 
    2   SEQUENCE_C0 
    3     BODY('llm-1,1,-1') 
    4       ! cumulate mass flux convergence from top to bottom 
    5       convm(CELL) = convm(CELL) + convm(UP(CELL)) 
    6     END_BLOCK 
    7     EPILOGUE(1) 
    8       dmass_col(HIDX(CELL)) = convm(CELL) 
    9     END_BLOCK 
    10     BODY('2,llm') 
    11       ! Compute vertical mass flux (l=1,llm+1 set to zero at init) 
    12       wflux(CELL) = mass_bl(CELL) * dmass_col(HIDX(CELL)) - convm(CELL)  
    13     END_BLOCK 
    14   END_BLOCK 
    15   ! make sure wflux is up to date 
    16   BARRIER 
    17 END_BLOCK 
    18  
    19 KERNEL(caldyn_dmass) 
    20   FORALL_CELLS() 
    21     ON_PRIMAL 
    22       convm(CELL) = mass_dbk(CELL) * dmass_col(HIDX(CELL)) 
    23     END_BLOCK 
    24   END_BLOCK 
    25 END_BLOCK 
    26  
    27 KERNEL(caldyn_vert) 
    28  
    29   DO iq=1,nqdyn 
    30     FORALL_CELLS('2', 'llm') 
    31       ON_PRIMAL 
    32         dtheta_rhodz(CELL,iq) = dtheta_rhodz(CELL,iq) + 0.5*(theta(CELL,iq)+theta(DOWN(CELL),iq))*wflux(CELL)   
    33       END_BLOCK 
    34     END_BLOCK 
    35     FORALL_CELLS('1', 'llm-1') 
    36       ON_PRIMAL 
    37         dtheta_rhodz(CELL,iq) = dtheta_rhodz(CELL,iq) - 0.5*(theta(CELL,iq)+theta(UP(CELL),iq))*wflux(UP(CELL))   
    38       END_BLOCK 
    39     END_BLOCK 
    40   END DO 
    41  
    42   IF(caldyn_vert_variant == caldyn_vert_cons) THEN 
    43     ! conservative vertical transport of momentum : (F/m)du/deta = 1/m (d/deta(Fu)-u.dF/deta) 
    44     FORALL_CELLS('2','llm') 
    45       ON_EDGES 
    46         wwuu(EDGE) = .25*(wflux(CELL1)+wflux(CELL2))*(u(EDGE)+u(DOWN(EDGE))) ! Fu 
    47       END_BLOCK 
    48     END_BLOCK 
    49     ! make sure wwuu is up to date 
    50     BARRIER 
    51  
    52     FORALL_CELLS() 
    53       ON_EDGES 
    54         dFu_deta = wwuu(UP(EDGE))-wwuu(EDGE)                                          ! d/deta (F*u) 
    55         dF_deta  = .5*(wflux(UP(CELL1))+wflux(UP(CELL2))-(wflux(CELL1)+wflux(CELL2))) ! d/deta(F) 
    56         du(EDGE) = du(EDGE) - (dFu_deta-u(EDGE)*dF_deta) / (.5*(rhodz(CELL1)+rhodz(CELL2)))  ! (F/m)du/deta 
    57       END_BLOCK 
    58     END_BLOCK 
    59   ELSE   
    60     FORALL_CELLS('2','llm') 
    61       ON_EDGES 
    62         wwuu(EDGE) = .5*(wflux(CELL1)+wflux(CELL2))*(u(EDGE)-u(DOWN(EDGE))) 
    63       END_BLOCK 
    64     END_BLOCK 
    65  
    66     ! make sure wwuu is up to date 
    67     BARRIER 
    68  
    69     FORALL_CELLS() 
    70       ON_EDGES 
    71         du(EDGE) = du(EDGE) - (wwuu(EDGE)+wwuu(UP(EDGE))) / (rhodz(CELL1)+rhodz(CELL2)) 
    72       END_BLOCK 
    73     END_BLOCK 
    74   END IF 
    75  
    76 END_BLOCK 
    77  
    781KERNEL(gradient) 
    792  FORALL_CELLS_EXT() 
     
    9518  END_BLOCK 
    9619END_BLOCK 
    97  
    98  
  • codes/icosagcm/devel/XCodeML/parse_order.txt

    r823 r928  
    55../src/base prec 
    66../src/base profiling 
     7../src/base signature 
    78../src/dcmip dcmip2016_baroclinic_wave 
    89../src/dcmip dcmip2016_cyclone 
     
    1213../src/dcmip dcmip_initial_conditions_test_1_2_3_v5 
    1314../src/dcmip terminator 
     15../src/diagnostics compute_diagnostics 
     16../src/dynamics compute_caldyn 
    1417../src/output free_unit_mod 
    1518../ppsrc/base trace 
     
    3033../ppsrc/parallel omp_para 
    3134../ppsrc/parallel mpipara 
    32 ../ppsrc/unstructured data_unstructured 
    33 ../ppsrc/unstructured transfer_unstructured 
    34 ../ppsrc/unstructured transport_unstructured 
    3535../src/base getin 
    36 ../ppsrc/unstructured caldyn_unstructured 
    37 ../ppsrc/unstructured diags_unstructured 
    38 ../ppsrc/unstructured timestep_unstructured 
    3936../src/base earth_const 
    4037../src/base genmod 
    4138../src/sphere vector 
    4239../src/time time 
     40../src/output write_field_vars 
    4341../src/sphere spherical_geom 
    4442../src/sphere metric 
     
    4644../src/base dimensions 
    4745../src/base field 
     46../src/sphere geometry 
     47../src/output set_bounds 
     48../src/output write_field_mpi 
     49../ppsrc/physics physics_external 
     50../ppsrc/unstructured data_unstructured 
     51../ppsrc/unstructured transfer_unstructured 
     52../ppsrc/unstructured transport_unstructured 
     53../src/parallel transfert_mpi 
    4854../src/unstructured init_unstructured 
    49 ../ppsrc/physics physics_external 
    50 ../src/parallel transfert_mpi 
     55../src/output write_field 
    5156../ppsrc/parallel transfert 
    52 ../src/sphere geometry 
    53 ../src/output write_field 
    54 ../ppsrc/output xios_mod 
     57../ppsrc/unstructured caldyn_unstructured 
     58../ppsrc/unstructured diags_unstructured 
     59../ppsrc/unstructured timestep_unstructured 
    5560../src icosa_mod 
    5661../src/parallel checksum 
    5762../src/diagnostics kinetic 
     63../src/sphere compute_geometry 
    5864../src/physics dimphys 
    5965../src/physics physics_interface 
    60 ../src/dissip nudging_mod 
    6166../src/dynamics caldyn_vars 
     67../src/initial etat0_isothermal 
    6268../src/initial etat0_temperature 
    6369../src/initial q_sat 
     
    6975../src/vertical disvert_std 
    7076../src/vertical disvert_strato 
    71 ../src/output output_field 
    7277../ppsrc/diagnostics wind 
     78../ppsrc/dynamics compute_caldyn_kv 
     79../ppsrc/dynamics compute_caldyn_slow_NH 
    7380../ppsrc/transport advect 
    74 ../src/dcmip physics_dcmip 
     81../ppsrc/dynamics compute_pvort_only 
    7582../src/vertical disvert 
    7683../src/transport advect_tracer 
    77 ../src/output restart 
    78 ../src/output write_etat0 
     84../ppsrc/diagnostics compute_rhodz 
    7985../ppsrc/diagnostics diagflux 
    8086../ppsrc/dynamics caldyn_kernels_base 
    8187../ppsrc/dynamics caldyn_kernels_hevi 
     88../ppsrc/dynamics compute_NH_geopot 
     89../ppsrc/dynamics compute_theta 
     90../ppsrc/output xios_mod 
    8291../src/dcmip guided_ncar_mod 
    83 ../src/dcmip physics_dcmip2016 
    8492../src/diagnostics omega 
    8593../src/diagnostics pression 
    8694../src/diagnostics vorticity 
    87 ../src/dissip guided_mod 
    8895../src/dynamics caldyn_kernels 
    8996../src/initial etat0_bubble 
     
    97104../src/initial etat0_dcmip5 
    98105../src/initial etat0_jablonowsky06 
    99 ../src/initial etat0_start_file 
    100106../src/initial etat0_williamson 
    101107../src/time euler_scheme 
    102108../src/vertical vertical_interp 
    103 ../src/vertical vertical_remap 
     109../src/output output_field 
     110../src/output restart 
     111../src/output write_etat0 
     112../ppsrc/dynamics compute_caldyn_solver 
     113../src/dcmip physics_dcmip2016 
     114../src/dcmip physics_dcmip 
    104115../src/diagnostics exner 
    105116../src/diagnostics theta_rhodz 
     117../src/dissip nudging_mod 
    106118../src/dynamics caldyn_adv 
    107 ../src/initial etat0_database 
     119../src/initial etat0_collocated 
    108120../src/initial etat0_heldsz 
     121../src/initial etat0_start_file 
    109122../src/initial etat0_venus 
    110123../src/diagnostics geopotential_mod 
     124../src/dissip guided_mod 
     125../src/dissip sponge 
     126../src/initial etat0_academic 
     127../ppsrc/physics physics_lmdz_generic 
     128../ppsrc/diagnostics compute_pression 
     129../ppsrc/diagnostics compute_temperature 
     130../ppsrc/diagnostics compute_velocity 
     131../src/base init_grid_param 
     132../src/vertical vertical_remap 
     133../src/initial etat0_database 
     134../src/initial etat0 
     135../ppsrc/diagnostics compute_omega 
     136../ppsrc/dynamics compute_caldyn_vert 
     137../ppsrc/dynamics compute_caldyn_vert_NH 
     138../ppsrc/dynamics compute_geopot 
     139../ppsrc/dynamics compute_caldyn_Coriolis 
     140../ppsrc/dynamics compute_caldyn_fast 
     141../ppsrc/dynamics compute_caldyn_slow_hydro 
    111142../src/diagnostics observable 
    112143../src/dissip dissip_gcm 
    113 ../src/dissip sponge 
    114144../src/dynamics caldyn_hevi 
    115 ../src/initial etat0_academic 
    116 ../src/initial etat0 
    117145../src/time hevi_scheme 
    118 ../ppsrc/physics physics_lmdz_generic 
    119146../ppsrc/dynamics caldyn_gcm 
    120147../src/diagnostics check_conserve 
     
    123150../src/time explicit_scheme 
    124151../src/time timeloop_gcm 
    125 ../src icosa_init 
    126 ../src icosa_gcm 
  • codes/icosagcm/devel/src/dynamics/caldyn_gcm.F90

    r920 r928  
    33  USE transfert_mod 
    44  USE caldyn_vars_mod 
    5   USE caldyn_kernels_hevi_mod 
    6   USE caldyn_kernels_base_mod 
     5  USE compute_caldyn_vert_mod, ONLY : compute_caldyn_vert => compute_caldyn_vert_manual 
    76  USE caldyn_kernels_mod 
    87  USE omp_para 
     
    171170    CALL allocate_field(f_wwuu,  field_u,type_real,llm+1,name='wwuu') 
    172171    CALL allocate_field(f_planetvel,  field_u,type_real, name='planetvel') ! planetary velocity at r=a 
     172    CALL allocate_field(f_Ftheta,field_u,type_real,llm, name='Ftheta') 
     173    CALL allocate_field(f_berni, field_t,type_real,llm, name='berni') 
    173174    IF(.NOT.hydrostatic) THEN 
    174175       CALL allocate_field(f_Fel,      field_u,type_real,llm+1,name='F_el') 
  • codes/icosagcm/devel/src/dynamics/caldyn_hevi.f90

    r921 r928  
    33  USE transfert_mod 
    44  USE caldyn_vars_mod 
    5   USE caldyn_kernels_hevi_mod 
    6   USE caldyn_kernels_base_mod 
     5  USE compute_caldyn_vert_mod, ONLY : compute_caldyn_vert => compute_caldyn_vert_manual 
     6  USE compute_caldyn_vert_NH_mod, ONLY : compute_caldyn_vert_NH => compute_caldyn_vert_NH_manual 
    77  USE compute_theta_mod, ONLY : compute_theta => compute_theta_manual 
    88  USE compute_geopot_mod, ONLY : compute_geopot => compute_geopot_manual 
    99  USE compute_caldyn_kv_mod, ONLY : compute_caldyn_kv 
    10   USE compute_caldyn_Coriolis_mod, ONLY : compute_caldyn_Coriolis 
     10  USE compute_caldyn_Coriolis_mod, ONLY : compute_caldyn_Coriolis => compute_caldyn_Coriolis_manual 
    1111  USE compute_caldyn_slow_hydro_mod, ONLY : compute_caldyn_slow_hydro => compute_caldyn_slow_hydro_manual 
    1212  USE compute_caldyn_slow_NH_mod, ONLY : compute_caldyn_slow_NH 
     
    6262    REAL(rstd),POINTER :: du(:,:), dW(:,:), dPhi(:,:), hflux(:,:), wflux(:,:) 
    6363    REAL(rstd),POINTER :: u(:,:), w(:,:), qu(:,:), qv(:,:), Kv(:,:), hv(:,:) 
    64  
     64    REAL(rstd),POINTER :: berni(:,:), Ftheta(:,:) 
    6565! temporary shared variable 
    6666    REAL(rstd),POINTER  :: theta(:,:,:)   
     
    136136       END IF 
    137137       u=f_u(ind) 
    138        Kv=f_Kv(ind) ! buffer for partial Bernoulli function 
    139        CALL compute_caldyn_fast(tau,theta,geopot, pk,Kv,du,u) ! computes du_fast and updates u 
     138       berni=f_berni(ind) ! buffer for partial Bernoulli function 
     139       CALL compute_caldyn_fast(tau,theta,geopot, pk,berni,du,u) ! computes du_fast and updates u 
    140140    ENDDO 
    141141     
     
    186186          hv=f_hv(ind) 
    187187          Kv=f_Kv(ind) 
    188           CALL compute_caldyn_slow_hydro(.TRUE., u,mass,hv,Kv, Kv, hflux,du) 
     188          berni=f_berni(ind) 
     189          CALL compute_caldyn_slow_hydro(.TRUE., u,mass,hv,Kv, berni, hflux,du) 
    189190       ELSE 
    190191          W = f_W(ind) 
     
    197198          CALL compute_caldyn_slow_NH(u,mass,geopot,W, F_el,gradPhi2,w_il, hflux,du,dPhi,dW) 
    198199       END IF 
    199        CALL compute_caldyn_Coriolis(hflux,theta,qu, convm,dtheta_rhodz,du) 
     200       Ftheta=f_Ftheta(ind) 
     201       CALL compute_caldyn_Coriolis(hflux,theta,qu, Ftheta, convm,dtheta_rhodz,du) 
    200202       IF(caldyn_eta==eta_mass) THEN 
    201203          wflux=f_wflux(ind) 
  • codes/icosagcm/devel/src/dynamics/caldyn_vars.f90

    r834 r928  
    2222  TYPE(t_field),POINTER, PUBLIC :: f_qu(:), f_qv(:), f_Kv(:), f_hv(:), & 
    2323                           f_pk(:),f_wwuu(:),f_planetvel(:), & 
     24                           f_berni(:), f_Ftheta(:), & 
    2425                           f_Fel(:), f_gradPhi2(:), f_wil(:), f_Wetadot(:) 
    2526 
  • codes/icosagcm/devel/src/dynamics/compute_caldyn_Coriolis.F90

    r876 r928  
    11MODULE compute_caldyn_Coriolis_mod 
    2   USE grid_param, ONLY : llm 
     2  USE prec, ONLY : rstd 
     3  USE grid_param 
     4  USE earth_const 
     5  USE disvert_mod 
     6  USE omp_para 
     7  USE trace 
    38  IMPLICIT NONE 
    49  PRIVATE 
     
    611#include "../unstructured/unstructured.h90" 
    712 
    8   PUBLIC :: compute_caldyn_Coriolis 
     13  PUBLIC :: compute_caldyn_Coriolis_manual, & 
     14       compute_caldyn_Coriolis_unst, compute_caldyn_Coriolis_hex 
    915 
    1016CONTAINS 
     
    5561#endif END_DYSL 
    5662 
    57   SUBROUTINE compute_coriolis_unst(hflux,theta,qu,Ftheta, convm,dtheta_rhodz,du) 
     63  SUBROUTINE compute_caldyn_coriolis_unst(hflux,theta,qu, Ftheta, convm,dtheta_rhodz,du) 
    5864    USE ISO_C_BINDING, only : C_DOUBLE, C_FLOAT 
    59     USE grid_param, ONLY : nqdyn 
    6065    USE data_unstructured_mod, ONLY : id_coriolis, primal_num, dual_num, edge_num, & 
    6166          left, right,primal_deg,primal_edge,primal_ne,trisk_deg,wee,trisk,Ai, & 
    6267          enter_trace, exit_trace 
    63     FIELD_U     :: hflux, Ftheta, qu, du 
    64     FIELD_MASS  :: convm 
    65     FIELD_THETA :: theta, dtheta_rhodz 
     68    FIELD_U     :: hflux, Ftheta, qu, du ! IN, BUF, IN, INOUT 
     69    FIELD_MASS  :: convm                 ! BUF 
     70    FIELD_THETA :: theta, dtheta_rhodz   ! IN, OUT 
    6671    DECLARE_INDICES 
    6772    DECLARE_EDGES 
     
    7075#include "../kernels_unst/coriolis.k90" 
    7176    STOP_TRACE 
    72   END SUBROUTINE compute_coriolis_unst 
    73  
    74   SUBROUTINE compute_caldyn_Coriolis(hflux,theta,qu, convm,dtheta_rhodz,du) 
     77  END SUBROUTINE compute_caldyn_coriolis_unst 
     78 
     79  SUBROUTINE compute_caldyn_Coriolis_hex(hflux,theta,qu, Ftheta, convm,dtheta_rhodz,du) 
    7580    USE icosa 
    76     USE trace 
    7781    USE caldyn_vars_mod 
    78     USE omp_para, ONLY : ll_begin, ll_end 
    79     REAL(rstd),INTENT(IN)  :: hflux(3*iim*jjm,llm)  ! hflux in kg/s 
    80     REAL(rstd),INTENT(IN)  :: theta(iim*jjm,llm,nqdyn) ! active scalars 
    81     REAL(rstd),INTENT(IN)  :: qu(3*iim*jjm,llm) 
    82     REAL(rstd),INTENT(OUT) :: convm(iim*jjm,llm)  ! mass flux convergence 
    83     REAL(rstd),INTENT(OUT) :: dtheta_rhodz(iim*jjm,llm,nqdyn) 
     82    REAL(rstd),INTENT(IN)    :: hflux(3*iim*jjm,llm)  ! hflux in kg/s 
     83    REAL(rstd),INTENT(IN)    :: theta(iim*jjm,llm,nqdyn) ! active scalars 
     84    REAL(rstd),INTENT(IN)    :: qu(3*iim*jjm,llm) 
     85    REAL(rstd), INTENT(OUT)  :: Ftheta(3*iim*jjm,llm)  ! potential temperature flux 
     86    REAL(rstd),INTENT(OUT)   :: convm(iim*jjm,llm)  ! mass flux convergence 
     87    REAL(rstd),INTENT(OUT)   :: dtheta_rhodz(iim*jjm,llm,nqdyn) 
    8488    REAL(rstd),INTENT(INOUT) :: du(3*iim*jjm,llm) 
    85      
    86     REAL(rstd) :: Ftheta(3*iim*jjm,llm)  ! potential temperature flux 
    8789    REAL(rstd) :: uu_right, uu_lup, uu_ldown, du_trisk, divF 
    8890    INTEGER :: ij,iq,l,kdown 
    89  
    9091    CALL trace_start("compute_caldyn_Coriolis") 
    9192 
    92     IF(dysl_caldyn_coriolis) THEN 
    93  
    9493#include "../kernels_hex/coriolis.k90" 
    9594 
    96     ELSE 
    97 #define FTHETA(ij) Ftheta(ij,1) 
     95    CALL trace_end("compute_caldyn_Coriolis") 
     96  END SUBROUTINE compute_caldyn_Coriolis_hex 
     97 
     98  SUBROUTINE compute_caldyn_Coriolis_manual(hflux,theta,qu, Ftheta, convm,dtheta_rhodz,du) 
     99    USE icosa 
     100    USE caldyn_vars_mod 
     101    REAL(rstd),INTENT(IN)    :: hflux(3*iim*jjm,llm)  ! hflux in kg/s 
     102    REAL(rstd),INTENT(IN)    :: theta(iim*jjm,llm,nqdyn) ! active scalars 
     103    REAL(rstd),INTENT(IN)    :: qu(3*iim*jjm,llm) 
     104    REAL(rstd),INTENT(IN)    :: Ftheta(3*iim*jjm,llm)  ! ignored in favor of local buffer 
     105    REAL(rstd),INTENT(OUT)   :: convm(iim*jjm,llm)  ! mass flux convergence 
     106    REAL(rstd),INTENT(OUT)   :: dtheta_rhodz(iim*jjm,llm,nqdyn) 
     107    REAL(rstd),INTENT(INOUT) :: du(3*iim*jjm,llm) 
     108    REAL(rstd)  :: buf_Ftheta(3*iim*jjm)  ! local buffer for potential temperature flux 
     109    REAL(rstd) :: uu_right, uu_lup, uu_ldown, du_trisk, divF 
     110    INTEGER :: ij,iq,l,kdown 
     111 
     112    CALL trace_start("compute_caldyn_Coriolis") 
     113 
     114#define FTHETA(ij) buf_Ftheta(ij) 
    98115 
    99116    DO l=ll_begin, ll_end 
     
    275292#undef FTHETA 
    276293 
    277     END IF ! dysl 
    278  
    279294    CALL trace_end("compute_caldyn_Coriolis") 
    280295 
    281   END SUBROUTINE compute_caldyn_Coriolis 
     296  END SUBROUTINE compute_caldyn_Coriolis_manual 
    282297   
    283298END MODULE compute_caldyn_Coriolis_mod 
  • codes/icosagcm/devel/src/dynamics/compute_caldyn_solver.F90

    r878 r928  
    121121    USE omp_para, ONLY : ll_begin, ll_end,ll_beginp1,ll_endp1 
    122122    USE disvert_mod, ONLY : ptop 
    123     USE caldyn_kernels_hevi_mod 
    124123    USE compute_NH_geopot_mod 
    125124    REAL(rstd), PARAMETER :: pbot=1e5, rho_bot=1e6 
  • codes/icosagcm/devel/src/dynamics/compute_caldyn_vert_NH.F90

    r924 r928  
    1 MODULE caldyn_kernels_base_mod 
    2   USE icosa 
    3   USE transfert_mod 
     1MODULE compute_caldyn_vert_NH_mod 
     2  USE prec, ONLY : rstd 
     3  USE grid_param 
    44  USE disvert_mod 
    5   USE caldyn_vars_mod 
    65  USE omp_para 
    76  USE trace 
     
    109  SAVE 
    1110 
    12   PUBLIC :: compute_caldyn_vert, compute_caldyn_vert_nh 
     11  PUBLIC :: compute_caldyn_vert_nh_manual, & 
     12       compute_caldyn_vert_nh_hex 
    1313 
    1414CONTAINS 
    1515 
    16  
    17   SUBROUTINE compute_caldyn_vert(u,theta,rhodz,convm, wflux,wwuu, dps,dtheta_rhodz,du) 
    18     REAL(rstd),INTENT(IN)  :: u(iim*3*jjm,llm) 
    19     REAL(rstd),INTENT(IN)  :: theta(iim*jjm,llm,nqdyn) 
    20     REAL(rstd),INTENT(IN)  :: rhodz(iim*jjm,llm) 
    21     REAL(rstd),INTENT(INOUT)  :: convm(iim*jjm,llm)  ! mass flux convergence 
    22     REAL(rstd),INTENT(INOUT) :: wflux(iim*jjm,llm+1) ! vertical mass flux (kg/m2/s) 
    23     REAL(rstd),INTENT(INOUT) :: wwuu(iim*3*jjm,llm+1) 
    24     REAL(rstd),INTENT(INOUT) :: du(iim*3*jjm,llm) 
    25     REAL(rstd),INTENT(INOUT) :: dtheta_rhodz(iim*jjm,llm,nqdyn) 
    26     REAL(rstd),INTENT(OUT) :: dps(iim*jjm) 
    27  
    28     ! temporary variable     
    29     INTEGER :: i,j,ij,l,iq 
    30     REAL(rstd) :: p_ik, exner_ik, dF_deta, dFu_deta 
    31     INTEGER    :: ij_omp_begin, ij_omp_end 
    32  
    33     CALL trace_start("compute_caldyn_vert") 
    34  
    35 !$OMP BARRIER 
    36  
    37     CALL distrib_level(ij_begin,ij_end, ij_omp_begin,ij_omp_end) 
    38  
    39     IF(dysl_caldyn_vert) THEN 
    40 #define mass_bl(ij,l) bp(l) 
    41 #define dmass_col(ij) dps(ij) 
    42 #include "../kernels_hex/caldyn_wflux.k90" 
    43 #include "../kernels_hex/caldyn_vert.k90" 
    44 #undef mass_bl 
    45 #undef dmass_col 
    46     ELSE 
    47  
    48 !!! cumulate mass flux convergence from top to bottom 
    49     DO  l = llm-1, 1, -1 
    50        !DIR$ SIMD 
    51        DO ij=ij_omp_begin,ij_omp_end          
    52           convm(ij,l) = convm(ij,l) + convm(ij,l+1) 
    53        ENDDO 
    54     ENDDO 
    55     !  ENDIF 
    56  
    57     !$OMP BARRIER 
    58     ! FLUSH on convm 
    59     ! compute dmass_col 
    60     IF (is_omp_first_level) THEN 
    61        !DIR$ SIMD 
    62        DO ij=ij_begin,ij_end          
    63           ! dps/dt = -int(div flux)dz 
    64           dps(ij) = convm(ij,1) 
    65        ENDDO 
    66     ENDIF 
    67  
    68 !!! Compute vertical mass flux (l=1,llm+1 done by caldyn_BC) 
    69     DO l=ll_beginp1,ll_end 
    70        !    IF (caldyn_conserv==energy) CALL test_message(req_qu)  
    71        !DIR$ SIMD 
    72        DO ij=ij_begin,ij_end          
    73           ! w = int(z,ztop,div(flux)dz) + B(eta)dps/dt 
    74           ! => w>0 for upward transport 
    75           wflux( ij, l ) = bp(l) * convm( ij, 1 ) - convm( ij, l )  
    76        ENDDO 
    77     ENDDO 
    78  
    79     !--> flush wflux   
    80     !$OMP BARRIER 
    81  
    82     DO iq=1,nqdyn 
    83        DO l=ll_begin,ll_endm1 
    84        !DIR$ SIMD 
    85           DO ij=ij_begin,ij_end          
    86              dtheta_rhodz(ij, l, iq) = dtheta_rhodz(ij, l, iq)  -   0.5 * & 
    87                   ( wflux(ij,l+1) * (theta(ij,l,iq) + theta(ij,l+1,iq))) 
    88           END DO 
    89        END DO 
    90        DO l=ll_beginp1,ll_end 
    91           !DIR$ SIMD 
    92           DO ij=ij_begin,ij_end          
    93              dtheta_rhodz(ij, l, iq) = dtheta_rhodz(ij, l, iq)  +   0.5 * & 
    94                   ( wflux(ij,l) * (theta(ij,l-1,iq) + theta(ij,l,iq) ) ) 
    95           END DO 
    96        END DO 
    97     END DO 
    98  
    99     ! Compute vertical transport 
    100     DO l=ll_beginp1,ll_end 
    101        !DIR$ SIMD 
    102        DO ij=ij_begin,ij_end          
    103           wwuu(ij+u_right,l) = 0.5*( wflux(ij,l) + wflux(ij+t_right,l)) * (u(ij+u_right,l) - u(ij+u_right,l-1)) 
    104           wwuu(ij+u_lup,l) = 0.5* ( wflux(ij,l) + wflux(ij+t_lup,l)) * (u(ij+u_lup,l) - u(ij+u_lup,l-1)) 
    105           wwuu(ij+u_ldown,l) = 0.5*( wflux(ij,l) + wflux(ij+t_ldown,l)) * (u(ij+u_ldown,l) - u(ij+u_ldown,l-1)) 
    106        ENDDO 
    107     ENDDO 
    108  
    109     !--> flush wwuu   
    110     !$OMP BARRIER 
    111  
    112     ! Add vertical transport to du 
    113     DO l=ll_begin,ll_end 
    114        !DIR$ SIMD 
    115        DO ij=ij_begin,ij_end          
    116           du(ij+u_right, l )   = du(ij+u_right,l)  - (wwuu(ij+u_right,l+1)+ wwuu(ij+u_right,l)) / (rhodz(ij,l)+rhodz(ij+t_right,l)) 
    117           du(ij+u_lup, l )     = du(ij+u_lup,l)    - (wwuu(ij+u_lup,l+1)  + wwuu(ij+u_lup,l))   / (rhodz(ij,l)+rhodz(ij+t_lup,l)) 
    118           du(ij+u_ldown, l )   = du(ij+u_ldown,l)  - (wwuu(ij+u_ldown,l+1)+ wwuu(ij+u_ldown,l)) / (rhodz(ij,l)+rhodz(ij+t_ldown,l)) 
    119        ENDDO 
    120     ENDDO 
    121  
    122     END IF ! dysl 
    123  
    124     CALL trace_end("compute_caldyn_vert") 
    125  
    126   END SUBROUTINE compute_caldyn_vert 
    127  
    128   SUBROUTINE compute_caldyn_vert_NH(mass,geopot,W,wflux, W_etadot, du,dPhi,dW) 
     16  SUBROUTINE compute_caldyn_vert_NH_hex(mass,geopot,W,wflux, W_etadot, du,dPhi,dW) 
    12917    REAL(rstd),INTENT(IN) :: mass(iim*jjm,llm) 
    13018    REAL(rstd),INTENT(IN) :: geopot(iim*jjm,llm+1) 
     
    14432    CALL trace_start("compute_caldyn_vert_nh") 
    14533 
    146     IF(dysl) THEN 
    14734!$OMP BARRIER 
    14835#include "../kernels_hex/caldyn_vert_NH.k90" 
    14936!$OMP BARRIER 
    150     ELSE 
     37    CALL trace_end("compute_caldyn_vert_nh") 
     38  END SUBROUTINE compute_caldyn_vert_NH_hex 
     39 
     40  SUBROUTINE compute_caldyn_vert_NH_manual(mass,geopot,W,wflux, W_etadot, du,dPhi,dW) 
     41    REAL(rstd),INTENT(IN) :: mass(iim*jjm,llm) 
     42    REAL(rstd),INTENT(IN) :: geopot(iim*jjm,llm+1) 
     43    REAL(rstd),INTENT(IN) :: W(iim*jjm,llm+1) 
     44    REAL(rstd),INTENT(IN) :: wflux(iim*jjm,llm+1) 
     45    REAL(rstd),INTENT(INOUT) :: du(iim*3*jjm,llm) 
     46    REAL(rstd),INTENT(INOUT) :: dPhi(iim*jjm,llm+1) 
     47    REAL(rstd),INTENT(INOUT) :: dW(iim*jjm,llm+1) 
     48    REAL(rstd) :: W_etadot(iim*jjm,llm) ! vertical flux of vertical momentum 
     49    ! local arrays 
     50    REAL(rstd) :: eta_dot(iim*jjm, llm) ! eta_dot in full layers 
     51    REAL(rstd) :: wcov(iim*jjm,llm) ! covariant vertical momentum in full layers 
     52    ! indices and temporary values 
     53    INTEGER    :: ij, l 
     54    REAL(rstd) :: wflux_ij, w_ij 
     55 
     56    CALL trace_start("compute_caldyn_vert_nh") 
     57 
    15158#define ETA_DOT(ij) eta_dot(ij,1) 
    15259#define WCOV(ij) wcov(ij,1) 
     
    196103#undef WCOV 
    197104 
    198     END IF ! dysl 
    199105    CALL trace_end("compute_caldyn_vert_nh") 
    200106 
    201   END SUBROUTINE compute_caldyn_vert_NH 
     107  END SUBROUTINE compute_caldyn_vert_NH_manual 
    202108 
    203 END MODULE caldyn_kernels_base_mod 
     109END MODULE compute_caldyn_vert_NH_mod 
Note: See TracChangeset for help on using the changeset viewer.