Changeset 1017 for trunk/LMDZ.COMMON/libf/dyn3dpar/cpdet_mod.F90
- Timestamp:
- Aug 22, 2013, 4:02:07 PM (11 years ago)
- File:
-
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/LMDZ.COMMON/libf/dyn3dpar/cpdet_mod.F90
r1016 r1017 1 ! ADAPTATION GCM POUR CP(T) 2 c====================================================================== 3 c S. Lebonnois, 10/2010 4 c 5 c Cp doit être calculé par cpdet(t) pour être valable partout 6 c 7 c La fonction d'Exner reste pk = RCPD*(play/pref)**RKAPPA 8 c (RCPD=cpp, RKAPPA=kappa) 9 c 10 c On passe de T a teta (temperature potentielle) par t2tpot(t,teta,pk) 11 c On passe de teta a T par tpot2t(teta,t,pk) 12 c 13 c====================================================================== 1 module cpdet_mod 2 3 implicit none 4 5 ! ADAPTATION OF GCM TO CP(T) 6 !====================================================================== 7 ! S. Lebonnois, 10/2010 8 ! 9 ! Cp must be computed using cpdet(t) to be valid 10 ! 11 ! The Exner function is still pk = RCPD*(play/pref)**RKAPPA 12 ! (RCPD=cpp, RKAPPA=kappa) 13 ! 14 ! One goes from T to teta (potential temperature) using t2tpot(t,teta,pk) 15 ! One goes from teta to T using tpot2t(teta,t,pk) 16 ! 17 !====================================================================== 18 19 contains 14 20 15 21 SUBROUTINE ini_cpdet … … 17 23 USE control_mod, ONLY: planet_type 18 24 IMPLICIT none 19 c======================================================================20 c Initialisation de nu_venus ett0_venus21 c======================================================================25 !====================================================================== 26 ! Initialization of nu_venus and t0_venus 27 !====================================================================== 22 28 23 29 ! for cpp, nu_venus and t0_venus: … … 33 39 34 40 return 35 end 36 37 c======================================================================38 c======================================================================41 end subroutine ini_cpdet 42 43 !====================================================================== 44 !====================================================================== 39 45 40 46 FUNCTION cpdet(t) … … 46 52 #include "comconst.h" 47 53 48 real cpdet,t 54 real,intent(in) :: t 55 real cpdet 49 56 50 57 if (planet_type.eq."venus") then … … 55 62 56 63 return 57 end 58 59 c======================================================================60 c======================================================================64 end function cpdet 65 66 !====================================================================== 67 !====================================================================== 61 68 62 69 SUBROUTINE t2tpot(npoints, yt, yteta, ypk) 63 c======================================================================64 cArguments:65 c 66 cyt --------input-R- Temperature67 cyteta-------output-R- Temperature potentielle68 cypk --------input-R- Fonction d'Exner: RCPD*(pplay/pref)**RKAPPA69 c 70 c======================================================================70 !====================================================================== 71 ! Arguments: 72 ! 73 ! yt --------input-R- Temperature 74 ! yteta-------output-R- Temperature potentielle 75 ! ypk --------input-R- Fonction d'Exner: RCPD*(pplay/pref)**RKAPPA 76 ! 77 !====================================================================== 71 78 72 79 USE control_mod, ONLY: planet_type … … 76 83 #include "comconst.h" 77 84 78 integer npoints 79 REAL yt(npoints), yteta(npoints), ypk(npoints) 85 integer,intent(in) :: npoints 86 REAL,intent(in) :: yt(npoints), ypk(npoints) 87 REAL,intent(out) :: yteta(npoints) 80 88 81 89 if (planet_type.eq."venus") then … … 88 96 89 97 return 90 end 91 92 c======================================================================93 c======================================================================98 end subroutine t2tpot 99 100 !====================================================================== 101 !====================================================================== 94 102 95 103 SUBROUTINE t2tpot_p(nlon,nlev, yt, yteta, ypk) 96 ! Parallel version of t2tpot 97 USE parallel 104 ! Parallel version of t2tpot, for an arbitrary number of columns 98 105 USE control_mod, only : planet_type 99 106 IMPLICIT none … … 110 117 111 118 if (planet_type.eq."venus") then 119 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 112 120 do l=1,nlev 113 121 yteta(:,l)=yt(:,l)**nu_venus & … … 116 124 yteta(:,l)=yteta(:,l)**(1./nu_venus) 117 125 enddo 118 else 126 !$OMP END DO 127 else 128 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 119 129 do l=1,nlev 120 130 yteta(:,l)=yt(:,l)*cpp/ypk(:,l) 121 131 enddo 132 !$OMP END DO 122 133 endif ! of if (planet_type.eq."venus") 123 134 124 END 125 126 c====================================================================== 135 end subroutine t2tpot_p 136 137 !====================================================================== 138 !====================================================================== 139 140 SUBROUTINE t2tpot_glo_p(yt, yteta, ypk) 141 ! Parallel version of t2tpot, over the full dynamics (scalar) grid 142 ! (more efficient than multiple calls to t2tpot_p() with slices of data) 143 USE parallel, only : jj_begin,jj_end 144 USE control_mod, only : planet_type 145 IMPLICIT none 146 ! for iip1, jjp1 and llm 147 #include "dimensions.h" 148 #include "paramet.h" 149 ! for cpp, nu_venus and t0_venus: 150 #include "comconst.h" 151 152 real,intent(in) :: yt(iip1,jjp1,llm) 153 real,intent(out) :: yteta(iip1,jjp1,llm) 154 real,intent(in) :: ypk(iip1,jjp1,llm) 155 ! local variable: 156 integer :: j,l 157 integer :: jjb,jje 158 159 jjb=jj_begin 160 jje=jj_end 161 162 if (planet_type.eq."venus") then 163 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 164 do l=1,llm 165 yteta(:,jjb:jje,l)=yt(:,jjb:jje,l)**nu_venus & 166 & -nu_venus*t0_venus**nu_venus* & 167 & log(ypk(:,jjb:jje,l)/cpp) 168 yteta(:,jjb:jje,l)=yteta(:,jjb:jje,l)**(1./nu_venus) 169 enddo 170 !$OMP END DO 171 else 172 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 173 do l=1,llm 174 yteta(:,jjb:jje,l)=yt(:,jjb:jje,l)*cpp/ypk(:,jjb:jje,l) 175 enddo 176 !$OMP END DO 177 endif ! of if (planet_type.eq."venus") 178 179 end subroutine t2tpot_glo_p 180 181 !====================================================================== 127 182 128 183 SUBROUTINE tpot2t(npoints,yteta, yt, ypk) 129 c======================================================================130 cArguments:131 c 132 cyteta--------input-R- Temperature potentielle133 cyt -------output-R- Temperature134 cypk --------input-R- Fonction d'Exner: RCPD*(pplay/pref)**RKAPPA135 c 136 c======================================================================184 !====================================================================== 185 ! Arguments: 186 ! 187 ! yteta--------input-R- Temperature potentielle 188 ! yt -------output-R- Temperature 189 ! ypk --------input-R- Fonction d'Exner: RCPD*(pplay/pref)**RKAPPA 190 ! 191 !====================================================================== 137 192 138 193 USE control_mod, ONLY: planet_type … … 142 197 #include "comconst.h" 143 198 144 integer npoints 145 REAL yt(npoints), yteta(npoints), ypk(npoints) 199 integer,intent(in) :: npoints 200 REAL,intent(in) :: yteta(npoints), ypk(npoints) 201 REAL,intent(out) :: yt(npoints) 146 202 147 203 if (planet_type.eq."venus") then … … 154 210 155 211 return 156 end 157 158 c====================================================================== 159 c====================================================================== 212 end subroutine tpot2t 213 214 !====================================================================== 215 !====================================================================== 216 160 217 SUBROUTINE tpot2t_p(nlon,nlev,yteta,yt,ypk) 161 ! Parallel version of tpot2t 162 USE parallel 218 ! Parallel version of tpot2t, for an arbitrary number of columns 163 219 USE control_mod, only : planet_type 164 220 IMPLICIT none … … 175 231 176 232 if (planet_type.eq."venus") then 233 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 177 234 do l=1,nlev 178 235 yt(:,l)=yteta(:,l)**nu_venus & … … 181 238 yt(:,l)=yt(:,l)**(1./nu_venus) 182 239 enddo 183 else 240 !$OMP END DO 241 else 242 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 184 243 do l=1,nlev 185 244 yt(:,l)=yteta(:,l)*ypk(:,l)/cpp 186 245 enddo 246 !$OMP END DO 187 247 endif ! of if (planet_type.eq."venus") 188 END 189 190 c====================================================================== 191 c====================================================================== 192 c 193 c ATTENTION 194 c 195 c Si un jour on a besoin, il faudra coder les routines 196 c dt2dtpot / dtpto2dt 197 c 198 c====================================================================== 199 c====================================================================== 248 end subroutine tpot2t_p 249 250 !====================================================================== 251 !====================================================================== 252 253 SUBROUTINE tpot2t_glo_p(yteta,yt,ypk) 254 ! Parallel version of tpot2t, over the full dynamics (scalar) grid 255 ! (more efficient than multiple calls to tpot2t_p() with slices of data) 256 USE parallel, only : jj_begin,jj_end 257 USE control_mod, only : planet_type 258 IMPLICIT none 259 ! for iip1, jjp1 and llm 260 #include "dimensions.h" 261 #include "paramet.h" 262 ! for cpp, nu_venus and t0_venus: 263 #include "comconst.h" 264 265 real,intent(out) :: yt(iip1,jjp1,llm) 266 real,intent(in) :: yteta(iip1,jjp1,llm) 267 real,intent(in) :: ypk(iip1,jjp1,llm) 268 ! local variable: 269 integer :: j,l 270 integer :: jjb,jje 271 272 jjb=jj_begin 273 jje=jj_end 274 275 if (planet_type.eq."venus") then 276 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 277 do l=1,llm 278 yt(:,jjb:jje,l)=yteta(:,jjb:jje,l)**nu_venus & 279 & +nu_venus*t0_venus**nu_venus* & 280 & log(ypk(:,jjb:jje,l)/cpp) 281 yt(:,jjb:jje,l)=yt(:,jjb:jje,l)**(1./nu_venus) 282 enddo 283 !$OMP END DO 284 else 285 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 286 do l=1,llm 287 yt(:,jjb:jje,l)=yteta(:,jjb:jje,l)*ypk(:,jjb:jje,l)/cpp 288 enddo 289 !$OMP END DO 290 endif ! of if (planet_type.eq."venus") 291 end subroutine tpot2t_glo_p 292 293 !====================================================================== 294 !====================================================================== 295 ! 296 ! ATTENTION 297 ! 298 ! Si un jour on a besoin, il faudra coder les routines 299 ! dt2dtpot / dtpto2dt 300 ! 301 !====================================================================== 302 !====================================================================== 303 end module cpdet_mod
Note: See TracChangeset
for help on using the changeset viewer.