Changeset 1046 for LMDZ4/trunk/libf/dyn3dpar
- Timestamp:
- Nov 6, 2008, 5:39:24 PM (16 years ago)
- Location:
- LMDZ4/trunk/libf/dyn3dpar
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ4/trunk/libf/dyn3dpar/conf_gcm.F
r1000 r1046 720 720 ok_strato=.FALSE. 721 721 CALL getin('ok_strato',ok_strato) 722 723 !Config Key = ok_gradsfile 724 !Config Desc = activation des sorties grads du guidage 725 !Config Def = n 726 !Config Help = active les sorties grads du guidage 727 728 ok_gradsfile = .FALSE. 729 CALL getin('ok_gradsfile',ok_gradsfile) 722 730 723 731 write(lunout,*)' #########################################' … … 757 765 write(lunout,*)' omp_chunk = ', omp_chunk 758 766 write(lunout,*)' ok_strato = ', ok_strato 767 write(lunout,*)' ok_gradsfile = ', ok_gradsfile 759 768 c 760 769 RETURN -
LMDZ4/trunk/libf/dyn3dpar/conf_guide.F
r774 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/dyn3dpar/guide.h
r774 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/dyn3dpar/guide_p.F
r985 r1046 79 79 real alpha_T(ip1jmp1),alpha_P(ip1jmp1) 80 80 real alpha_u(ip1jmp1),alpha_v(ip1jm) 81 real alpha_pcor(llm) 81 82 real dday_step,toto,reste,itau_test 82 83 INTEGER step_rea,count_no_rea … … 112 113 113 114 save alpha_T,alpha_q,alpha_u,alpha_v,alpha_P,itau_test 115 save alpha_pcor 114 116 save step_rea,count_no_rea 115 117 … … 159 161 160 162 if (mpi_rank==0) then 163 if (ok_gradsfile) then 161 164 call inigrads(igrads,iip1 162 165 s ,rlonv,180./pi,-180.,180.,jjp1,rlatu,-90.,90.,180./pi 163 166 s ,llm,presnivs,1. 164 167 s ,dtgrads,file,'dyn_zon ') 168 endif !ok_gradsfile 165 169 endif 166 170 … … 208 212 c physic=.false. 209 213 endif 210 214 c correction de rappel dans couche limite 215 c F.Codron 216 if (guide_BL) then 217 alpha_pcor(:)=1. 218 else 219 do l=1,llm 220 alpha_pcor(l)=(1.+tanh((0.85-presnivs(l)/preff)/0.05))/2. 221 enddo 222 endif 211 223 itau_test=1001 212 224 step_rea=1 … … 216 228 c lecture d'un fichier netcdf pour determiner le nombre de niveaux 217 229 IF (mpi_rank==0) THEN 218 230 if (guide_modele) then 231 if (ncidpl.eq.-99) ncidpl=NCOPN('apbp.nc',NCNOWRIT,rcod) 232 else 219 233 if (guide_u) then 220 234 if (ncidpl.eq.-99) ncidpl=NCOPN('u.nc',NCNOWRIT,rcod) … … 233 247 endif 234 248 c 249 endif 235 250 if (ncep) then 236 251 status=NF_INQ_DIMID(ncidpl,'LEVEL',rid) … … 239 254 endif 240 255 status=NF_INQ_DIMLEN(ncidpl,rid,nlev) 241 print *,'nlev', nlev 242 call ncclos(ncidpl,rcod) 243 244 ENDIF 245 256 print *,'nlev guide', nlev 257 call ncclos(ncidpl,rcod) 246 258 c Lecture du premier etat des reanalyses. 247 259 call Gather_Field(ps,ip1jmp1,1,0) … … 316 328 317 329 if (mpi_rank==0) then 330 if (ok_gradsfile) then 318 331 call wrgrads(igrads,1,aire ,'aire ','aire ' ) 319 332 call wrgrads(igrads,1,dxdys ,'dxdy ','dxdy ' ) … … 328 341 call wrgrads(igrads,llm,q,'Q ','Q ' ) 329 342 call wrgrads(igrads,llm,qsat,'QSAT ','QSAT ' ) 343 endif !(ok_gradsfile) then 330 344 endif 331 345 … … 357 371 do ij=ijb,ije 358 372 a=(1.-tau)*ucovrea1(ij,l)+tau*ucovrea2(ij,l) 359 ucov(ij,l)=(1.-alpha_u(ij))*ucov(ij,l)+alpha_u(ij)*a 373 ucov(ij,l)=(1.-alpha_u(ij))*ucov(ij,l)+alpha_u(ij) 374 $ *alpha_pcor(l)*a 360 375 if (first.and.ini_anal) ucov(ij,l)=a 361 376 enddo … … 368 383 do ij=ijb,ije 369 384 a=(1.-tau)*tetarea1(ij,l)+tau*tetarea2(ij,l) 370 teta(ij,l)=(1.-alpha_T(ij))*teta(ij,l)+alpha_T(ij)*a 385 teta(ij,l)=(1.-alpha_T(ij))*teta(ij,l)+alpha_T(ij) 386 $ *alpha_pcor(l)*a 371 387 if (first.and.ini_anal) teta(ij,l)=a 372 388 enddo … … 393 409 c hum relative en % -> hum specif 394 410 a=qsat(ij,l)*a*0.01 395 q(ij,l)=(1.-alpha_Q(ij))*q(ij,l)+alpha_Q(ij)*a 411 q(ij,l)=(1.-alpha_Q(ij))*q(ij,l)+alpha_Q(ij) 412 $ *alpha_pcor(l)*a 396 413 if (first.and.ini_anal) q(ij,l)=a 397 414 enddo … … 406 423 do ij=ijb,ije 407 424 a=(1.-tau)*vcovrea1(ij,l)+tau*vcovrea2(ij,l) 408 vcov(ij,l)=(1.-alpha_v(ij))*vcov(ij,l)+alpha_v(ij)*a 425 vcov(ij,l)=(1.-alpha_v(ij))*vcov(ij,l)+alpha_v(ij) 426 $ *alpha_pcor(l)*a 409 427 if (first.and.ini_anal) vcov(ij,l)=a 410 428 enddo … … 493 511 enddo 494 512 495 call dump2d(iip1,jjp1,dxdys,'DX2DY2 SCAL ')496 call dump2d(iip1,jjp1,dxdyu,'DX2DY2 U ')513 c call dump2d(iip1,jjp1,dxdys,'DX2DY2 SCAL ') 514 c call dump2d(iip1,jjp1,dxdyu,'DX2DY2 U ') 497 515 call dump2d(iip1,jjp1,dxdyv,'DX2DY2 v ') 498 516 … … 520 538 stop 521 539 endif 540 gamma=log(0.5)/log(gamma) 541 if (gamma4) then 542 gamma=min(gamma,4.) 543 endif 522 544 print*,'gamma=',gamma 523 gamma=log(0.5)/log(gamma)524 545 endif 525 546 endif -
LMDZ4/trunk/libf/dyn3dpar/logic.h
r1000 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/dyn3dpar/pres2lev.F
r774 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/dyn3dpar/read_reanalyse.F
r764 r1046 26 26 #include "guide.h" 27 27 28 29 28 c arguments 30 29 c --------- 31 30 integer nlevnc 32 integer timestep,mode ,l31 integer timestep,mode 33 32 34 33 real psi(iip1,jjp1) … … 37 36 real masse(iip1,jjp1,llm),pk(iip1,jjp1,llm) 38 37 39 40 38 c local 41 39 c ----- 42 40 integer ncidu,varidu,ncidv,varidv,ncidt,varidt,ncidps,varidps 43 41 integer ncidpl 44 integer varidpl,ncidQ,varidQ 45 save ncidpl,ncidu,varidu,ncidv,varidv,ncidt,varidt,ncidps,varidps 42 integer varidpl,ncidQ,varidQ,varidap,varidbp 43 save ncidu,varidu,ncidv,varidv,ncidt,varidt,ncidps,varidps 44 save ncidpl,varidap,varidbp 46 45 save varidpl,ncidQ,varidQ 47 46 … … 49 48 real*4 tnc(iip1,jjp1,nlevnc),psnc(iip1,jjp1) 50 49 real*4 Qnc(iip1,jjp1,nlevnc) 51 real*4 pl(nlevnc),presnc(iip1,jjp1,nlevnc) 50 real*4 plnc(iip1,jjp1,nlevnc) 51 real*4 apnc(nlevnc),bpnc(nlevnc) 52 52 53 53 integer start(4),count(4),status 54 integer i,j,l 54 55 55 56 real rcode … … 60 61 data first/.true./ 61 62 62 63 64 63 c ----------------------------------------------------------------- 65 64 c Initialisation de la lecture des fichiers … … 68 67 ncidpl=-99 69 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 70 79 71 80 c Vent zonal … … 82 91 varidv=NCVID(ncidv,'VWND',rcode) 83 92 print*,'ncidv,varidv',ncidv,varidv 84 if (ncidpl.eq.-99) ncidpl=ncidu 85 endif 86 93 if (ncidpl.eq.-99) ncidpl=ncidv 94 endif 87 95 88 96 c Temperature … … 91 99 varidt=NCVID(ncidt,'AIR',rcode) 92 100 print*,'ncidt,varidt',ncidt,varidt 93 if (ncidpl.eq.-99) ncidpl=ncid u94 endif 95 101 if (ncidpl.eq.-99) ncidpl=ncidt 102 endif 103 96 104 c Humidite 97 105 if (guide_Q) then … … 99 107 varidQ=NCVID(ncidQ,'RH',rcode) 100 108 print*,'ncidQ,varidQ',ncidQ,varidQ 101 if (ncidpl.eq.-99) ncidpl=ncid u102 endif 103 109 if (ncidpl.eq.-99) ncidpl=ncidQ 110 endif 111 104 112 c Pression de surface 105 if ( guide_P) then113 if ((guide_P).OR.(guide_modele)) then 106 114 ncidps=NCOPN('ps.nc',NCNOWRIT,rcode) 107 115 varidps=NCVID(ncidps,'SP',rcode) 108 116 print*,'ncidps,varidps',ncidps,varidps 109 117 endif 110 111 c Coordonnee vertcale 112 if (ncep) then 118 119 c Coordonnee verticale 120 if (.not.guide_modele) then 121 if (ncep) then 113 122 print*,'Vous etes entrain de lire des donnees NCEP' 114 123 varidpl=NCVID(ncidpl,'LEVEL',rcode) … … 116 125 print*,'Vous etes entrain de lire des donnees ECMWF' 117 126 varidpl=NCVID(ncidpl,'PRESSURE',rcode) 127 endif 128 print*,'ncidpl,varidpl',ncidpl,varidpl 118 129 endif 119 130 print*,'ncidu,varidpl',ncidu,varidpl 120 131 121 132 endif 122 123 133 print*,'ok1' 124 134 … … 126 136 c lecture des champs u, v, T, ps 127 137 c ----------------------------------------------------------------- 128 129 c niveaux de pression130 c -------------------131 132 print*,'WARNING!!! Il n y a pas de test de coherence'133 print*,'sur le nombre de niveaux verticaux dans le fichier nc'134 #ifdef NC_DOUBLE135 status=NF_GET_VARA_DOUBLE(ncidpl,varidpl,1,nlevnc,pl)136 #else137 status=NF_GET_VARA_REAL(ncidpl,varidpl,1,nlevnc,pl)138 #endif139 140 c passage en pascal141 pl(:)=100.*pl(:)142 c passage des presions sur une grille 3D143 do l=1,nlevnc144 presnc(:,:,l)=pl(l)145 enddo146 if(first) then147 do l=1,nlevnc148 print*,'PL(',l,')=',pl(l)149 enddo150 endif151 152 138 153 139 c dimensions pour les champs scalaires et le vent zonal … … 163 149 count(3)=nlevnc 164 150 count(4)=1 165 166 151 167 152 c mise a zero des tableaux … … 171 156 tnc(:,:,:)=0. 172 157 Qnc(:,:,:)=0. 158 plnc(:,:,:)=0. 173 159 174 160 c Vent zonal … … 183 169 status=NF_GET_VARA_REAL(ncidu,varidu,start,count,unc) 184 170 #endif 185 c call dump2d(iip1,jjp1,unc,'VENT NCEP ') 186 c call dump2d(iip1,40,unc(1,1,nlevnc),'VENT NCEP ') 187 print*,'WARNING!!! Correction bidon pour palier a un ' 188 print*,'probleme dans la creation des fichiers nc' 189 call correctbid(iim,jjp1*nlevnc,unc) 190 call dump2d(iip1,jjp1,unc,'UNC COUCHE 1 ') 171 print*,'WARNING!!! Correction bidon pour palier a un ' 172 print*,'probleme dans la creation des fichiers nc' 173 call correctbid(iim,jjp1*nlevnc,unc) 174 call dump2d(iip1,jjp1,unc,'UNC COUCHE 1 ') 191 175 endif 192 176 … … 242 226 c Pression de surface 243 227 c ------------------- 244 245 if ( guide_P)then228 psnc(:,:)=0. 229 if ((guide_P).OR.(guide_modele)) then 246 230 #ifdef NC_DOUBLE 247 231 status=NF_GET_VARA_DOUBLE(ncidps,varidps,start,count,psnc) … … 253 237 endif 254 238 255 239 c Calcul de la pression aux differents niveaux 240 c -------------------------------------------- 241 if (guide_modele) then 242 #ifdef NC_DOUBLE 243 status=NF_GET_VARA_DOUBLE(ncidpl,varidap,1,nlevnc,apnc) 244 status=NF_GET_VARA_DOUBLE(ncidpl,varidbp,1,nlevnc,bpnc) 245 #else 246 status=NF_GET_VARA_REAL(ncidpl,varidap,1,nlevnc,apnc) 247 status=NF_GET_VARA_REAL(ncidpl,varidbp,1,nlevnc,bpnc) 248 #endif 249 else 250 #ifdef NC_DOUBLE 251 status=NF_GET_VARA_DOUBLE(ncidpl,varidpl,1,nlevnc,apnc) 252 #else 253 status=NF_GET_VARA_REAL(ncidpl,varidpl,1,nlevnc,apnc) 254 #endif 255 c conversion en Pascals 256 apnc=apnc*100. 257 bpnc(:)=0. 258 endif 259 do i=1,iip1 260 do j=1,jjp1 261 do l=1,nlevnc 262 plnc(i,j,l)=apnc(l)+bpnc(l)*psnc(i,j) 263 enddo 264 enddo 265 enddo 266 if (first) then 267 print*,'Verification ordre niveaux verticaux' 268 print*,'LMDZ :' 269 do l=1,llm 270 print*,'PL(',l,')=',(ap(l)+ap(l+1))/2. 271 $ +psi(1,jjp1)*(bp(l)+bp(l+1))/2. 272 enddo 273 print*,'Fichiers guidage' 274 do l=1,nlevnc 275 print*,'PL(',l,')=',plnc(1,1,l) 276 enddo 277 if (guide_u) then 278 do l=1,nlevnc 279 print*,'U(',l,')=',unc(1,1,l) 280 enddo 281 endif 282 if (guide_T) then 283 do l=1,nlevnc 284 print*,'T(',l,')=',tnc(1,1,l) 285 enddo 286 endif 287 print *,'inversion de l''ordre: ok_invertp=',ok_invertp 288 endif 256 289 257 290 c ----------------------------------------------------------------- 258 291 c Interpollation verticale sur les niveaux modele 259 292 c ----------------------------------------------------------------- 260 call reanalyse2nat(nlevnc,psi,unc,vnc,tnc,Qnc,psnc,pl ,u,v,t,Q293 call reanalyse2nat(nlevnc,psi,unc,vnc,tnc,Qnc,psnc,plnc,u,v,t,Q 261 294 s ,ps,masse,pk) 262 295 … … 288 321 c=========================================================================== 289 322 subroutine reanalyse2nat(nlevnc,psi 290 s ,unc,vnc,tnc,qnc,psnc,pl ,u,v,t,q323 s ,unc,vnc,tnc,qnc,psnc,plnc,u,v,t,q 291 324 s ,ps,masse,pk) 292 325 c=========================================================================== … … 311 344 real t(iip1,jjp1,llm),ps(iip1,jjp1),q(iip1,jjp1,llm) 312 345 313 real pl (nlevnc)346 real plnc(iip1,jjp1,nlevnc) 314 347 real unc(iip1,jjp1,nlevnc),vnc(iip1,jjm,nlevnc) 315 348 real tnc(iip1,jjp1,nlevnc),psnc(iip1,jjp1) … … 396 429 397 430 c ----------------------------------------------------------------- 398 call pres2lev(unc,zu,nlevnc,llm,pl ,plunc,iip1,jjp1)399 call pres2lev(vnc,zv,nlevnc,llm,pl ,plvnc,iip1,jjm)400 call pres2lev(tnc,zt,nlevnc,llm,pl ,plsnc,iip1,jjp1)401 call pres2lev(qnc,zq,nlevnc,llm,pl ,plsnc,iip1,jjp1)431 call pres2lev(unc,zu,nlevnc,llm,plnc,plunc,iip1,jjp1,ok_invertp) 432 call pres2lev(vnc,zv,nlevnc,llm,plnc,plvnc,iip1,jjm,ok_invertp ) 433 call pres2lev(tnc,zt,nlevnc,llm,plnc,plsnc,iip1,jjp1,ok_invertp) 434 call pres2lev(qnc,zq,nlevnc,llm,plnc,plsnc,iip1,jjp1,ok_invertp) 402 435 403 436 c call dump2d(iip1,jjp1,ps,'PS ') … … 500 533 c Humidite relative -> specifique 501 534 c ------------------------------- 502 if ( 1.eq.0) then535 if (guide_hr) then 503 536 c FINALEMENT ON GUIDE EN HUMIDITE RELATIVE 504 537 print*,'calcul de unskap' … … 513 546 q(:,:,:)=qsat(:,:,:)*rh(:,:,:) 514 547 print*,'calcul de q OK' 515 548 call dump2d(iip1,jjp1,q,'HUMIDITE SPECIFIQUE COUCHE 1 ') 516 549 call dump2d(iip1,jjp1,pres,'PRESSION PREMIERE COUCHE ') 550 else 551 q(:,:,:)=rh(:,:,:) 552 print*,'calcul de q OK' 517 553 call dump2d(iip1,jjp1,q,'HUMIDITE SPECIFIQUE COUCHE 1 ') 518 endif 519 554 endif 520 555 521 556 return
Note: See TracChangeset
for help on using the changeset viewer.