- Timestamp:
- Jul 23, 2024, 8:22:55 AM (2 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/exner_hyb_loc_m.F90
r5099 r5101 5 5 contains 6 6 7 SUBROUTINE exner_hyb_loc(ngrid, ps, p, pks, pk,pkf)7 SUBROUTINE exner_hyb_loc(ngrid, ps, p, pks, pk, pkf) 8 8 9 9 ! Auteurs : P.Le Van , Fr. Hourdin . … … 14 14 15 15 ! ************************************************************************ 16 ! Calcule la fonction d'Exner pk = Cp * (p/preff) ** kappa , aux milieux des 16 ! Calcule la fonction d'Exner pk = Cp * (p/preff) ** kappa , aux milieux des 17 17 ! couches . Pk(l) sera calcule aux milieux des couches l ,entre les 18 18 ! pressions p(l) et p(l+1) ,definis aux interfaces des llm couches . … … 26 26 ! ( voir note de Fr.Hourdin ) , 27 27 28 ! on determine successivement , du haut vers le bas des couches, les 29 ! coef. alpha(llm),beta(llm) .,.,alpha(l),beta(l),,,alpha(2),beta(2), 30 ! puis pk(ij,1). Ensuite ,on calcule,du bas vers le haut des couches, 28 ! on determine successivement , du haut vers le bas des couches, les 29 ! coef. alpha(llm),beta(llm) .,.,alpha(l),beta(l),,,alpha(2),beta(2), 30 ! puis pk(ij,1). Ensuite ,on calcule,du bas vers le haut des couches, 31 31 ! pk(ij,l) donne par la relation (2), pour l = 2 a l = llm . 32 33 32 34 33 USE parallel_lmdz … … 37 36 USE comconst_mod, ONLY: cpp, kappa, r, jmp1 38 37 USE comvert_mod, ONLY: preff 39 38 USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_DEBUGIO 39 40 40 IMPLICIT NONE 41 41 … … 45 45 46 46 INTEGER ngrid 47 REAL p(ijb_u:ije_u, llmp1),pk(ijb_u:ije_u,llm)48 REAL, optional :: pkf(ijb_u:ije_u,llm)49 REAL ps(ijb_u:ije_u), pks(ijb_u:ije_u)50 REAL alpha(ijb_u:ije_u, llm),beta(ijb_u:ije_u,llm)47 REAL p(ijb_u:ije_u, llmp1), pk(ijb_u:ije_u, llm) 48 REAL, optional :: pkf(ijb_u:ije_u, llm) 49 REAL ps(ijb_u:ije_u), pks(ijb_u:ije_u) 50 REAL alpha(ijb_u:ije_u, llm), beta(ijb_u:ije_u, llm) 51 51 52 52 ! .... variables locales ... 53 53 54 54 INTEGER l, ij 55 REAL unpl2k, dellta55 REAL unpl2k, dellta 56 56 57 INTEGER ije, ijb,jje,jjb58 logical, save :: firstcall=.true.59 !$OMP THREADPRIVATE(firstcall) 60 character(len =*),parameter :: modname="exner_hyb_loc"57 INTEGER ije, ijb, jje, jjb 58 logical, save :: firstcall = .true. 59 !$OMP THREADPRIVATE(firstcall) 60 character(len = *), parameter :: modname = "exner_hyb_loc" 61 61 62 !$OMP BARRIER 62 !$OMP BARRIER 63 63 64 64 ! Sanity check 65 65 if (firstcall) then 66 67 68 69 callabort_gcm(modname, &70 "kappa!=1 , but running in Shallow Water mode!!", 42)71 72 73 callabort_gcm(modname, &74 "cpp!=r , but running in Shallow Water mode!!", 42)75 76 66 ! sanity checks for Shallow Water case (1 vertical layer) 67 if (llm==1) then 68 if (kappa/=1) then 69 CALL abort_gcm(modname, & 70 "kappa!=1 , but running in Shallow Water mode!!", 42) 71 endif 72 if (cpp/=r) then 73 CALL abort_gcm(modname, & 74 "cpp!=r , but running in Shallow Water mode!!", 42) 75 endif 76 endif ! of if (llm.eq.1) 77 77 78 firstcall=.false.78 firstcall = .false. 79 79 endif ! of if (firstcall) 80 80 … … 84 84 if (llm==1) then 85 85 86 87 ijb=ij_begin88 ije=ij_end89 90 DO ij=ijb, ije91 pks(ij) = (cpp/preff) * ps(ij)92 pk(ij,1) = .5*pks(ij)93 if (present(pkf)) pkf(ij,1)=pk(ij,1)94 95 86 ! Compute pks(:),pk(:),pkf(:) 87 ijb = ij_begin 88 ije = ij_end 89 !$OMP DO SCHEDULE(STATIC) 90 DO ij = ijb, ije 91 pks(ij) = (cpp / preff) * ps(ij) 92 pk(ij, 1) = .5 * pks(ij) 93 if (present(pkf)) pkf(ij, 1) = pk(ij, 1) 94 ENDDO 95 !$OMP ENDDO 96 96 97 98 99 jjb=jj_begin100 jje=jj_end101 CALL filtreg_p ( pkf,jjb_u,jje_u,jjb,jje, jmp1, llm, &102 2, 1, .TRUE., 1)103 97 !$OMP BARRIER 98 if (present(pkf)) then 99 jjb = jj_begin 100 jje = jj_end 101 CALL filtreg_p (pkf, jjb_u, jje_u, jjb, jje, jmp1, llm, & 102 2, 1, .TRUE., 1) 103 end if 104 104 105 106 105 ! our work is done, exit routine 106 return 107 107 endif ! of if (llm.eq.1) 108 108 109 109 ! General case: 110 110 111 unpl2k = 1.+ 2.* kappa111 unpl2k = 1. + 2. * kappa 112 112 113 113 ! ------------- … … 115 115 ! ------------- 116 116 117 ijb =ij_begin118 ije =ij_end117 ijb = ij_begin 118 ije = ij_end 119 119 120 120 !$OMP DO SCHEDULE(STATIC) 121 DO ij 122 pks(ij) = cpp * ( ps(ij)/preff) ** kappa121 DO ij = ijb, ije 122 pks(ij) = cpp * (ps(ij) / preff) ** kappa 123 123 ENDDO 124 124 !$OMP ENDDO … … 131 131 132 132 !$OMP DO SCHEDULE(STATIC) 133 DO ij = ijb,ije134 alpha(ij,llm) = 0.135 beta (ij,llm) = 1./ unpl2k133 DO ij = ijb, ije 134 alpha(ij, llm) = 0. 135 beta (ij, llm) = 1. / unpl2k 136 136 ENDDO 137 137 !$OMP ENDDO NOWAIT … … 139 139 ! ... Calcul des coeff. alpha et beta pour l = llm-1 a l = 2 ... 140 140 141 DO l = llm - 1 , 2, -1141 DO l = llm - 1, 2, -1 142 142 143 144 145 dellta = p(ij,l)* unpl2k + p(ij,l+1)* ( beta(ij,l+1)-unpl2k)146 alpha(ij,l) = - p(ij,l+1) / dellta * alpha(ij,l+1)147 beta (ij,l) = p(ij,l ) / dellta148 149 143 !$OMP DO SCHEDULE(STATIC) 144 DO ij = ijb, ije 145 dellta = p(ij, l) * unpl2k + p(ij, l + 1) * (beta(ij, l + 1) - unpl2k) 146 alpha(ij, l) = - p(ij, l + 1) / dellta * alpha(ij, l + 1) 147 beta (ij, l) = p(ij, l) / dellta 148 ENDDO 149 !$OMP ENDDO NOWAIT 150 150 ENDDO 151 151 … … 154 154 155 155 !$OMP DO SCHEDULE(STATIC) 156 DO ij 157 pk(ij,1) = ( p(ij,1)*pks(ij) - 0.5*alpha(ij,2)*p(ij,2) )/ &158 ( p(ij,1)* (1.+kappa) + 0.5*( beta(ij,2)-unpl2k )* p(ij,2))156 DO ij = ijb, ije 157 pk(ij, 1) = (p(ij, 1) * pks(ij) - 0.5 * alpha(ij, 2) * p(ij, 2)) / & 158 (p(ij, 1) * (1. + kappa) + 0.5 * (beta(ij, 2) - unpl2k) * p(ij, 2)) 159 159 ENDDO 160 160 !$OMP ENDDO NOWAIT … … 163 163 164 164 DO l = 2, llm 165 166 DO ij= ijb, ije167 pk(ij,l) = alpha(ij,l) + beta(ij,l) * pk(ij,l-1)168 169 !$OMP ENDDO NOWAIT165 !$OMP DO SCHEDULE(STATIC) 166 DO ij = ijb, ije 167 pk(ij, l) = alpha(ij, l) + beta(ij, l) * pk(ij, l - 1) 168 ENDDO 169 !$OMP ENDDO NOWAIT 170 170 ENDDO 171 171 172 172 if (present(pkf)) then 173 173 ! calcul de pkf 174 174 175 176 177 DO ij= ijb, ije178 pkf(ij,l)=pk(ij,l)179 180 !$OMP ENDDO NOWAIT181 175 DO l = 1, llm 176 !$OMP DO SCHEDULE(STATIC) 177 DO ij = ijb, ije 178 pkf(ij, l) = pk(ij, l) 179 ENDDO 180 !$OMP ENDDO NOWAIT 181 ENDDO 182 182 183 183 !$OMP BARRIER 184 184 185 jjb=jj_begin186 jje=jj_end187 #ifdef DEBUG_IO 188 call WriteField_u('pkf',pkf)189 #endif 190 CALL filtreg_p ( pkf,jjb_u,jje_u,jjb,jje, jmp1, llm, &191 2, 1, .TRUE., 1)192 #ifdef DEBUG_IO 193 call WriteField_u('pkf',pkf)194 #endif 185 jjb = jj_begin 186 jje = jj_end 187 IF (CPPKEY_DEBUGIO) THEN 188 CALL WriteField_u('pkf', pkf) 189 END IF 190 CALL filtreg_p (pkf, jjb_u, jje_u, jjb, jje, jmp1, llm, & 191 2, 1, .TRUE., 1) 192 IF (CPPKEY_DEBUGIO) THEN 193 CALL WriteField_u('pkf', pkf) 194 END IF 195 195 end if 196 196
Note: See TracChangeset
for help on using the changeset viewer.