Changeset 1017 for trunk/LMDZ.COMMON/libf/dyn3dpar
- Timestamp:
- Aug 22, 2013, 4:02:07 PM (11 years ago)
- Location:
- trunk/LMDZ.COMMON/libf/dyn3dpar
- Files:
-
- 1 added
- 5 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/LMDZ.COMMON/libf/dyn3dpar/calfis_p.F
r892 r1017 39 39 USE infotrac 40 40 USE control_mod 41 USE cpdet_mod, only: tpot2t_p, t2tpot_p 41 42 42 43 IMPLICIT NONE -
trunk/LMDZ.COMMON/libf/dyn3dpar/conf_gcm.F
r1012 r1017 19 19 USE infotrac, ONLY : type_trac 20 20 use assert_m, only: assert 21 use sponge_mod_p, only: callsponge,mode_sponge,nsponge,tetasponge 21 22 IMPLICIT NONE 22 23 c----------------------------------------------------------------------- … … 388 389 tau_top_bound=1.e-5 389 390 CALL getin('tau_top_bound',tau_top_bound) 391 392 ! the other possible sponge layer (sponge_mod) 393 callsponge=.false. ! default value; don't use the sponge 394 call getin("callsponge",callsponge) 395 ! check that user is not trying to use both sponge models 396 if ((iflag_top_bound.ge.1).and.callsponge) then 397 write(lunout,*)'Bad choice of options:' 398 write(lunout,*)' iflag_top_bound=',iflag_top_bound 399 write(lunout,*)' and callsponge=.true.' 400 write(lunout,*)'But both sponge models should not be', 401 & ' used simultaneously!' 402 stop 403 endif 404 405 ! nsponge: number of atmospheric layers over which the sponge extends 406 nsponge=3 ! default value 407 call getin("nsponge",nsponge) 408 409 ! mode_sponge: (quenching is towards ... over the upper nsponge layers) 410 ! 0: (h=hmean,u=v=0) 411 ! 1: (h=hmean,u=umean,v=0) 412 ! 2: (h=hmean,u=umean,v=vmean)" 413 mode_sponge=2 ! default value 414 call getin("mode_sponge",mode_sponge) 415 416 ! tetasponge: characteristic time scale (seconds) at topmost layer 417 ! (time scale then doubles with decreasing layer index)." 418 tetasponge=50000.0 419 call getin("tetasponge",tetasponge) 390 420 391 421 ! FOR TITAN: tidal forces -
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 -
trunk/LMDZ.COMMON/libf/dyn3dpar/gcm.F
r979 r1017 19 19 USE filtreg_mod 20 20 USE control_mod 21 use cpdet_mod, only: ini_cpdet 21 22 22 23 ! Ehouarn: the following are needed with (parallel) physics: -
trunk/LMDZ.COMMON/libf/dyn3dpar/leapfrog_p.F
r1012 r1017 21 21 USE getparam 22 22 USE control_mod 23 use cpdet_mod, only: cpdet,tpot2t_glo_p,t2tpot_glo_p 24 use sponge_mod_p, only: callsponge,mode_sponge,sponge_p 23 25 24 26 IMPLICIT NONE … … 186 188 ! for CP(T) -- Aymeric 187 189 real :: dtec 188 real,external :: cpdet189 190 real,save :: ztetaec(ip1jmp1,llm) !!SAVE ??? 190 191 … … 211 212 c dummy: sinon cette routine n'est jamais compilee... 212 213 if(1.eq.0) then 214 #ifdef CPP_PHYS 213 215 CALL init_phys_lmdz(iim,jjp1,llm,1,(/(jjm-1)*iim+2/)) 216 #endif 214 217 endif 215 218 … … 550 553 c -------------------------------- 551 554 ! ADAPTATION GCM POUR CP(T) 555 call tpot2t_glo_p(teta,temp,pk) 552 556 ijb=ij_begin 553 557 ije=ij_end 554 call tpot2t_p(ije-ijb+1,llm,teta(ijb:ije,:),temp(ijb:ije,:),555 & pk(ijb:ije,:))556 558 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 557 559 do l=1,llm … … 1158 1160 1159 1161 IF(apdiss) THEN 1160 cc$OMP PARALLEL DEFAULT(SHARED) 1161 cc$OMP+ PRIVATE(ijb,ije,tppn,tpn,tpps,tps) 1162 1162 1163 c$OMP MASTER 1163 1164 call suspend_timer(timer_caldyn) … … 1169 1170 call VTb(VThallo) 1170 1171 c$OMP END MASTER 1172 1173 ! sponge layer 1174 if (callsponge) then 1175 call Register_SwapFieldHallo(ps,ps,ip1jmp1,1, 1176 & jj_Nb_dissip,1,1,Request_dissip) 1177 call Register_Hallo(ps,ip1jm,1,1,1,1,1,Request_Dissip) 1178 call SendRequest(Request_Dissip) 1179 c$OMP BARRIER 1180 call WaitRequest(Request_Dissip) 1181 c$OMP BARRIER 1182 c$OMP MASTER 1183 call VTe(VThallo) 1184 call VTb(VThallo) 1185 c$OMP END MASTER 1186 c$OMP BARRIER 1187 CALL sponge_p(ucov,vcov,teta,ps,dtdiss,mode_sponge) 1188 endif 1189 1171 1190 1172 1191 c$OMP BARRIER … … 1205 1224 c dissipation 1206 1225 ! ADAPTATION GCM POUR CP(T) 1207 ijb=ij_begin 1208 ije=ij_end 1209 call tpot2t_p(ije-ijb+1,llm,teta(ijb:ije,:),temp(ijb:ije,:), 1210 & pk(ijb:ije,:)) 1226 call tpot2t_glo_p(teta,temp,pk) 1211 1227 1212 1228 ! CALL FTRACE_REGION_BEGIN("dissip") … … 1266 1282 enddo 1267 1283 c$OMP END DO 1268 call t2tpot_p(ije-ijb+1,llm,temp(ijb:ije,:),ztetaec(ijb:ije,:), 1269 & pk(ijb:ije,:)) 1284 ! call t2tpot_p(ije-ijb+1,llm,temp(ijb:ije,:),ztetaec(ijb:ije,:), 1285 ! & pk(ijb:ije,:)) 1286 call t2tpot_glo_p(temp,ztetaec,pk) 1270 1287 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1271 1288 do l=1,llm … … 1576 1593 1577 1594 ! ADAPTATION GCM POUR CP(T) 1595 call tpot2t_glo_p(teta,temp,pk) 1578 1596 ijb=ij_begin 1579 1597 ije=ij_end 1580 call tpot2t_p(ije-ijb+1,llm,teta(ijb:ije,:),temp(ijb:ije,:),1581 & pk(ijb:ije,:))1582 1598 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1583 1599 do l=1,llm … … 1801 1817 1802 1818 ! ADAPTATION GCM POUR CP(T) 1819 call tpot2t_glo_p(teta,temp,pk) 1803 1820 ijb=ij_begin 1804 1821 ije=ij_end 1805 call tpot2t_p(ije-ijb+1,llm,teta(ijb:ije,:),temp(ijb:ije,:),1806 & pk(ijb:ije,:))1807 1822 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1808 1823 do l=1,llm -
trunk/LMDZ.COMMON/libf/dyn3dpar/vlspltqs_p.F
r109 r1017 25 25 USE mod_hallo 26 26 USE VAMPIR 27 use cpdet_mod, only: tpot2t_glo_p 27 28 IMPLICIT NONE 28 29 … … 97 98 ! ADAPTATION GCM POUR CP(T) 98 99 ! probablement a revoir... 99 call tpot2t_p(ip1jmp1,llm,teta,tempe,pk)100 100 ! call tpot2t_p(ip1jmp1,llm,teta,tempe,pk) 101 call tpot2t_glo_p(teta,tempe,pk) 101 102 102 103 call SetTag(MyRequest1,100)
Note: See TracChangeset
for help on using the changeset viewer.