Changeset 917


Ignore:
Timestamp:
06/18/19 15:53:26 (5 years ago)
Author:
dubos
Message:

devel : DYSL for compute_theta

Location:
codes/icosagcm/devel/src
Files:
1 added
3 edited

Legend:

Unmodified
Added
Removed
  • codes/icosagcm/devel/src/dynamics/caldyn_hevi.f90

    r884 r917  
    55  USE caldyn_kernels_hevi_mod 
    66  USE caldyn_kernels_base_mod 
    7   USE compute_theta_mod, ONLY : compute_theta 
     7  USE compute_theta_mod, ONLY : compute_theta => compute_theta_manual 
    88  USE compute_caldyn_kv_mod, ONLY : compute_caldyn_kv 
    99  USE compute_caldyn_Coriolis_mod, ONLY : compute_caldyn_Coriolis 
  • codes/icosagcm/devel/src/dynamics/compute_theta.F90

    r878 r917  
    11MODULE compute_theta_mod 
    2   USE grid_param, ONLY : llm 
     2  USE grid_param, ONLY : llm, nqdyn 
     3  USE disvert_mod, ONLY : mass_dak, mass_dbk, caldyn_eta, eta_mass, ptop 
    34  IMPLICIT NONE 
    45  PRIVATE 
     
    67#include "../unstructured/unstructured.h90" 
    78 
    8   PUBLIC :: compute_theta 
     9  PUBLIC :: compute_theta_unst, compute_theta_hex, compute_theta_manual 
    910 
    1011CONTAINS 
     12 
     13  ! Python/Fortran differences to be resolved at some point : 
     14 
     15  ! the Fortran driver prognoses ps/mass_col or rhodz depending on caldyn_eta 
     16  ! the Python driver prognoses rhodz even if caldyn_eta==eta_mass 
     17  ! so that the DOFs are the same whatever caldyn_eta 
     18 
     19  ! in the Fortran driver dak, dbk are 1D and based on pressure 
     20  ! => m = mass_dak(l)+(mass_col(ij)*g+ptop)*mass_dbk(l) 
     21  !    rhodz(CELL) = m/g  
     22  ! in the Python driver dak, dbk are 2D and based on mass 
     23  ! => rhodz(CELL) = MASS_DAK(CELL) + mass_col(HIDX(CELL))*MASS_DBK(CELL) 
    1124 
    1225#ifdef BEGIN_DYSL 
     
    1427KERNEL(theta) 
    1528  IF(caldyn_eta==eta_mass) THEN ! Compute mass 
    16     ! FIXME : here mass_col is computed from rhodz 
    17     ! so that the DOFs are the same whatever caldyn_eta 
    18     ! in DYNAMICO mass_col is prognosed rather than rhodz 
     29    ! compute mass_col from rhodz 
    1930    SEQUENCE_C1 
    2031      PROLOGUE(0) 
     
    2738    FORALL_CELLS_EXT() 
    2839      ON_PRIMAL 
    29         ! FIXME : formula below (used in DYNAMICO) is for dak, dbk based on 
    30         ! pressure rather than mass 
    31         !        m = mass_dak(CELL)+(mass_col(HIDX(CELL))*g+ptop)*mass_dbk(CELL) 
    32         !        rhodz(CELL) = m/g  
    3340        rhodz(CELL) = MASS_DAK(CELL) + mass_col(HIDX(CELL))*MASS_DBK(CELL) 
    3441      END_BLOCK 
     
    4451END_BLOCK 
    4552 
     53KERNEL(compute_theta) 
     54  IF(caldyn_eta==eta_mass) THEN ! Compute mass 
     55     FORALL_CELLS_EXT() 
     56       ON_PRIMAL 
     57         m = MASS_DAK(CELL)+(mass_col(HIDX(CELL))*g+ptop)*MASS_DBK(CELL) 
     58         rhodz(CELL) = m/g 
     59        END_BLOCK 
     60     END_BLOCK 
     61  END IF   
     62  DO iq=1,nqdyn 
     63     FORALL_CELLS_EXT() 
     64       ON_PRIMAL 
     65         theta(CELL,iq) = theta_rhodz(CELL,iq)/rhodz(CELL) 
     66       END_BLOCK 
     67     END_BLOCK 
     68  END DO 
     69END_BLOCK 
     70 
    4671#endif END_DYSL 
    4772 
    48 SUBROUTINE compute_theta_unst(mass_col,rhodz,theta_rhodz, theta) 
    49   USE ISO_C_BINDING, only : C_DOUBLE, C_FLOAT 
    50   USE data_unstructured_mod, ONLY : id_theta,primal_num,dual_num,edge_num, & 
    51     enter_trace, exit_trace 
    52   USE grid_param, ONLY : nqdyn 
    53   USE disvert_mod, ONLY : mass_dak, mass_dbk, caldyn_eta, eta_mass, ptop 
    54   FIELD_PS :: mass_col 
    55   FIELD_MASS :: rhodz 
    56   FIELD_THETA :: theta, theta_rhodz 
    57   DECLARE_INDICES 
    58   NUM :: m 
    59   START_TRACE(id_theta, 3,0,0) ! primal, dual, edge   
     73  SUBROUTINE compute_theta_unst(mass_col,theta_rhodz, rhodz,theta) 
     74    USE ISO_C_BINDING, only : C_DOUBLE, C_FLOAT 
     75    USE data_unstructured_mod, ONLY : id_theta,primal_num,dual_num,edge_num, & 
     76         enter_trace, exit_trace 
     77    FIELD_PS :: mass_col 
     78    FIELD_MASS :: rhodz 
     79    FIELD_THETA :: theta, theta_rhodz 
     80    DECLARE_INDICES 
     81    NUM :: m 
     82    START_TRACE(id_theta, 3,0,0) ! primal, dual, edge   
    6083#define MASS_DAK(l,ij) mass_dak(l) 
    6184#define MASS_DBK(l,ij) mass_dbk(l) 
     
    6386#undef MASS_DAK 
    6487#undef MASS_DBK 
    65   STOP_TRACE 
    66 END SUBROUTINE 
     88    STOP_TRACE 
     89  END SUBROUTINE compute_theta_unst 
    6790 
    68   SUBROUTINE compute_theta(ps,theta_rhodz, rhodz,theta) 
     91  SUBROUTINE compute_theta_hex(mass_col,theta_rhodz, rhodz,theta) 
    6992    USE icosa 
    7093    USE trace, ONLY : trace_start, trace_end 
    7194    USE omp_para, ONLY : ll_begin, ll_end 
    72     USE disvert_mod, ONLY : mass_dak, mass_dbk, caldyn_eta, eta_mass, ptop 
     95    REAL(rstd),INTENT(IN)    :: mass_col(iim*jjm) 
     96    REAL(rstd),INTENT(IN)    :: theta_rhodz(iim*jjm,llm,nqdyn) 
     97    REAL(rstd),INTENT(INOUT) :: rhodz(iim*jjm,llm) 
     98    REAL(rstd),INTENT(OUT)   :: theta(iim*jjm,llm,nqdyn) 
     99    INTEGER :: ij,l,iq 
     100    REAL(rstd) :: m 
     101    CALL trace_start("compute_theta") 
     102#define MASS_DAK(ij,l) mass_dak(l) 
     103#define MASS_DBK(ij,l) mass_dbk(l) 
     104#include "../kernels_hex/compute_theta.k90" 
     105#undef MASS_DAK 
     106#undef MASS_DBK 
     107    CALL trace_end("compute_theta") 
     108  END SUBROUTINE compute_theta_hex 
     109   
     110  SUBROUTINE compute_theta_manual(ps,theta_rhodz, rhodz,theta) 
     111    USE icosa 
     112    USE trace, ONLY : trace_start, trace_end 
     113    USE omp_para, ONLY : ll_begin, ll_end 
    73114    REAL(rstd),INTENT(IN)    :: ps(iim*jjm) 
    74115    REAL(rstd),INTENT(IN)    :: theta_rhodz(iim*jjm,llm,nqdyn) 
     
    99140 
    100141    CALL trace_end("compute_theta") 
    101   END SUBROUTINE compute_theta 
     142  END SUBROUTINE compute_theta_manual 
    102143   
    103144END MODULE compute_theta_mod 
  • codes/icosagcm/devel/src/kernels_unst/theta.k90

    r913 r917  
    22   !---------------------------- theta ---------------------------------- 
    33   IF(caldyn_eta==eta_mass) THEN ! Compute mass 
    4       ! FIXME : here mass_col is computed from rhodz 
    5       ! so that the DOFs are the same whatever caldyn_eta 
    6       ! in DYNAMICO mass_col is prognosed rather than rhodz 
     4      ! compute mass_col from rhodz 
    75      !$OMP DO SCHEDULE(STATIC) 
    86      DO ij=1,primal_num 
     
    1715         !DIR$ SIMD 
    1816         DO l = 1, llm 
    19             ! FIXME : formula below (used in DYNAMICO) is for dak, dbk based on 
    20             ! pressure rather than mass 
    21             ! m = mass_dak(l,ij)+(mass_col(ij)*g+ptop)*mass_dbk(l,ij) 
    22             ! rhodz(l,ij) = m/g 
    2317            rhodz(l,ij) = MASS_DAK(l,ij) + mass_col(ij)*MASS_DBK(l,ij) 
    2418         END DO 
Note: See TracChangeset for help on using the changeset viewer.