Changeset 1046 for LMDZ4/trunk/libf/dyn3d
- Timestamp:
- Nov 6, 2008, 5:39:24 PM (16 years ago)
- Location:
- LMDZ4/trunk/libf/dyn3d
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ4/trunk/libf/dyn3d/conf_gcm.F
r999 r1046 682 682 ok_strato=.FALSE. 683 683 CALL getin('ok_strato',ok_strato) 684 685 !Config Key = ok_gradsfile 686 !Config Desc = activation des sorties grads du guidage 687 !Config Def = n 688 !Config Help = active les sorties grads du guidage 689 690 ok_gradsfile = .FALSE. 691 CALL getin('ok_gradsfile',ok_gradsfile) 684 692 685 693 write(lunout,*)' #########################################' … … 717 725 write(lunout,*)' config_inca = ', config_inca 718 726 write(lunout,*)' ok_strato = ', ok_strato 727 write(lunout,*)' ok_gradsfile = ', ok_gradsfile 719 728 c 720 729 RETURN -
LMDZ4/trunk/libf/dyn3d/conf_guide.F
r524 r1046 19 19 call getpar('online',1,online,'Index de controle du guide') 20 20 CALL getpar('ncep',.false.,ncep,'Coordonnee vert NCEP ou ECMWF') 21 CALL getpar('guide_modele',.false.,guide_modele, 22 $ 'guidage sur niveaux modele') 21 23 CALL getpar('ini_anal',.false.,ini_anal,'Initial = analyse') 24 CALL getpar('ok_invertp',.true.,ok_invertp,'niveaux p inverses') 22 25 23 26 CALL getpar('guide_u',.true.,guide_u,'guidage de u') … … 26 29 CALL getpar('guide_P',.true.,guide_P,'guidage de P') 27 30 CALL getpar('guide_Q',.true.,guide_Q,'guidage de Q') 31 CALL getpar('guide_hr',.true.,guide_hr,'guidage de Q par H.R') 32 CALL getpar('guide_BL',.true.,guide_BL,'guidage dans C.Lim') 28 33 29 34 c Constantes de rappel. Unite : fraction de jour … … 38 43 CALL getpar('tau_min_P',0.02,tau_min_P,'Cste de rappel min, P') 39 44 CALL getpar('tau_max_P', 10.,tau_max_P,'Cste de rappel max, P') 45 CALL getpar('gamma4',.false.,gamma4,'Zone sans rappel elargie') 40 46 41 47 c Latitude min et max pour le rappel. -
LMDZ4/trunk/libf/dyn3d/guide.F
r1042 r1046 78 78 real alpha_T(ip1jmp1),alpha_P(ip1jmp1) 79 79 real alpha_u(ip1jmp1),alpha_v(ip1jm) 80 real alpha_pcor(llm) 80 81 real dday_step,toto,reste,itau_test 81 82 INTEGER step_rea,count_no_rea … … 111 112 112 113 save alpha_T,alpha_q,alpha_u,alpha_v,alpha_P,itau_test 114 save alpha_pcor 113 115 save step_rea,count_no_rea 114 116 115 #define gradsfile116 #undef gradsfile117 118 #ifdef gradsfile119 117 character*10 file 120 118 integer igrads … … 122 120 save igrads,dtgrads 123 121 data igrads,dtgrads/2,100./ 124 #endif125 122 C----------------------------------------------------------------------- 126 123 c calcul de l'humidite saturante … … 160 157 161 158 162 #ifdef gradsfile 159 if (ok_gradsfile) then 163 160 file='guide' 164 161 call inigrads(igrads,iip1 … … 166 163 s ,llm,presnivs,1. 167 164 s ,dtgrads,file,'dyn_zon ') 168 #endif 165 endif !ok_gradsfile 169 166 170 167 print* … … 211 208 c physic=.false. 212 209 endif 213 210 c correction de rappel dans couche limite 211 c F.Codron 212 if (guide_BL) then 213 alpha_pcor(:)=1. 214 else 215 do l=1,llm 216 alpha_pcor(l)=(1.+tanh((0.85-presnivs(l)/preff)/0.05))/2. 217 enddo 218 endif 214 219 itau_test=1001 215 220 step_rea=1 … … 219 224 c itau_test montre si l'importation a deja ete faite au rang itau 220 225 c lecture d'un fichier netcdf pour determiner le nombre de niveaux 226 if (guide_modele) then 227 if (ncidpl.eq.-99) ncidpl=NCOPN('apbp.nc',NCNOWRIT,rcod) 228 else 221 229 if (guide_u) then 222 230 if (ncidpl.eq.-99) ncidpl=NCOPN('u.nc',NCNOWRIT,rcod) … … 235 243 endif 236 244 c 245 endif 237 246 if (ncep) then 238 247 status=NF_INQ_DIMID(ncidpl,'LEVEL',rid) … … 241 250 endif 242 251 status=NF_INQ_DIMLEN(ncidpl,rid,nlev) 243 print *,'nlev ', nlev244 252 print *,'nlev guide', nlev 253 call ncclos(ncidpl,rcod) 245 254 c Lecture du premier etat des reanalyses. 246 255 call read_reanalyse(1,ps … … 286 295 factt=dtvr*iperiod/daysec 287 296 ztau(:)=factt/max(alpha_T(:),1.e-10) 288 #ifdef gradsfile 297 if (ok_gradsfile) then 289 298 call wrgrads(igrads,1,aire ,'aire ','aire ' ) 290 299 call wrgrads(igrads,1,dxdys ,'dxdy ','dxdy ' ) … … 298 307 call wrgrads(igrads,llm,qrea2,'Qa ','Qa ' ) 299 308 call wrgrads(igrads,llm,q,'Q ','Q ' ) 300 301 309 call wrgrads(igrads,llm,qsat,'QSAT ','QSAT ' ) 302 #endif 310 endif !(ok_gradsfile) then 303 311 endif 304 312 else … … 325 333 do ij=1,ip1jmp1 326 334 a=(1.-tau)*ucovrea1(ij,l)+tau*ucovrea2(ij,l) 327 ucov(ij,l)=(1.-alpha_u(ij))*ucov(ij,l)+alpha_u(ij)*a 335 ucov(ij,l)=(1.-alpha_u(ij))*ucov(ij,l)+alpha_u(ij) 336 $ *alpha_pcor(l)*a 328 337 if (first.and.ini_anal) ucov(ij,l)=a 329 338 enddo … … 336 345 do ij=1,ip1jmp1 337 346 a=(1.-tau)*tetarea1(ij,l)+tau*tetarea2(ij,l) 338 teta(ij,l)=(1.-alpha_T(ij))*teta(ij,l)+alpha_T(ij)*a 347 teta(ij,l)=(1.-alpha_T(ij))*teta(ij,l)+alpha_T(ij) 348 $ *alpha_pcor(l)*a 339 349 if (first.and.ini_anal) teta(ij,l)=a 340 350 enddo … … 361 371 c hum relative en % -> hum specif 362 372 a=qsat(ij,l)*a*0.01 363 q(ij,l)=(1.-alpha_Q(ij))*q(ij,l)+alpha_Q(ij)*a 373 q(ij,l)=(1.-alpha_Q(ij))*q(ij,l)+alpha_Q(ij) 374 $ *alpha_pcor(l)*a 364 375 if (first.and.ini_anal) q(ij,l)=a 365 376 enddo … … 372 383 do ij=1,ip1jm 373 384 a=(1.-tau)*vcovrea1(ij,l)+tau*vcovrea2(ij,l) 374 vcov(ij,l)=(1.-alpha_v(ij))*vcov(ij,l)+alpha_v(ij)*a 385 vcov(ij,l)=(1.-alpha_v(ij))*vcov(ij,l)+alpha_v(ij) 386 $ *alpha_pcor(l)*a 375 387 if (first.and.ini_anal) vcov(ij,l)=a 376 388 enddo … … 486 498 stop 487 499 endif 500 gamma=log(0.5)/log(gamma) 501 if (gamma4) then 502 gamma=min(gamma,4.) 503 endif 488 504 print*,'gamma=',gamma 489 gamma=log(0.5)/log(gamma)490 505 endif 491 506 endif -
LMDZ4/trunk/libf/dyn3d/guide.h
r524 r1046 10 10 11 11 12 logical guide_u,guide_v,guide_T,guide_Q,guide_P 12 logical guide_u,guide_v,guide_T,guide_Q,guide_P,guide_modele 13 logical guide_BL,guide_hr,gamma4 13 14 14 15 real lat_min_guide,lat_max_guide … … 21 22 c data tau_min_P,tau_max_P/0.02,10./ 22 23 c 23 LOGICAL ncep,ini_anal 24 LOGICAL ncep,ini_anal,ok_invertp 24 25 integer online 25 26 … … 37 38 s ncep,ini_anal, 38 39 s online, 39 s guide_u,guide_v,guide_T,guide_Q,guide_P 40 s guide_u,guide_v,guide_T,guide_Q,guide_P, 41 s guide_modele,ok_invertp, 42 s guide_hr,guide_BL,gamma4 -
LMDZ4/trunk/libf/dyn3d/logic.h
r999 r1046 9 9 COMMON/logic/ purmats,iflag_phys,forward,leapf,apphys, & 10 10 & statcl,conser,apdiss,apdelq,saison,ecripar,fxyhypb,ysinus & 11 & ,read_start,ok_guide,ok_strato 11 & ,read_start,ok_guide,ok_strato,ok_gradsfile 12 12 13 13 LOGICAL purmats,forward,leapf,apphys,statcl,conser, & 14 14 & apdiss,apdelq,saison,ecripar,fxyhypb,ysinus & 15 & ,read_start,ok_guide,ok_strato 15 & ,read_start,ok_guide,ok_strato,ok_gradsfile 16 16 17 17 INTEGER iflag_phys -
LMDZ4/trunk/libf/dyn3d/pres2lev.F
r524 r1046 4 4 c****************************************************** 5 5 SUBROUTINE pres2lev(varo,varn,lmo,lmn,po,pn, 6 % ni,nj )6 % ni,nj,ok_invertp) 7 7 c 8 8 c interpolation lineaire pour passer … … 10 10 c les variables de GCM 11 11 c Francois Forget (01/1995) 12 c13 12 c MOdif remy roca 12/97 pour passer de pres2sig 13 c Modif F.Codron 07/08 po en 3D 14 14 c********************************************************** 15 15 … … 21 21 c ARGUMENTS 22 22 c """"""""" 23 23 LOGICAL ok_invertp 24 24 INTEGER lmo ! dimensions ancienne couches (input) 25 25 INTEGER lmn ! dimensions nouvelle couches (input) … … 29 29 parameter(lmomx=10000,lmnmx=10000) 30 30 31 real po( lmo)! niveau de pression en millibars32 real pn(ni,nj,lmn) ! niveau de pression en pascals31 real po(ni,nj,lmo)! niveau de pression ancienne grille 32 real pn(ni,nj,lmn) ! niveau de pression nouvelle grille 33 33 34 34 INTEGER i,j,Nhoriz,ni,nj ! nombre de point horizontale (input) … … 48 48 do i=1,ni 49 49 do j=1,nj 50 c a chaque point de grille correspond un nouveau sigma old 51 c qui vaut pres(l)/ps(i,j) 50 ! Inversion de l'ordre des niveaux verticaux 51 IF (ok_invertp) THEN 52 52 do lo=1,lmo 53 zpo(lo)=po( lmo+1-lo)53 zpo(lo)=po(i,j,lmo+1-lo) 54 54 zvaro(lo)=varo(i,j,lmo+1-lo) 55 55 enddo 56 56 ELSE 57 do lo=1,lmo 58 zpo(lo)=po(i,j,lo) 59 zvaro(lo)=varo(i,j,lo) 60 enddo 61 ENDIF 62 57 63 do ln=1,lmn 58 64 if (pn(i,j,ln).ge.zpo(1))then -
LMDZ4/trunk/libf/dyn3d/read_reanalyse.F
r618 r1046 29 29 c --------- 30 30 integer nlevnc 31 integer timestep,mode ,l31 integer timestep,mode 32 32 33 33 real psi(iip1,jjp1) … … 41 41 integer ncidu,varidu,ncidv,varidv,ncidt,varidt,ncidps,varidps 42 42 integer ncidpl 43 integer varidpl,ncidQ,varidQ 43 integer varidpl,ncidQ,varidQ,varidap,varidbp 44 44 save ncidu,varidu,ncidv,varidv,ncidt,varidt,ncidps,varidps 45 save ncidpl 45 save ncidpl,varidap,varidbp 46 46 save varidpl,ncidQ,varidQ 47 47 … … 49 49 real*4 tnc(iip1,jjp1,nlevnc),psnc(iip1,jjp1) 50 50 real*4 Qnc(iip1,jjp1,nlevnc) 51 real*4 pl(nlevnc) 51 real*4 plnc(iip1,jjp1,nlevnc) 52 real*4 apnc(nlevnc),bpnc(nlevnc) 52 53 53 54 integer start(4),count(4),status 55 integer i,j,l 54 56 55 57 real rcode … … 59 61 data first/.true./ 60 62 61 62 63 63 c ----------------------------------------------------------------- 64 64 c Initialisation de la lecture des fichiers … … 67 67 ncidpl=-99 68 68 print*,'Intitialisation de read reanalsye' 69 70 c Niveaux de pression si non constants 71 if (guide_modele) then 72 print *,'Vous êtes entrain de lire des données sur 73 . niveaux modèle' 74 ncidpl=NCOPN('apbp.nc',NCNOWRIT,rcode) 75 varidap=NCVID(ncidpl,'AP',rcode) 76 varidbp=NCVID(ncidpl,'BP',rcode) 77 print*,'ncidpl,varidap',ncidpl,varidap 78 endif 69 79 70 80 c Vent zonal … … 101 111 102 112 c Pression de surface 103 if ( guide_P) then113 if ((guide_P).OR.(guide_modele)) then 104 114 ncidps=NCOPN('ps.nc',NCNOWRIT,rcode) 105 115 varidps=NCVID(ncidps,'SP',rcode) … … 108 118 109 119 c Coordonnee verticale 110 if (ncep) then 120 if (.not.guide_modele) then 121 if (ncep) then 111 122 print*,'Vous etes entrain de lire des donnees NCEP' 112 123 varidpl=NCVID(ncidpl,'LEVEL',rcode) 113 else124 else 114 125 print*,'Vous etes entrain de lire des donnees ECMWF' 115 126 varidpl=NCVID(ncidpl,'PRESSURE',rcode) 116 endif 117 print*,'ncidu,varidpl',ncidu,varidpl 127 endif 128 print*,'ncidpl,varidpl',ncidpl,varidpl 129 endif 130 ! endif (first) 118 131 endif 119 132 print*,'ok1' 120 133 121 c Niveaux de pression122 print*,'WARNING!!! Il n y a pas de test de coherence'123 print*,'sur le nombre de niveaux verticaux dans le fichier nc'124 #ifdef NC_DOUBLE125 status=NF_GET_VARA_DOUBLE(ncidpl,varidpl,1,nlevnc,pl)126 #else127 status=NF_GET_VARA_REAL(ncidpl,varidpl,1,nlevnc,pl)128 #endif129 c passage en pascal130 pl(:)=100.*pl(:)131 if (first) then132 do l=1,nlevnc133 print*,'PL(',l,')=',pl(l)134 enddo135 endif136 134 137 135 c ----------------------------------------------------------------- … … 158 156 tnc(:,:,:)=0. 159 157 Qnc(:,:,:)=0. 158 plnc(:,:,:)=0. 160 159 161 160 c Vent zonal … … 169 168 status=NF_GET_VARA_REAL(ncidu,varidu,start,count,unc) 170 169 #endif 171 c call dump2d(iip1,jjp1,unc,'VENT NCEP ')172 c call dump2d(iip1,40,unc(1,1,nlevnc),'VENT NCEP ')173 170 print*,'WARNING!!! Correction bidon pour palier a un ' 174 171 print*,'probleme dans la creation des fichiers nc' … … 228 225 c Pression de surface 229 226 c ------------------- 230 231 if ( guide_P)then227 psnc(:,:)=0. 228 if ((guide_P).OR.(guide_modele)) then 232 229 #ifdef NC_DOUBLE 233 230 status=NF_GET_VARA_DOUBLE(ncidps,varidps,start,count,psnc) … … 239 236 endif 240 237 241 238 c Calcul de la pression aux differents niveaux 239 c -------------------------------------------- 240 if (guide_modele) then 241 #ifdef NC_DOUBLE 242 status=NF_GET_VARA_DOUBLE(ncidpl,varidap,1,nlevnc,apnc) 243 status=NF_GET_VARA_DOUBLE(ncidpl,varidbp,1,nlevnc,bpnc) 244 #else 245 status=NF_GET_VARA_REAL(ncidpl,varidap,1,nlevnc,apnc) 246 status=NF_GET_VARA_REAL(ncidpl,varidbp,1,nlevnc,bpnc) 247 #endif 248 else 249 #ifdef NC_DOUBLE 250 status=NF_GET_VARA_DOUBLE(ncidpl,varidpl,1,nlevnc,apnc) 251 #else 252 status=NF_GET_VARA_REAL(ncidpl,varidpl,1,nlevnc,apnc) 253 #endif 254 c conversion en Pascals 255 apnc=apnc*100. 256 bpnc(:)=0. 257 endif 258 do i=1,iip1 259 do j=1,jjp1 260 do l=1,nlevnc 261 plnc(i,j,l)=apnc(l)+bpnc(l)*psnc(i,j) 262 enddo 263 enddo 264 enddo 265 if (first) then 266 print*,'Verification ordre niveaux verticaux' 267 print*,'LMDZ :' 268 do l=1,llm 269 print*,'PL(',l,')=',(ap(l)+ap(l+1))/2. 270 $ +psi(1,jjp1)*(bp(l)+bp(l+1))/2. 271 enddo 272 print*,'Fichiers guidage' 273 do l=1,nlevnc 274 print*,'PL(',l,')=',plnc(1,1,l) 275 enddo 276 if (guide_u) then 277 do l=1,nlevnc 278 print*,'U(',l,')=',unc(1,1,l) 279 enddo 280 endif 281 if (guide_T) then 282 do l=1,nlevnc 283 print*,'T(',l,')=',tnc(1,1,l) 284 enddo 285 endif 286 print *,'inversion de l''ordre: ok_invertp=',ok_invertp 287 endif 242 288 243 289 c ----------------------------------------------------------------- 244 290 c Interpollation verticale sur les niveaux modele 245 291 c ----------------------------------------------------------------- 246 call reanalyse2nat(nlevnc,psi,unc,vnc,tnc,Qnc,psnc,pl ,u,v,t,Q292 call reanalyse2nat(nlevnc,psi,unc,vnc,tnc,Qnc,psnc,plnc,u,v,t,Q 247 293 s ,ps,masse,pk) 248 294 … … 274 320 c=========================================================================== 275 321 subroutine reanalyse2nat(nlevnc,psi 276 s ,unc,vnc,tnc,qnc,psnc,pl ,u,v,t,q322 s ,unc,vnc,tnc,qnc,psnc,plnc,u,v,t,q 277 323 s ,ps,masse,pk) 278 324 c=========================================================================== … … 297 343 real t(iip1,jjp1,llm),ps(iip1,jjp1),q(iip1,jjp1,llm) 298 344 299 real pl (nlevnc)345 real plnc(iip1,jjp1,nlevnc) 300 346 real unc(iip1,jjp1,nlevnc),vnc(iip1,jjm,nlevnc) 301 347 real tnc(iip1,jjp1,nlevnc),psnc(iip1,jjp1) … … 382 428 383 429 c ----------------------------------------------------------------- 384 call pres2lev(unc,zu,nlevnc,llm,pl ,plunc,iip1,jjp1)385 call pres2lev(vnc,zv,nlevnc,llm,pl ,plvnc,iip1,jjm)386 call pres2lev(tnc,zt,nlevnc,llm,pl ,plsnc,iip1,jjp1)387 call pres2lev(qnc,zq,nlevnc,llm,pl ,plsnc,iip1,jjp1)430 call pres2lev(unc,zu,nlevnc,llm,plnc,plunc,iip1,jjp1,ok_invertp) 431 call pres2lev(vnc,zv,nlevnc,llm,plnc,plvnc,iip1,jjm,ok_invertp ) 432 call pres2lev(tnc,zt,nlevnc,llm,plnc,plsnc,iip1,jjp1,ok_invertp) 433 call pres2lev(qnc,zq,nlevnc,llm,plnc,plsnc,iip1,jjp1,ok_invertp) 388 434 389 435 c call dump2d(iip1,jjp1,ps,'PS ') … … 486 532 c Humidite relative -> specifique 487 533 c ------------------------------- 488 if ( 1.eq.0) then534 if (guide_hr) then 489 535 c FINALEMENT ON GUIDE EN HUMIDITE RELATIVE 490 536 print*,'calcul de unskap' … … 499 545 q(:,:,:)=qsat(:,:,:)*rh(:,:,:) 500 546 print*,'calcul de q OK' 501 547 call dump2d(iip1,jjp1,q,'HUMIDITE SPECIFIQUE COUCHE 1 ') 502 548 call dump2d(iip1,jjp1,pres,'PRESSION PREMIERE COUCHE ') 549 else 550 q(:,:,:)=rh(:,:,:) 551 print*,'calcul de q OK' 503 552 call dump2d(iip1,jjp1,q,'HUMIDITE SPECIFIQUE COUCHE 1 ') 504 endif 505 553 endif 506 554 507 555 return
Note: See TracChangeset
for help on using the changeset viewer.