Changeset 2019 for LMDZ5/trunk/libf/phylmd/1Dconv.h
- Timestamp:
- Apr 16, 2014, 7:16:58 AM (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ5/trunk/libf/phylmd/1Dconv.h
r2017 r2019 1 subroutine get_uvd(itap,dtime,file_forctl,file_fordat, 2 : ht,hq,hw,hu,hv,hthturb,hqturb,3 : Ts,imp_fcg,ts_fcg,Tp_fcg,Turb_fcg)4 c 1 subroutine get_uvd(itap,dtime,file_forctl,file_fordat, & 2 & ht,hq,hw,hu,hv,hthturb,hqturb, & 3 & Ts,imp_fcg,ts_fcg,Tp_fcg,Turb_fcg) 4 ! 5 5 implicit none 6 6 7 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc8 ccette routine permet d obtenir u_convg,v_convg,ht,hq et ainsi de9 cpouvoir calculer la convergence et le cisaillement dans la physiq10 ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc7 !ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 8 ! cette routine permet d obtenir u_convg,v_convg,ht,hq et ainsi de 9 ! pouvoir calculer la convergence et le cisaillement dans la physiq 10 !cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 11 11 12 12 #include "YOMCST.h" … … 29 29 COMMON/com2_phys_gcss/playm,hplaym,nblvlm 30 30 31 c======================================================================32 cmethode: on va chercher les donnees du mesoNH de meteo france, on y33 ca acces a tout pas detemps grace a la routine rdgrads qui34 cest une boucle lisant dans ces fichiers.35 cPuis on interpole ces donnes sur les 11 niveaux du gcm et36 cet sur les pas de temps de ce meme gcm37 c----------------------------------------------------------------------38 cinput:39 cpasmax :nombre de pas de temps maximum du mesoNH40 cdt :pas de temps du meso_NH (en secondes)41 c----------------------------------------------------------------------31 !====================================================================== 32 ! methode: on va chercher les donnees du mesoNH de meteo france, on y 33 ! a acces a tout pas detemps grace a la routine rdgrads qui 34 ! est une boucle lisant dans ces fichiers. 35 ! Puis on interpole ces donnes sur les 11 niveaux du gcm et 36 ! et sur les pas de temps de ce meme gcm 37 !---------------------------------------------------------------------- 38 ! input: 39 ! pasmax :nombre de pas de temps maximum du mesoNH 40 ! dt :pas de temps du meso_NH (en secondes) 41 !---------------------------------------------------------------------- 42 42 integer pasmax,dt 43 43 save pasmax,dt 44 c----------------------------------------------------------------------45 carguments:46 citap :compteur de la physique(le nombre de ces pas est47 cfixe dans la subroutine calcul_ini_gcm de interpo48 c-lation49 cdtime :pas detemps du gcm (en secondes)50 cht :convergence horizontale de temperature(K/s)51 chq : " " d humidite (kg/kg/s)52 chw :vitesse verticale moyenne (m/s**2)53 chu :convergence horizontale d impulsion le long de x54 c(kg/(m^2 s^2)55 chv : idem le long de y.56 cTs : Temperature de surface (K)57 cimp_fcg: var. logical .eq. T si forcage en impulsion58 cts_fcg: var. logical .eq. T si forcage en Ts present dans fichier59 cTp_fcg: var. logical .eq. T si forcage donne en Temp potentielle60 cTurb_fcg: var. logical .eq. T si forcage turbulent present dans fichier61 c----------------------------------------------------------------------44 !---------------------------------------------------------------------- 45 ! arguments: 46 ! itap :compteur de la physique(le nombre de ces pas est 47 ! fixe dans la subroutine calcul_ini_gcm de interpo 48 ! -lation 49 ! dtime :pas detemps du gcm (en secondes) 50 ! ht :convergence horizontale de temperature(K/s) 51 ! hq : " " d humidite (kg/kg/s) 52 ! hw :vitesse verticale moyenne (m/s**2) 53 ! hu :convergence horizontale d impulsion le long de x 54 ! (kg/(m^2 s^2) 55 ! hv : idem le long de y. 56 ! Ts : Temperature de surface (K) 57 ! imp_fcg: var. logical .eq. T si forcage en impulsion 58 ! ts_fcg: var. logical .eq. T si forcage en Ts present dans fichier 59 ! Tp_fcg: var. logical .eq. T si forcage donne en Temp potentielle 60 ! Turb_fcg: var. logical .eq. T si forcage turbulent present dans fichier 61 !---------------------------------------------------------------------- 62 62 integer itap 63 63 real dtime … … 74 74 logical Tp_fcg 75 75 logical Turb_fcg 76 c----------------------------------------------------------------------77 cVariables internes de get_uvd (note : l interpolation temporelle78 cest faite entre les pas de temps before et after, sur les variables79 cdefinies sur la grille du SCM; on atteint exactement les valeurs Meso80 caux milieux des pas de temps Meso)81 ctime0 :date initiale en secondes82 ctime :temps associe a chaque pas du SCM83 cpas :numero du pas du meso_NH (on lit en pas : le premier pas84 cdes donnees est duplique)85 cpasprev :numero du pas de lecture precedent86 chtaft :advection horizontale de temp. au pas de temps after87 chqaft : " " d humidite "88 chwaft :vitesse verticalle moyenne au pas de temps after89 chuaft,hvaft :advection horizontale d impulsion au pas de temps after90 ctsaft : surface temperature 'after time step'91 chtbef :idem htaft, mais pour le pas de temps before92 chqbef :voir hqaft93 chwbef :voir hwaft94 chubef,hvbef : idem huaft,hvaft, mais pour before95 ctsbef : surface temperature 'before time step'96 c----------------------------------------------------------------------76 !---------------------------------------------------------------------- 77 ! Variables internes de get_uvd (note : l interpolation temporelle 78 ! est faite entre les pas de temps before et after, sur les variables 79 ! definies sur la grille du SCM; on atteint exactement les valeurs Meso 80 ! aux milieux des pas de temps Meso) 81 ! time0 :date initiale en secondes 82 ! time :temps associe a chaque pas du SCM 83 ! pas :numero du pas du meso_NH (on lit en pas : le premier pas 84 ! des donnees est duplique) 85 ! pasprev :numero du pas de lecture precedent 86 ! htaft :advection horizontale de temp. au pas de temps after 87 ! hqaft : " " d humidite " 88 ! hwaft :vitesse verticalle moyenne au pas de temps after 89 ! huaft,hvaft :advection horizontale d impulsion au pas de temps after 90 ! tsaft : surface temperature 'after time step' 91 ! htbef :idem htaft, mais pour le pas de temps before 92 ! hqbef :voir hqaft 93 ! hwbef :voir hwaft 94 ! hubef,hvbef : idem huaft,hvaft, mais pour before 95 ! tsbef : surface temperature 'before time step' 96 !---------------------------------------------------------------------- 97 97 integer time0,pas,pasprev 98 98 save time0,pas,pasprev … … 106 106 real Tsbef 107 107 save htbef,hqbef,hwbef,hubef,hvbef,hthturbbef,hqturbbef 108 c 108 ! 109 109 real timeaft,timebef 110 110 save timeaft,timebef 111 111 integer temps 112 112 character*4 string 113 c----------------------------------------------------------------------114 cvariables arguments de la subroutine rdgrads115 c---------------------------------------------------------------------113 !---------------------------------------------------------------------- 114 ! variables arguments de la subroutine rdgrads 115 !--------------------------------------------------------------------- 116 116 integer icompt,icomp1 !compteurs de rdgrads 117 117 real z(100) ! altitude (grille Meso) … … 128 128 real hqturb_mes(100) !tendance horizontale d humidite, due aux 129 129 !flux turbulents 130 c 131 c---------------------------------------------------------------------132 cvariable argument de la subroutine copie133 c---------------------------------------------------------------------134 cSB real pplay(100) !pression en milieu de couche du gcm135 cSB !argument de la physique136 c---------------------------------------------------------------------137 cvariables destinees a la lecture du pas de temps du fichier de donnees138 c---------------------------------------------------------------------130 ! 131 !--------------------------------------------------------------------- 132 ! variable argument de la subroutine copie 133 !--------------------------------------------------------------------- 134 ! SB real pplay(100) !pression en milieu de couche du gcm 135 ! SB !argument de la physique 136 !--------------------------------------------------------------------- 137 ! variables destinees a la lecture du pas de temps du fichier de donnees 138 !--------------------------------------------------------------------- 139 139 character*80 aaa,atemps,spaces,apasmax 140 140 integer nch,imn,ipa 141 c---------------------------------------------------------------------142 cprocedures appelees141 !--------------------------------------------------------------------- 142 ! procedures appelees 143 143 external rdgrads !lire en iterant dans forcing.dat 144 c---------------------------------------------------------------------144 !--------------------------------------------------------------------- 145 145 print*,'le pas itap est:',itap 146 c*** on determine le pas du meso_NH correspondant au nouvel itap ***147 c*** pour aller chercher les champs dans rdgrads ***148 c 146 !*** on determine le pas du meso_NH correspondant au nouvel itap *** 147 !*** pour aller chercher les champs dans rdgrads *** 148 ! 149 149 time=time0+itap*dtime 150 cc temps=int(time/dt+1)151 cc pas=min(temps,pasmax)150 !c temps=int(time/dt+1) 151 !c pas=min(temps,pasmax) 152 152 temps = 1 + int((dt + 2*time)/(2*dt)) 153 153 pas=min(temps,pasmax-1) 154 154 print*,'le pas Meso est:',pas 155 c 156 c 157 c===================================================================158 c 159 c*** on remplit les champs before avec les champs after du pas ***160 c*** precedent en format gcm ***155 ! 156 ! 157 !=================================================================== 158 ! 159 !*** on remplit les champs before avec les champs after du pas *** 160 !*** precedent en format gcm *** 161 161 if(pas.gt.pasprev)then 162 162 do i=1,klev … … 180 180 print *, imp_fcg,ts_fcg,Turb_fcg,pas,nblvlm,icompt 181 181 print*,'le pas pas est:',pas 182 c*** on va chercher les nouveaux champs after dans toga.dat ***183 c*** champs en format meso_NH ***184 open(99,FILE=file_fordat,FORM='UNFORMATTED', 185 .ACCESS='DIRECT',RECL=8)186 call rdgrads(99,icompt,nblvlm,z,ht_mes,hq_mes,hw_mes 187 . ,hu_mes,hv_mes,hthturb_mes,hqturb_mes188 .,ts_fcg,ts_subr,imp_fcg,Turb_fcg)189 c 182 !*** on va chercher les nouveaux champs after dans toga.dat *** 183 !*** champs en format meso_NH *** 184 open(99,FILE=file_fordat,FORM='UNFORMATTED', & 185 & ACCESS='DIRECT',RECL=8) 186 call rdgrads(99,icompt,nblvlm,z,ht_mes,hq_mes,hw_mes & 187 & ,hu_mes,hv_mes,hthturb_mes,hqturb_mes & 188 & ,ts_fcg,ts_subr,imp_fcg,Turb_fcg) 189 ! 190 190 191 191 if(Tp_fcg) then 192 c(le forcage est donne en temperature potentielle)192 ! (le forcage est donne en temperature potentielle) 193 193 do i = 1,nblvlm 194 194 ht_mes(i) = ht_mes(i)*(hplaym(i)/1000.)**rkappa … … 200 200 enddo 201 201 endif ! Turb_fcg 202 c 202 ! 203 203 print*,'ht_mes ',(ht_mes(i),i=1,nblvlm) 204 204 print*,'hq_mes ',(hq_mes(i),i=1,nblvlm) … … 213 213 endif 214 214 IF (ts_fcg) print*,'ts_subr', ts_subr 215 c*** on interpole les champs meso_NH sur les niveaux de pression***216 c*** gcm . on obtient le nouveau champ after ***215 !*** on interpole les champs meso_NH sur les niveaux de pression*** 216 !*** gcm . on obtient le nouveau champ after *** 217 217 do k=1,klev 218 218 if (JM(k) .eq. 0) then … … 237 237 endif ! imp_fcg 238 238 if(Turb_fcg) then 239 hThTurbaft(k)=coef1(k)*hThTurb_mes(jm(k)) 240 $+coef2(k)*hThTurb_mes(jm(k)+1)241 hqTurbaft(k) =coef1(k)*hqTurb_mes(jm(k)) 242 $+coef2(k)*hqTurb_mes(jm(k)+1)239 hThTurbaft(k)=coef1(k)*hThTurb_mes(jm(k)) & 240 & +coef2(k)*hThTurb_mes(jm(k)+1) 241 hqTurbaft(k) =coef1(k)*hqTurb_mes(jm(k)) & 242 & +coef2(k)*hqTurb_mes(jm(k)+1) 243 243 endif ! Turb_fcg 244 244 endif ! JM(k) .eq. 0 … … 250 250 endif ! pas.gt.pasprev fin du bloc relatif au passage au pas 251 251 !de temps (meso) suivant 252 c*** si on atteint le pas max des donnees experimentales ,on ***253 c*** on conserve les derniers champs calcules ***252 !*** si on atteint le pas max des donnees experimentales ,on *** 253 !*** on conserve les derniers champs calcules *** 254 254 if(temps.ge.pasmax)then 255 255 do ll=1,klev … … 264 264 ts_subr = tsaft 265 265 else ! temps.ge.pasmax 266 c*** on interpole sur les pas de temps de 10mn du gcm a partir ***267 c** des pas de temps de 1h du meso_NH ***266 !*** on interpole sur les pas de temps de 10mn du gcm a partir *** 267 !** des pas de temps de 1h du meso_NH *** 268 268 do j=1,klev 269 269 ht(j)=((timeaft-time)*htbef(j)+(time-timebef)*htaft(j))/dt … … 275 275 endif ! imp_fcg 276 276 if(Turb_fcg) then 277 hThTurb(j)=((timeaft-time)*hThTurbbef(j) 278 $+(time-timebef)*hThTurbaft(j))/dt279 hqTurb(j)= ((timeaft-time)*hqTurbbef(j) 280 $+(time-timebef)*hqTurbaft(j))/dt277 hThTurb(j)=((timeaft-time)*hThTurbbef(j) & 278 & +(time-timebef)*hThTurbaft(j))/dt 279 hqTurb(j)= ((timeaft-time)*hqTurbbef(j) & 280 & +(time-timebef)*hqTurbaft(j))/dt 281 281 endif ! Turb_fcg 282 282 enddo 283 283 ts_subr = ((timeaft-time)*tsbef + (time-timebef)*tsaft)/dt 284 284 endif ! temps.ge.pasmax 285 c 285 ! 286 286 print *,' time,timebef,timeaft',time,timebef,timeaft 287 287 print *,' ht,htbef,htaft,hthturb,hthturbbef,hthturbaft' 288 288 do j= 1,klev 289 print *, j,ht(j),htbef(j),htaft(j), 290 $hthturb(j),hthturbbef(j),hthturbaft(j)289 print *, j,ht(j),htbef(j),htaft(j), & 290 & hthturb(j),hthturbbef(j),hthturbaft(j) 291 291 enddo 292 292 print *,' hq,hqbef,hqaft,hqturb,hqturbbef,hqturbaft' 293 293 do j= 1,klev 294 print *, j,hq(j),hqbef(j),hqaft(j), 295 $hqturb(j),hqturbbef(j),hqturbaft(j)294 print *, j,hq(j),hqbef(j),hqaft(j), & 295 & hqturb(j),hqturbbef(j),hqturbaft(j) 296 296 enddo 297 c 298 c-------------------------------------------------------------------299 c 297 ! 298 !------------------------------------------------------------------- 299 ! 300 300 IF (Ts_fcg) Ts = Ts_subr 301 301 return 302 c 303 c-----------------------------------------------------------------------304 con sort les champs de "convergence" pour l instant initial 'in'305 cceci se passe au pas temps itap=0 de la physique306 c-----------------------------------------------------------------------307 entry get_uvd2(itap,dtime,file_forctl,file_fordat, 308 . ht,hq,hw,hu,hv,hThTurb,hqTurb,ts,309 .imp_fcg,ts_fcg,Tp_fcg,Turb_fcg)302 ! 303 !----------------------------------------------------------------------- 304 ! on sort les champs de "convergence" pour l instant initial 'in' 305 ! ceci se passe au pas temps itap=0 de la physique 306 !----------------------------------------------------------------------- 307 entry get_uvd2(itap,dtime,file_forctl,file_fordat, & 308 & ht,hq,hw,hu,hv,hThTurb,hqTurb,ts, & 309 & imp_fcg,ts_fcg,Tp_fcg,Turb_fcg) 310 310 print*,'le pas itap est:',itap 311 c 312 c===================================================================313 c 311 ! 312 !=================================================================== 313 ! 314 314 write(*,'(a)') 'OPEN '//file_forctl 315 315 open(97,FILE=file_forctl,FORM='FORMATTED') 316 c 317 c------------------316 ! 317 !------------------ 318 318 do i=1,1000 319 319 read(97,1000,end=999) string … … 322 322 enddo 323 323 50 backspace(97) 324 c-------------------------------------------------------------------325 c*** on lit le pas de temps dans le fichier de donnees ***326 c*** "forcing.ctl" et pasmax ***327 c-------------------------------------------------------------------324 !------------------------------------------------------------------- 325 ! *** on lit le pas de temps dans le fichier de donnees *** 326 ! *** "forcing.ctl" et pasmax *** 327 !------------------------------------------------------------------- 328 328 read(97,2000) aaa 329 329 2000 format (a80) … … 344 344 print*,'pasmax est',pasmax 345 345 CLOSE(97) 346 c------------------------------------------------------------------347 c*** on lit le pas de temps initial de la simulation ***348 c------------------------------------------------------------------346 !------------------------------------------------------------------ 347 ! *** on lit le pas de temps initial de la simulation *** 348 !------------------------------------------------------------------ 349 349 in=itap 350 cc pasprev=in351 cc time0=dt*(pasprev-1)350 !c pasprev=in 351 !c time0=dt*(pasprev-1) 352 352 pasprev=in-1 353 353 time0=dt*pasprev 354 C 354 ! 355 355 close(98) 356 c 356 ! 357 357 write(*,'(a)') 'OPEN '//file_fordat 358 open(99,FILE=file_fordat,FORM='UNFORMATTED', 359 .ACCESS='DIRECT',RECL=8)358 open(99,FILE=file_fordat,FORM='UNFORMATTED', & 359 & ACCESS='DIRECT',RECL=8) 360 360 icomp1 = nblvlm*4 361 361 IF (ts_fcg) icomp1 = icomp1 + 1 … … 363 363 IF (Turb_fcg) icomp1 = icomp1 + nblvlm*2 364 364 icompt = icomp1*(in-1) 365 call rdgrads(99,icompt,nblvlm,z,ht_mes,hq_mes,hw_mes 366 . ,hu_mes,hv_mes,hthturb_mes,hqturb_mes367 .,ts_fcg,ts_subr,imp_fcg,Turb_fcg)365 call rdgrads(99,icompt,nblvlm,z,ht_mes,hq_mes,hw_mes & 366 & ,hu_mes,hv_mes,hthturb_mes,hqturb_mes & 367 & ,ts_fcg,ts_subr,imp_fcg,Turb_fcg) 368 368 print *, 'get_uvd : rdgrads ->' 369 369 print *, tp_fcg 370 c 371 cfollowing commented out because we have temperature already in ARM case372 c(otherwise this is the potential temperature )373 c------------------------------------------------------------------------370 ! 371 ! following commented out because we have temperature already in ARM case 372 ! (otherwise this is the potential temperature ) 373 !------------------------------------------------------------------------ 374 374 if(Tp_fcg) then 375 375 do i = 1,nblvlm … … 389 389 print*,'hqTurb ', (hqTurb_mes(i),i=1,nblvlm) 390 390 endif ! Turb_fcg 391 c----------------------------------------------------------------------392 con a obtenu des champs initiaux sur les niveaux du meso_NH393 con interpole sur les niveaux du gcm(niveau pression bien sur!)394 c-----------------------------------------------------------------------391 !---------------------------------------------------------------------- 392 ! on a obtenu des champs initiaux sur les niveaux du meso_NH 393 ! on interpole sur les niveaux du gcm(niveau pression bien sur!) 394 !----------------------------------------------------------------------- 395 395 do k=1,klev 396 396 if (JM(k) .eq. 0) then 397 cFKC bug? ne faut il pas convertir tsol en tendance ????398 cRT bug taken care of by removing the stuff397 !FKC bug? ne faut il pas convertir tsol en tendance ???? 398 !RT bug taken care of by removing the stuff 399 399 htaft(k)= ht_mes(jm(k)+1) 400 400 hqaft(k)= hq_mes(jm(k)+1) … … 417 417 endif ! imp_fcg 418 418 if(Turb_fcg) then 419 hThTurbaft(k)=coef1(k)*hThTurb_mes(jm(k)) 420 $+coef2(k)*hThTurb_mes(jm(k)+1)421 hqTurbaft(k) =coef1(k)*hqTurb_mes(jm(k)) 422 $+coef2(k)*hqTurb_mes(jm(k)+1)419 hThTurbaft(k)=coef1(k)*hThTurb_mes(jm(k)) & 420 & +coef2(k)*hThTurb_mes(jm(k)+1) 421 hqTurbaft(k) =coef1(k)*hqTurb_mes(jm(k)) & 422 & +coef2(k)*hqTurb_mes(jm(k)+1) 423 423 endif ! Turb_fcg 424 424 endif ! JM(k) .eq. 0 425 425 enddo 426 426 tsaft = ts_subr 427 cvaleurs initiales des champs de convergence427 ! valeurs initiales des champs de convergence 428 428 do k=1,klev 429 429 ht(k)=htaft(k) … … 442 442 close(99) 443 443 close(98) 444 c 445 c-------------------------------------------------------------------446 c 447 c 444 ! 445 !------------------------------------------------------------------- 446 ! 447 ! 448 448 100 IF (Ts_fcg) Ts = Ts_subr 449 449 return 450 c 450 ! 451 451 999 continue 452 452 stop 'erreur lecture, file forcing.ctl' 453 453 end 454 454 455 SUBROUTINE advect_tvl(dtime,zt,zq,vu_f,vv_f,t_f,q_f 456 :,d_t_adv,d_q_adv)455 SUBROUTINE advect_tvl(dtime,zt,zq,vu_f,vv_f,t_f,q_f & 456 & ,d_t_adv,d_q_adv) 457 457 use dimphy 458 458 implicit none 459 459 460 460 #include "dimensions.h" 461 ccccc#include "dimphy.h"461 !cccc#include "dimphy.h" 462 462 463 463 integer k 464 464 real dtime, fact, du, dv, cx, cy, alx, aly 465 465 real zt(klev), zq(klev,3) 466 : ,vu_f(klev), vv_f(klev), t_f(klev), q_f(klev,3)466 real vu_f(klev), vv_f(klev), t_f(klev), q_f(klev,3) 467 467 468 468 real d_t_adv(klev), d_q_adv(klev,3) 469 469 470 cVelocity of moving cell470 ! Velocity of moving cell 471 471 data cx,cy /12., -2./ 472 472 473 cDimensions of moving cell474 data alx,aly /100 000.,150000./473 ! Dimensions of moving cell 474 data alx,aly /100000.,150000./ 475 475 476 476 do k = 1, klev … … 490 490 implicit none 491 491 492 ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc493 ccette routine remplit les COMMON com1_phys_gcss et com2_phys_gcss.h494 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc492 !cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 493 ! cette routine remplit les COMMON com1_phys_gcss et com2_phys_gcss.h 494 !ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 495 495 496 496 INTEGER klev !nombre de niveau de pression du GCM … … 514 514 klev = klevgcm 515 515 516 c---------------------------------------------------------------------517 cpression au milieu des couches du gcm dans la physiq518 c(SB: remplace le call conv_lipress_gcm(playgcm) )519 c---------------------------------------------------------------------516 !--------------------------------------------------------------------- 517 ! pression au milieu des couches du gcm dans la physiq 518 ! (SB: remplace le call conv_lipress_gcm(playgcm) ) 519 !--------------------------------------------------------------------- 520 520 521 521 do k = 1, klev … … 524 524 enddo 525 525 526 c----------------------------------------------------------------------527 clecture du descripteur des donnees Meso-NH (forcing.ctl):528 c-> nb niveaux du meso.NH (nblvlm) + pressions meso.NH529 c(on remplit le COMMON com2_phys_gcss)530 c----------------------------------------------------------------------526 !---------------------------------------------------------------------- 527 ! lecture du descripteur des donnees Meso-NH (forcing.ctl): 528 ! -> nb niveaux du meso.NH (nblvlm) + pressions meso.NH 529 ! (on remplit le COMMON com2_phys_gcss) 530 !---------------------------------------------------------------------- 531 531 532 532 call mesolupbis(file_forctl) … … 534 534 print*,'la valeur de nblvlm est:',nblvlm 535 535 536 c----------------------------------------------------------------------537 cetude de la correspondance entre les niveaux meso.NH et GCM;538 ccalcul des coefficients d interpolation coef1 et coef2539 c(on remplit le COMMON com1_phys_gcss)540 c----------------------------------------------------------------------536 !---------------------------------------------------------------------- 537 ! etude de la correspondance entre les niveaux meso.NH et GCM; 538 ! calcul des coefficients d interpolation coef1 et coef2 539 ! (on remplit le COMMON com1_phys_gcss) 540 !---------------------------------------------------------------------- 541 541 542 542 call corresbis(psolgcm) 543 543 544 c---------------------------------------------------------545 cTEST sur le remplissage de com1_phys_gcss et com2_phys_gcss:546 c---------------------------------------------------------544 !--------------------------------------------------------- 545 ! TEST sur le remplissage de com1_phys_gcss et com2_phys_gcss: 546 !--------------------------------------------------------- 547 547 548 548 write(*,*) ' ' … … 562 562 SUBROUTINE mesolupbis(file_forctl) 563 563 implicit none 564 c 565 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc566 c 567 cLecture descripteur des donnees MESO-NH (forcing.ctl):568 c-------------------------------------------------------569 c 570 cCette subroutine lit dans le fichier de controle "essai.ctl"571 cet affiche le nombre de niveaux du Meso-NH ainsi que les valeurs572 cdes pressions en milieu de couche du Meso-NH (en Pa puis en hPa).573 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc574 c 564 ! 565 !ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 566 ! 567 ! Lecture descripteur des donnees MESO-NH (forcing.ctl): 568 ! ------------------------------------------------------- 569 ! 570 ! Cette subroutine lit dans le fichier de controle "essai.ctl" 571 ! et affiche le nombre de niveaux du Meso-NH ainsi que les valeurs 572 ! des pressions en milieu de couche du Meso-NH (en Pa puis en hPa). 573 !ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 574 ! 575 575 INTEGER nblvlm !nombre de niveau de pression du mesoNH 576 576 REAL playm(100) !pression en Pa milieu de chaque couche Meso-NH … … 588 588 lu=9 589 589 open(lu,file=file_forctl,form='formatted') 590 c 590 ! 591 591 do i=1,1000 592 592 read(lu,1000,end=999) a 593 593 if (a .eq. 'ZDEF') go to 100 594 594 enddo 595 c 595 ! 596 596 100 backspace(lu) 597 597 print*,' DESCRIPTION DES 2 MODELES : ' 598 598 print*,' ' 599 c 599 ! 600 600 read(lu,2000) aaa 601 601 2000 format (a80) … … 604 604 read(anblvl,*) nblvlm 605 605 606 c 606 ! 607 607 print*,'nbre de niveaux de pression Meso-NH :',nblvlm 608 608 print*,' ' 609 609 print*,'pression en Pa de chaque couche du meso-NH :' 610 c 610 ! 611 611 read(lu,*) (playm(mlz),mlz=1,nblvlm) 612 cSi la pression est en HPa, la multiplier par 100612 ! Si la pression est en HPa, la multiplier par 100 613 613 if (playm(1) .lt. 10000.) then 614 614 do mlz = 1,nblvlm … … 617 617 endif 618 618 print*,(playm(mlz),mlz=1,nblvlm) 619 c 619 ! 620 620 1000 format (a4) 621 621 1001 format(5x,i2) 622 c 622 ! 623 623 print*,' ' 624 624 do mlzh=1,nblvlm 625 625 hplaym(mlzh)=playm(mlzh)/100. 626 626 enddo 627 c 627 ! 628 628 print*,'pression en hPa de chaque couche du meso-NH: ' 629 629 print*,(hplaym(mlzh),mlzh=1,nblvlm) 630 c 630 ! 631 631 close (lu) 632 632 return 633 c 633 ! 634 634 999 stop 'erreur lecture des niveaux pression des donnees' 635 635 end 636 636 637 SUBROUTINE rdgrads(itape,icount,nl,z,ht,hq,hw,hu,hv,hthtur,hqtur, 638 :ts_fcg,ts,imp_fcg,Turb_fcg)637 SUBROUTINE rdgrads(itape,icount,nl,z,ht,hq,hw,hu,hv,hthtur,hqtur, & 638 & ts_fcg,ts,imp_fcg,Turb_fcg) 639 639 IMPLICIT none 640 640 INTEGER itape,icount,icomp, nl … … 642 642 real hthtur(nl),hqtur(nl) 643 643 real ts 644 c 644 ! 645 645 INTEGER k 646 c 646 ! 647 647 LOGICAL imp_fcg,ts_fcg,Turb_fcg 648 c 648 ! 649 649 icomp = icount 650 c 651 c 650 ! 651 ! 652 652 do k=1,nl 653 653 icomp=icomp+1 … … 664 664 read(itape,rec=icomp)hQ(k) 665 665 enddo 666 c 666 ! 667 667 if(turb_fcg) then 668 668 do k=1,nl … … 676 676 endif 677 677 print *,' apres lecture hthtur, hqtur' 678 c 678 ! 679 679 if(imp_fcg) then 680 680 … … 689 689 690 690 endif 691 c 691 ! 692 692 do k=1,nl 693 693 icomp=icomp+1 694 694 read(itape,rec=icomp)hw(k) 695 695 enddo 696 c 696 ! 697 697 if(ts_fcg) then 698 698 icomp=icomp+1 699 699 read(itape,rec=icomp)ts 700 700 endif 701 c 701 ! 702 702 print *,' rdgrads ->' 703 703 … … 708 708 implicit none 709 709 710 ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc711 cCette subroutine calcule et affiche les valeurs des coefficients712 cd interpolation qui serviront dans la formule d interpolation elle-713 cmeme.714 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc710 !cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 711 ! Cette subroutine calcule et affiche les valeurs des coefficients 712 ! d interpolation qui serviront dans la formule d interpolation elle- 713 ! meme. 714 !ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 715 715 716 716 INTEGER klev !nombre de niveau de pression du GCM … … 737 737 mlz = 0 738 738 JM(1) = mlz 739 coef1(1)=(playm(mlz+1)-val) 740 * /(playm(mlz+1)-psol) 741 coef2(1)=(val-psol) 742 * /(playm(mlz+1)-psol) 739 coef1(1)=(playm(mlz+1)-val)/(playm(mlz+1)-psol) 740 coef2(1)=(val-psol)/(playm(mlz+1)-psol) 743 741 else if (val .gt. playm(nblvlm)) then 744 742 do mlz=1,nblvlm 745 if ( val .le. playm(mlz) 746 * .and. val .gt. playm(mlz+1))then 743 if ( val .le. playm(mlz).and. val .gt. playm(mlz+1))then 747 744 JM(k)=mlz 748 coef1(k)=(playm(mlz+1)-val) 749 * /(playm(mlz+1)-playm(mlz)) 750 coef2(k)=(val-playm(mlz)) 751 * /(playm(mlz+1)-playm(mlz)) 745 coef1(k)=(playm(mlz+1)-val)/(playm(mlz+1)-playm(mlz)) 746 coef2(k)=(val-playm(mlz))/(playm(mlz+1)-playm(mlz)) 752 747 endif 753 748 enddo … … 758 753 endif 759 754 enddo 760 c 761 cc if (play(klev) .le. playm(nblvlm)) then762 cc mlz=nblvlm-1763 cc JM(klev)=mlz764 cc coef1(klev)=(playm(mlz+1)-val)765 cc * /(playm(mlz+1)-playm(mlz))766 cc coef2(klev)=(val-playm(mlz))767 cc * /(playm(mlz+1)-playm(mlz))768 cc endif769 c 755 ! 756 !c if (play(klev) .le. playm(nblvlm)) then 757 !c mlz=nblvlm-1 758 !c JM(klev)=mlz 759 !c coef1(klev)=(playm(mlz+1)-val) 760 !c * /(playm(mlz+1)-playm(mlz)) 761 !c coef2(klev)=(val-playm(mlz)) 762 !c * /(playm(mlz+1)-playm(mlz)) 763 !c endif 764 ! 770 765 print*,' ' 771 766 print*,' INTERPOLATION : ' … … 776 771 print*,(JM(k),k=1,klev) 777 772 print*,' ' 778 print*,'valeurs du premier coef d"interpolation pour les 9 niveaux 779 *: ' 773 print*,'vals du premier coef d"interpolation pour les 9 niveaux: ' 780 774 print*,(coef1(k),k=1,klev) 781 775 print*,' ' 782 print*,'valeurs du deuxieme coef d"interpolation pour les 9 niveau 783 *x: ' 776 print*,'valeurs du deuxieme coef d"interpolation pour les 9 niveaux:' 784 777 print*,(coef2(k),k=1,klev) 785 c 778 ! 786 779 return 787 780 end 788 781 SUBROUTINE GETSCH(STR,DEL,TRM,NTH,SST,NCH) 789 C***************************************************************790 C* *791 C* *792 C* GETSCH *793 C* *794 C* *795 C* modified by : *796 C***************************************************************797 C* Return in SST the character string found between the NTH-1 and NTH798 C* occurence of the delimiter 'DEL' but before the terminator 'TRM' in799 C* the input string 'STR'. If TRM=DEL then STR is considered unlimited.800 C* NCH=Length of the string returned in SST or =-1 if NTH is <1 or if801 C* NTH is greater than the number of delimiters in STR.782 !*************************************************************** 783 !* * 784 !* * 785 !* GETSCH * 786 !* * 787 !* * 788 !* modified by : * 789 !*************************************************************** 790 !* Return in SST the character string found between the NTH-1 and NTH 791 !* occurence of the delimiter 'DEL' but before the terminator 'TRM' in 792 !* the input string 'STR'. If TRM=DEL then STR is considered unlimited. 793 !* NCH=Length of the string returned in SST or =-1 if NTH is <1 or if 794 !* NTH is greater than the number of delimiters in STR. 802 795 IMPLICIT INTEGER (A-Z) 803 796 CHARACTER STR*(*),DEL*1,TRM*1,SST*(*) … … 811 804 IF(LENGTH.LT.0) LENGTH=LEN(STR) 812 805 ENDIF 813 C* Find beginning and end of the NTH DEL-limited substring in STR806 !* Find beginning and end of the NTH DEL-limited substring in STR 814 807 END=-1 815 808 DO 1,N=1,NTH … … 818 811 END=BEG+INDEX(STR(BEG:LENGTH),DEL)-2 819 812 IF(END.EQ.BEG-2) END=LENGTH 820 C* PRINT *,'NTH,LENGTH,N,BEG,END=',NTH,LENGTH,N,BEG,END813 !* PRINT *,'NTH,LENGTH,N,BEG,END=',NTH,LENGTH,N,BEG,END 821 814 1 CONTINUE 822 815 NCH=END-BEG+1 … … 825 818 END 826 819 CHARACTER*(*) FUNCTION SPACES(STR,NSPACE) 827 C 828 CCERN PROGLIB# M433 SPACES .VERSION KERNFOR 4.14 860211829 CORIG. 6/05/86 M.GOOSSENS/DD830 C 831 C- The function value SPACES returns the character string STR with832 C- leading blanks removed and each occurence of one or more blanks833 C- replaced by NSPACE blanks inside the string STR834 C 820 ! 821 ! CERN PROGLIB# M433 SPACES .VERSION KERNFOR 4.14 860211 822 ! ORIG. 6/05/86 M.GOOSSENS/DD 823 ! 824 !- The function value SPACES returns the character string STR with 825 !- leading blanks removed and each occurence of one or more blanks 826 !- replaced by NSPACE blanks inside the string STR 827 ! 835 828 CHARACTER*(*) STR 836 C 829 ! 837 830 LENSPA = LEN(SPACES) 838 831 SPACES = ' ' … … 857 850 999 END 858 851 FUNCTION INDEXC(STR,SSTR) 859 C 860 CCERN PROGLIB# M433 INDEXC .VERSION KERNFOR 4.14 860211861 CORIG. 26/03/86 M.GOOSSENS/DD862 C 863 C- Find the leftmost position where substring SSTR does not match864 C- string STR scanning forward865 C 852 ! 853 ! CERN PROGLIB# M433 INDEXC .VERSION KERNFOR 4.14 860211 854 ! ORIG. 26/03/86 M.GOOSSENS/DD 855 ! 856 !- Find the leftmost position where substring SSTR does not match 857 !- string STR scanning forward 858 ! 866 859 CHARACTER*(*) STR,SSTR 867 C 860 ! 868 861 LENS = LEN(STR) 869 862 LENSS = LEN(SSTR) 870 C 863 ! 871 864 DO 10 I=1,LENS-LENSS+1 872 865 IF (STR(I:I+LENSS-1).NE.SSTR) THEN … … 876 869 10 CONTINUE 877 870 INDEXC = 0 878 C 871 ! 879 872 999 END
Note: See TracChangeset
for help on using the changeset viewer.