Changeset 917 for codes/icosagcm/devel/src
- Timestamp:
- 06/18/19 15:53:26 (5 years ago)
- Location:
- codes/icosagcm/devel/src
- Files:
-
- 1 added
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
codes/icosagcm/devel/src/dynamics/caldyn_hevi.f90
r884 r917 5 5 USE caldyn_kernels_hevi_mod 6 6 USE caldyn_kernels_base_mod 7 USE compute_theta_mod, ONLY : compute_theta 7 USE compute_theta_mod, ONLY : compute_theta => compute_theta_manual 8 8 USE compute_caldyn_kv_mod, ONLY : compute_caldyn_kv 9 9 USE compute_caldyn_Coriolis_mod, ONLY : compute_caldyn_Coriolis -
codes/icosagcm/devel/src/dynamics/compute_theta.F90
r878 r917 1 1 MODULE 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 3 4 IMPLICIT NONE 4 5 PRIVATE … … 6 7 #include "../unstructured/unstructured.h90" 7 8 8 PUBLIC :: compute_theta 9 PUBLIC :: compute_theta_unst, compute_theta_hex, compute_theta_manual 9 10 10 11 CONTAINS 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) 11 24 12 25 #ifdef BEGIN_DYSL … … 14 27 KERNEL(theta) 15 28 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 19 30 SEQUENCE_C1 20 31 PROLOGUE(0) … … 27 38 FORALL_CELLS_EXT() 28 39 ON_PRIMAL 29 ! FIXME : formula below (used in DYNAMICO) is for dak, dbk based on30 ! pressure rather than mass31 ! m = mass_dak(CELL)+(mass_col(HIDX(CELL))*g+ptop)*mass_dbk(CELL)32 ! rhodz(CELL) = m/g33 40 rhodz(CELL) = MASS_DAK(CELL) + mass_col(HIDX(CELL))*MASS_DBK(CELL) 34 41 END_BLOCK … … 44 51 END_BLOCK 45 52 53 KERNEL(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 69 END_BLOCK 70 46 71 #endif END_DYSL 47 72 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 60 83 #define MASS_DAK(l,ij) mass_dak(l) 61 84 #define MASS_DBK(l,ij) mass_dbk(l) … … 63 86 #undef MASS_DAK 64 87 #undef MASS_DBK 65 STOP_TRACE66 END SUBROUTINE 88 STOP_TRACE 89 END SUBROUTINE compute_theta_unst 67 90 68 SUBROUTINE compute_theta (ps,theta_rhodz, rhodz,theta)91 SUBROUTINE compute_theta_hex(mass_col,theta_rhodz, rhodz,theta) 69 92 USE icosa 70 93 USE trace, ONLY : trace_start, trace_end 71 94 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 73 114 REAL(rstd),INTENT(IN) :: ps(iim*jjm) 74 115 REAL(rstd),INTENT(IN) :: theta_rhodz(iim*jjm,llm,nqdyn) … … 99 140 100 141 CALL trace_end("compute_theta") 101 END SUBROUTINE compute_theta 142 END SUBROUTINE compute_theta_manual 102 143 103 144 END MODULE compute_theta_mod -
codes/icosagcm/devel/src/kernels_unst/theta.k90
r913 r917 2 2 !---------------------------- theta ---------------------------------- 3 3 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 7 5 !$OMP DO SCHEDULE(STATIC) 8 6 DO ij=1,primal_num … … 17 15 !DIR$ SIMD 18 16 DO l = 1, llm 19 ! FIXME : formula below (used in DYNAMICO) is for dak, dbk based on20 ! pressure rather than mass21 ! m = mass_dak(l,ij)+(mass_col(ij)*g+ptop)*mass_dbk(l,ij)22 ! rhodz(l,ij) = m/g23 17 rhodz(l,ij) = MASS_DAK(l,ij) + mass_col(ij)*MASS_DBK(l,ij) 24 18 END DO
Note: See TracChangeset
for help on using the changeset viewer.