2 :
ht,hq,hw,hu,hv,hthturb,hqturb,
3 : Ts,imp_fcg,ts_fcg,Tp_fcg,Turb_fcg)
7 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
8 c cette routine permet d obtenir u_convg,
v_convg,
ht,hq et ainsi
de
9 c pouvoir calculer la convergence et le cisaillement dans la
physiq
10 ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
22 REAL hplaym(100) !
pression en hPa milieux des couches Meso-NH
32 c======================================================================
33 c methode: on va chercher les donnees du mesoNH
de meteo france, on y
34 c a acces a tout pas detemps grace a la routine rdgrads qui
35 c est une boucle lisant dans ces fichiers.
36 c Puis on interpole ces donnes
sur les 11 niveaux du
gcm et
38 c----------------------------------------------------------------------
41 c dt :pas
de temps du meso_NH (en secondes)
42 c----------------------------------------------------------------------
45 c----------------------------------------------------------------------
47 c itap :compteur
de la physique(le nombre
de ces pas est
48 c fixe dans la subroutine calcul_ini_gcm
de interpo
51 c ht :convergence horizontale
de temperature(
K/s)
52 c hq :
" " d humidite (kg/kg/s)
53 c hw :vitesse verticale moyenne (
m/s**2)
54 c hu :convergence horizontale d impulsion le
long de x
56 c hv : idem le
long de y.
57 c Ts : Temperature
de surface (
K)
58 c imp_fcg:
var. logical .eq. T si forcage en impulsion
59 c ts_fcg:
var. logical .eq. T si forcage en Ts present dans
fichier
60 c Tp_fcg:
var. logical .eq. T si forcage donne en Temp potentielle
61 c Turb_fcg:
var. logical .eq. T si forcage turbulent present dans
fichier
62 c----------------------------------------------------------------------
77 c----------------------------------------------------------------------
79 c est faite entre les pas
de temps before et after,
sur les variables
80 c definies
sur la grille du SCM; on atteint exactement les valeurs Meso
81 c aux milieux des pas
de temps Meso)
82 c time0 :date initiale en secondes
83 c time :temps associe a chaque pas du SCM
84 c pas :numero du pas du meso_NH (on lit en pas : le premier pas
85 c des donnees est duplique)
86 c pasprev :numero du pas
de lecture precedent
87 c htaft :advection horizontale
de temp. au pas
de temps after
88 c hqaft :
" " d humidite
"
89 c hwaft :vitesse verticalle moyenne au pas de temps after
90 c huaft,hvaft :advection horizontale d impulsion au pas de temps after
91 c tsaft : surface temperature 'after time step'
92 c htbef :idem htaft, mais pour le pas de temps before
95 c hubef,hvbef : idem huaft,hvaft, mais pour before
96 c tsbef : surface temperature 'before time step'
97 c----------------------------------------------------------------------
98 integer time0,pas,pasprev
99 save time0,pas,pasprev
101 real htaft(100),hqaft(100),hwaft(100),huaft(100),hvaft(100)
102 real hthturbaft(100),hqturbaft(100)
104 save htaft,hqaft,hwaft,huaft,hvaft,hthturbaft,hqturbaft
105 real htbef(100),hqbef(100),hwbef(100),hubef(100),hvbef(100)
106 real hthturbbef(100),hqturbbef(100)
108 save htbef,hqbef,hwbef,hubef,hvbef,hthturbbef,hqturbbef
114 c----------------------------------------------------------------------
115 c variables arguments de la subroutine rdgrads
116 c---------------------------------------------------------------------
117 integer icompt,icomp1 !compteurs de rdgrads
118 real z(100) ! altitude (grille Meso)
119 real ht_mes(100) !convergence horizontale de temperature
121 real hq_mes(100) !convergence horizontale d humidite
123 real hw_mes(100) !vitesse verticale moyenne
125 real hu_mes(100),hv_mes(100) !convergence horizontale d impulsion
127 real hthturb_mes(100) !tendance horizontale de T_pot, due aux
129 real hqturb_mes(100) !tendance horizontale d humidite, due aux
132 c---------------------------------------------------------------------
133 c variable argument de la subroutine copie
134 c---------------------------------------------------------------------
135 c SB real pplay(100) !pression en milieu de couche du gcm
136 c SB !argument de la physique
137 c---------------------------------------------------------------------
138 c variables destinees a la lecture du pas de temps du fichier de donnees
139 c---------------------------------------------------------------------
140 character*80 aaa,atemps,spaces,apasmax
142 c---------------------------------------------------------------------
143 c procedures appelees
144 external rdgrads !lire en iterant dans forcing.dat
145 c---------------------------------------------------------------------
146 print*,'le pas itap est:',itap
147 c*** on determine le pas du meso_NH correspondant au nouvel itap ***
148 c*** pour aller chercher les champs dans rdgrads ***
150 time=time0+itap*dtime
151 cc temps=int(time/dt+1)
152 cc pas=min(temps,pasmax)
153 temps = 1 + int((dt + 2*time)/(2*dt))
154 pas=min(temps,pasmax-1)
155 print*,'le pas Meso est:',pas
158 c===================================================================
160 c*** on remplit les champs before avec les champs after du pas ***
161 c*** precedent en format gcm ***
162 if(pas.gt.pasprev)then
169 hThTurbbef(i)=hThTurbaft(i)
170 hqTurbbef(i)=hqTurbaft(i)
176 IF (ts_fcg) icomp1 = icomp1 + 1
177 IF (imp_fcg) icomp1 = icomp1 + nblvlm*2
178 IF (Turb_fcg) icomp1 = icomp1 + nblvlm*2
180 print *, 'imp_fcg,ts_fcg,Turb_fcg,pas,nblvlm,icompt'
181 print *, imp_fcg,ts_fcg,Turb_fcg,pas,nblvlm,icompt
182 print*,'le pas pas est:',pas
183 c*** on va chercher les nouveaux champs after dans toga.dat ***
184 c*** champs en format meso_NH ***
185 open(99,FILE=file_fordat,FORM='UNFORMATTED',
186 . ACCESS='DIRECT',RECL=8)
187 call rdgrads(99,icompt,nblvlm,z,ht_mes,hq_mes,hw_mes
188 . ,hu_mes,hv_mes,hthturb_mes,hqturb_mes
189 . ,ts_fcg,ts_subr,imp_fcg,Turb_fcg)
193 c (le forcage est donne en temperature potentielle)
195 ht_mes(i) = ht_mes(i)*(hplaym(i)/1000.)**rkappa
200 hThTurb_mes(i) = hThTurb_mes(i)*(hplaym(i)/1000.)**rkappa
204 print*,'ht_mes ',(ht_mes(i),i=1,nblvlm)
205 print*,'hq_mes ',(hq_mes(i),i=1,nblvlm)
206 print*,'hw_mes ',(hw_mes(i),i=1,nblvlm)
208 print*,'hu_mes ',(hu_mes(i),i=1,nblvlm)
209 print*,'hv_mes ',(hv_mes(i),i=1,nblvlm)
212 print*,'hThTurb_mes ',(hThTurb_mes(i),i=1,nblvlm)
213 print*,'hqTurb_mes ',(hqTurb_mes(i),i=1,nblvlm)
215 IF (ts_fcg) print*,'ts_subr', ts_subr
216 c*** on interpole les champs meso_NH sur les niveaux de pression***
217 c*** gcm . on obtient le nouveau champ after ***
219 if (JM(k) .eq. 0) then
220 htaft(k)= ht_mes(jm(k)+1)
221 hqaft(k)= hq_mes(jm(k)+1)
222 hwaft(k)= hw_mes(jm(k)+1)
224 huaft(k)= hu_mes(jm(k)+1)
225 hvaft(k)= hv_mes(jm(k)+1)
228 hThTurbaft(k)= hThTurb_mes(jm(k)+1)
229 hqTurbaft(k)= hqTurb_mes(jm(k)+1)
232 htaft(k)=coef1(k)*ht_mes(jm(k))+coef2(k)*ht_mes(jm(k)+1)
233 hqaft(k)=coef1(k)*hq_mes(jm(k))+coef2(k)*hq_mes(jm(k)+1)
234 hwaft(k)=coef1(k)*hw_mes(jm(k))+coef2(k)*hw_mes(jm(k)+1)
236 huaft(k)=coef1(k)*hu_mes(jm(k))+coef2(k)*hu_mes(jm(k)+1)
237 hvaft(k)=coef1(k)*hv_mes(jm(k))+coef2(k)*hv_mes(jm(k)+1)
240 hThTurbaft(k)=coef1(k)*hThTurb_mes(jm(k))
241 $ +coef2(k)*hThTurb_mes(jm(k)+1)
242 hqTurbaft(k) =coef1(k)*hqTurb_mes(jm(k))
243 $ +coef2(k)*hqTurb_mes(jm(k)+1)
249 else ! pas.gt.pasprev
250 print*,'timebef est:',timebef
251 endif ! pas.gt.pasprev fin du bloc relatif au passage au pas
252 !de temps (meso) suivant
253 c*** si on atteint le pas max des donnees experimentales ,on ***
254 c*** on conserve les derniers champs calcules ***
255 if(temps.ge.pasmax)then
262 hThTurb(ll)=hThTurbaft(ll)
263 hqTurb(ll)=hqTurbaft(ll)
266 else ! temps.ge.pasmax
267 c*** on interpole sur les pas de temps de 10mn du gcm a partir ***
268 c** des pas de temps de 1h du meso_NH ***
270 ht(j)=((timeaft-time)*htbef(j)+(time-timebef)*htaft(j))/dt
271 hq(j)=((timeaft-time)*hqbef(j)+(time-timebef)*hqaft(j))/dt
272 hw(j)=((timeaft-time)*hwbef(j)+(time-timebef)*hwaft(j))/dt
274 hu(j)=((timeaft-time)*hubef(j)+(time-timebef)*huaft(j))/dt
275 hv(j)=((timeaft-time)*hvbef(j)+(time-timebef)*hvaft(j))/dt
278 hThTurb(j)=((timeaft-time)*hThTurbbef(j)
279 $ +(time-timebef)*hThTurbaft(j))/dt
280 hqTurb(j)= ((timeaft-time)*hqTurbbef(j)
281 $ +(time-timebef)*hqTurbaft(j))/dt
284 ts_subr = ((timeaft-time)*tsbef + (time-timebef)*tsaft)/dt
285 endif ! temps.ge.pasmax
287 print *,' time,timebef,timeaft',time,timebef,timeaft
288 print *,' ht,htbef,htaft,hthturb,hthturbbef,hthturbaft'
290 print *, j,ht(j),htbef(j),htaft(j),
291 $ hthturb(j),hthturbbef(j),hthturbaft(j)
293 print *,' hq,hqbef,hqaft,hqturb,hqturbbef,hqturbaft'
295 print *, j,hq(j),hqbef(j),hqaft(j),
296 $ hqturb(j),hqturbbef(j),hqturbaft(j)
299 c-------------------------------------------------------------------
301 IF (Ts_fcg) Ts = Ts_subr
304 c-----------------------------------------------------------------------
305 c on sort les champs de "convergence
" pour l instant initial 'in'
306 c ceci se passe au pas temps itap=0 de la physique
307 c-----------------------------------------------------------------------
308 entry get_uvd2(itap,dtime,file_forctl,file_fordat,
309 . ht,hq,hw,hu,hv,hThTurb,hqTurb,ts,
310 . imp_fcg,ts_fcg,Tp_fcg,Turb_fcg)
311 print*,'le pas itap est:',itap
313 c===================================================================
315 write(*,'(a)') 'OPEN '//file_forctl
316 open(97,FILE=file_forctl,FORM='FORMATTED')
320 read(97,1000,end=999) string
322 if (string .eq. 'TDEF') go to 50
325 c-------------------------------------------------------------------
326 c *** on lit le pas de temps dans le fichier de donnees ***
327 c *** "forcing.ctl
" et pasmax ***
328 c-------------------------------------------------------------------
334 call getsch(aaa,' ',' ',5,atemps,nch)
335 print*,'atemps est',atemps
336 atemps=atemps(1:nch-2)
337 print*,'atemps',atemps
340 print*,'le pas de temps dt',dt
341 call getsch(aaa,' ',' ',2,apasmax,nch)
342 apasmax=apasmax(1:nch)
345 print*,'pasmax est',pasmax
347 c------------------------------------------------------------------
348 c *** on lit le pas de temps initial de la simulation ***
349 c------------------------------------------------------------------
352 cc time0=dt*(pasprev-1)
358 write(*,'(a)') 'OPEN '//file_fordat
359 open(99,FILE=file_fordat,FORM='UNFORMATTED',
360 . ACCESS='DIRECT',RECL=8)
362 IF (ts_fcg) icomp1 = icomp1 + 1
363 IF (imp_fcg) icomp1 = icomp1 + nblvlm*2
364 IF (Turb_fcg) icomp1 = icomp1 + nblvlm*2
365 icompt = icomp1*(in-1)
366 call rdgrads(99,icompt,nblvlm,z,ht_mes,hq_mes,hw_mes
367 . ,hu_mes,hv_mes,hthturb_mes,hqturb_mes
368 . ,ts_fcg,ts_subr,imp_fcg,Turb_fcg)
369 print *, 'get_uvd : rdgrads ->'
372 c following commented out because we have temperature already in ARM case
373 c (otherwise this is the potential temperature )
374 c------------------------------------------------------------------------
377 ht_mes(i) = ht_mes(i)*(hplaym(i)/1000.)**rkappa
380 print*,'ht_mes ',(ht_mes(i),i=1,nblvlm)
381 print*,'hq_mes ',(hq_mes(i),i=1,nblvlm)
382 print*,'hw_mes ',(hw_mes(i),i=1,nblvlm)
384 print*,'hu_mes ',(hu_mes(i),i=1,nblvlm)
385 print*,'hv_mes ',(hv_mes(i),i=1,nblvlm)
389 print*,'hThTurb_mes ',(hThTurb_mes(i),i=1,nblvlm)
390 print*,'hqTurb ', (hqTurb_mes(i),i=1,nblvlm)
392 c----------------------------------------------------------------------
393 c on a obtenu des champs initiaux sur les niveaux du meso_NH
394 c on interpole sur les niveaux du gcm(niveau pression bien sur!)
395 c-----------------------------------------------------------------------
397 if (JM(k) .eq. 0) then
398 cFKC bug? ne faut il pas convertir tsol en tendance ????
399 cRT bug taken care of by removing the stuff
400 htaft(k)= ht_mes(jm(k)+1)
401 hqaft(k)= hq_mes(jm(k)+1)
402 hwaft(k)= hw_mes(jm(k)+1)
404 huaft(k)= hu_mes(jm(k)+1)
405 hvaft(k)= hv_mes(jm(k)+1)
408 hThTurbaft(k)= hThTurb_mes(jm(k)+1)
409 hqTurbaft(k)= hqTurb_mes(jm(k)+1)
412 htaft(k)=coef1(k)*ht_mes(jm(k))+coef2(k)*ht_mes(jm(k)+1)
413 hqaft(k)=coef1(k)*hq_mes(jm(k))+coef2(k)*hq_mes(jm(k)+1)
414 hwaft(k)=coef1(k)*hw_mes(jm(k))+coef2(k)*hw_mes(jm(k)+1)
416 huaft(k)=coef1(k)*hu_mes(jm(k))+coef2(k)*hu_mes(jm(k)+1)
417 hvaft(k)=coef1(k)*hv_mes(jm(k))+coef2(k)*hv_mes(jm(k)+1)
420 hThTurbaft(k)=coef1(k)*hThTurb_mes(jm(k))
421 $ +coef2(k)*hThTurb_mes(jm(k)+1)
422 hqTurbaft(k) =coef1(k)*hqTurb_mes(jm(k))
423 $ +coef2(k)*hqTurb_mes(jm(k)+1)
428 c valeurs initiales des champs de convergence
438 hThTurb(k)=hThTurbaft(k)
439 hqTurb(k) =hqTurbaft(k)
446 c-------------------------------------------------------------------
449 100 IF (Ts_fcg) Ts = Ts_subr
453 stop 'erreur lecture, file forcing.ctl'
456 SUBROUTINE advect_tvl(dtime,zt,zq,vu_f,vv_f,t_f,q_f
465 real dtime, fact, du, dv, cx, cy, alx, aly
466 real zt(klev), zq(klev,3)
467 : , vu_f(klev), vv_f(klev), t_f(klev), q_f(klev,3)
469 real d_t_adv(klev), d_q_adv(klev,3)
471 c Velocity of moving cell
472 data cx,cy /12., -2./
474 c Dimensions of moving cell
475 data alx,aly /100 000.,150 000./
478 du = abs(vu_f(k)-cx)/alx
479 dv = abs(vv_f(k)-cy)/aly
480 fact = dtime *(du+dv-du*dv*dtime)
481 d_t_adv(k) = fact * (t_f(k)-zt(k))
482 d_q_adv(k,1) = fact * (q_f(k,1)-zq(k,1))
483 d_q_adv(k,2) = fact * (q_f(k,2)-zq(k,2))
484 d_q_adv(k,3) = fact * (q_f(k,3)-zq(k,3))
490 SUBROUTINE copie(klevgcm,playgcm,psolgcm,file_forctl)
493 ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
494 c cette routine remplit les COMMON com1_phys_gcss et com2_phys_gcss.h
495 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
497 INTEGER klev !nombre de niveau de pression du GCM
498 REAL play(100) !pression en Pa au milieu de chaque couche GCM
500 REAL coef1(100) !coefficient d interpolation
501 REAL coef2(100) !coefficient d interpolation
503 INTEGER nblvlm !nombre de niveau de pression du mesoNH
504 REAL playm(100) !pression en Pa au milieu de chaque couche Meso-NH
505 REAL hplaym(100)!pression en hecto-Pa des milieux de couche Meso-NH
507 COMMON/com1_phys_gcss/klev,play,JM,coef1,coef2
508 COMMON/com2_phys_gcss/nblvlm,playm,hplaym
511 real playgcm(klevgcm) ! pression en milieu de couche du gcm
513 character*80 file_forctl
517 c---------------------------------------------------------------------
518 c pression au milieu des couches du gcm dans la physiq
519 c (SB: remplace le call conv_lipress_gcm(playgcm) )
520 c---------------------------------------------------------------------
524 print*,'la pression gcm est:',play(k)
527 c----------------------------------------------------------------------
528 c lecture du descripteur des donnees Meso-NH (forcing.ctl):
529 c -> nb niveaux du meso.NH (nblvlm) + pressions meso.NH
530 c (on remplit le COMMON com2_phys_gcss)
531 c----------------------------------------------------------------------
533 call mesolupbis(file_forctl)
535 print*,'la valeur de nblvlm est:',nblvlm
537 c----------------------------------------------------------------------
538 c etude de la correspondance entre les niveaux meso.NH et GCM;
539 c calcul des coefficients d interpolation coef1 et coef2
540 c (on remplit le COMMON com1_phys_gcss)
541 c----------------------------------------------------------------------
543 call corresbis(psolgcm)
545 c---------------------------------------------------------
546 c TEST sur le remplissage de com1_phys_gcss et com2_phys_gcss:
547 c---------------------------------------------------------
550 write(*,*) 'TESTS com1_phys_gcss et com2_phys_gcss dans copie.F'
551 write(*,*) '--------------------------------------'
552 write(*,*) 'GCM: nb niveaux:',klev,' et pression, coeffs:'
554 write(*,*) play(k), coef1(k), coef2(k)
556 write(*,*) 'MESO-NH: nb niveaux:',nblvlm,' et pression:'
558 write(*,*) playm(k), hplaym(k)
563 SUBROUTINE mesolupbis(file_forctl)
566 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
568 c Lecture descripteur des donnees MESO-NH (forcing.ctl):
569 c -------------------------------------------------------
571 c Cette subroutine lit dans le fichier de controle "essai.ctl
"
572 c et affiche le nombre de niveaux du Meso-NH ainsi que les valeurs
573 c des pressions en milieu de couche du Meso-NH (en Pa puis en hPa).
574 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
576 INTEGER nblvlm !nombre de niveau de pression du mesoNH
577 REAL playm(100) !pression en Pa milieu de chaque couche Meso-NH
578 REAL hplaym(100) !pression en hPa des milieux de couche Meso-NH
579 COMMON/com2_phys_gcss/nblvlm,playm,hplaym
581 INTEGER i,lu,k,mlz,mlzh,j
583 character*80 file_forctl
586 character*80 aaa,anblvl,spaces
590 open(lu,file=file_forctl,form='formatted')
593 read(lu,1000,end=999) a
594 if (a .eq. 'ZDEF') go to 100
598 print*,' DESCRIPTION DES 2 MODELES : '
604 call getsch(aaa,' ',' ',2,anblvl,nch)
605 read(anblvl,*) nblvlm
608 print*,'nbre de niveaux de pression Meso-NH :',nblvlm
610 print*,'pression en Pa de chaque couche du meso-NH :'
612 read(lu,*) (playm(mlz),mlz=1,nblvlm)
613 c Si la pression est en HPa, la multiplier par 100
614 if (playm(1) .lt. 10000.) then
616 playm(mlz) = playm(mlz)*100.
619 print*,(playm(mlz),mlz=1,nblvlm)
626 hplaym(mlzh)=playm(mlzh)/100.
629 print*,'pression en hPa de chaque couche du meso-NH: '
630 print*,(hplaym(mlzh),mlzh=1,nblvlm)
635 999 stop 'erreur lecture des niveaux pression des donnees'
638 SUBROUTINE rdgrads(itape,icount,nl,z,ht,hq,hw,hu,hv,hthtur,hqtur,
639 : ts_fcg,ts,imp_fcg,Turb_fcg)
641 INTEGER itape,icount,icomp, nl
642 real z(nl),ht(nl),hq(nl),hw(nl),hu(nl),hv(nl)
643 real hthtur(nl),hqtur(nl)
648 LOGICAL imp_fcg,ts_fcg,Turb_fcg
655 read(itape,rec=icomp)z(k)
656 print *,'icomp,k,z(k) ',icomp,k,z(k)
660 read(itape,rec=icomp)hT(k)
665 read(itape,rec=icomp)hQ(k)
671 read(itape,rec=icomp)hThTur(k)
675 read(itape,rec=icomp)hqTur(k)
678 print *,' apres lecture hthtur, hqtur'
684 read(itape,rec=icomp)hu(k)
688 read(itape,rec=icomp)hv(k)
695 read(itape,rec=icomp)hw(k)
700 read(itape,rec=icomp)ts
703 print *,' rdgrads ->'
708 SUBROUTINE corresbis(psol)
711 ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
712 c Cette subroutine calcule et affiche les valeurs des coefficients
713 c d interpolation qui serviront dans la formule d interpolation elle-
715 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
717 INTEGER klev !nombre de niveau de pression du GCM
718 REAL play(100) !pression en Pa au milieu de chaque couche GCM
720 REAL coef1(100) !coefficient d interpolation
721 REAL coef2(100) !coefficient d interpolation
723 INTEGER nblvlm !nombre de niveau de pression du mesoNH
724 REAL playm(100) !pression en Pa milieu de chaque couche Meso-NH
725 REAL hplaym(100)!pression en hPa des milieux de couche Meso-NH
727 COMMON/com1_phys_gcss/klev,play,JM,coef1,coef2
728 COMMON/com2_phys_gcss/nblvlm,playm,hplaym
737 if (val .gt. playm(1)) then
740 coef1(1)=(playm(mlz+1)-val)
741 * /(playm(mlz+1)-psol)
743 * /(playm(mlz+1)-psol)
744 else if (val .gt. playm(nblvlm)) then
746 if ( val .le. playm(mlz)
747 * .and. val .gt. playm(mlz+1))then
749 coef1(k)=(playm(mlz+1)-val)
750 * /(playm(mlz+1)-playm(mlz))
751 coef2(k)=(val-playm(mlz))
752 * /(playm(mlz+1)-playm(mlz))
762 cc if (play(klev) .le. playm(nblvlm)) then
765 cc coef1(klev)=(playm(mlz+1)-val)
766 cc * /(playm(mlz+1)-playm(mlz))
767 cc coef2(klev)=(val-playm(mlz))
768 cc * /(playm(mlz+1)-playm(mlz))
772 print*,' INTERPOLATION : '
774 print*,'correspondance de 9 niveaux du GCM sur les 53 du meso-NH:'
775 print*,(JM(k),k=1,klev)
776 print*,'correspondance de 9 niveaux du GCM sur les 53 du meso-NH:'
777 print*,(JM(k),k=1,klev)
779 print*,'valeurs du premier coef d"interpolation pour les 9 niveaux
781 print*,(coef1(k),k=1,klev)
783 print*,'valeurs du deuxieme coef d
"interpolation pour les 9 niveau
785 print*,(coef2(k),k=1,klev)
789 SUBROUTINE GETSCH(STR,DEL,TRM,NTH,SST,NCH)
790 C***************************************************************
797 C***************************************************************
798 C* Return in SST the character string found between the NTH-1 and NTH
799 C* occurence of the delimiter 'DEL' but before the terminator 'TRM' in
800 C* the input string 'STR'. If TRM=DEL then STR is considered unlimited.
801 C* NCH=Length of the string returned in SST or =-1 if NTH is <1 or if
802 C* NTH is greater than the number of delimiters in STR.
803 IMPLICIT INTEGER (A-Z)
804 CHARACTER STR*(*),DEL*1,TRM*1,SST*(*)
811 LENGTH=INDEX(STR,TRM)-1
812 IF(LENGTH.LT.0) LENGTH=LEN(STR)
814 C* Find beginning and end of the NTH DEL-limited substring in STR
817 IF(END.EQ.LENGTH) RETURN
819 END=BEG+INDEX(STR(BEG:LENGTH),DEL)-2
820 IF(END.EQ.BEG-2) END=LENGTH
821 C* PRINT *,'NTH,LENGTH,N,BEG,END=',NTH,LENGTH,N,BEG,END
824 IF(NCH.GT.0) SST=STR(BEG:END)
827 CHARACTER*(*) FUNCTION SPACES(STR,NSPACE)
829 C CERN PROGLIB# M433 SPACES .VERSION KERNFOR 4.14 860211
830 C ORIG. 6/05/86 M.GOOSSENS/DD
832 C- The function value SPACES returns the character string STR with
833 C- leading blanks removed and each occurence of one or more blanks
834 C- replaced by NSPACE blanks inside the string STR
840 IF (NSPACE.LT.0) NSPACE = 0
843 100 INONBL = INDEXC(STR(IBLANK:),' ')
844 IF (INONBL.EQ.0) THEN
845 SPACES(ISPACE:) = STR(IBLANK:)
848 INONBL = INONBL + IBLANK - 1
849 IBLANK = INDEX(STR(INONBL:),' ')
850 IF (IBLANK.EQ.0) THEN
851 SPACES(ISPACE:) = STR(INONBL:)
854 IBLANK = IBLANK + INONBL - 1
855 SPACES(ISPACE:) = STR(INONBL:IBLANK-1)
856 ISPACE = ISPACE + IBLANK - INONBL + NSPACE
857 IF (ISPACE.LE.LENSPA) GO TO 100
859 FUNCTION INDEXC(STR,SSTR)
861 C CERN PROGLIB# M433 INDEXC .VERSION KERNFOR 4.14 860211
862 C ORIG. 26/03/86 M.GOOSSENS/DD
864 C- Find the leftmost position where substring SSTR does not match
865 C- string STR scanning forward
867 CHARACTER*(*) STR,SSTR
872 DO 10 I=1,LENS-LENSS+1
873 IF (STR(I:I+LENSS-1).NE.SSTR) THEN