SURFEX v8.1
General documentation of Surfex
facsim.F90
Go to the documentation of this file.
1 ! Oct-2012 P. Marguinaud 64b LFI
2 ! Jan-2011 P. Marguinaud Thread-safe FA
3 SUBROUTINE facsim_fort &
4 & (fa, krep, krang, pchame, pchams, &
5 & kpulas, kstron)
6 USE fa_mod, ONLY : fa_com, jpniil
7 USE parkind1, ONLY : jprb
8 USE yomhook , ONLY : lhook, dr_hook
10 IMPLICIT NONE
11 !****
12 ! Sous-programme INTERNE du logiciel de Fichiers ARPEGE:
13 ! traitement des champs en coefficients spectraux, preparatoire
14 ! au codage GRIB.
15 ! ( Coefficients Spectraux, Integration Methodique ! )
16 !**
17 ! Arguments : KREP (Sortie) ==> Code-reponse du sous-programme;
18 ! KRANG (Entree) ==> Rang de l'unite logique;
19 ! ( Tableau ) PCHAME (Entree) ==> Champ en coef. spectraux en entree;
20 ! ( Tableau ) PCHAMS (Sortie) ==> Champ en sortie, partie a coder;
21 ! KPULAS (Sortie) ==> Puissance de laplacien utilisee.
22 ! KSTRON (Entree) ==> Niveau de sous-troncature non
23 ! compactee.
24 !*
25 ! En mode multi-taches, il doit y avoir verrouillage du fichier
26 ! concerne avant l'appel au sous-programme.
27 !
28 ! Modifications
29 ! -------------
30 !
31 ! Juillet 1998, J. Clochard, SCEM/TTI/DAO:
32 !
33 ! -Reinitialisation de tableaux utilises pour le calcul iteratif
34 ! au changement de sens de balayage.
35 ! -Plus de "IF" pour le calcul d'extrema dans le cas ALADIN.
36 ! -Diagnostic plus precis en mode "mise au point".
37 !
38 ! Octobre 1998, J. Clochard, SCEM/TTI/DAO:
39 !
40 ! -Ajout de l'argument d'appel KSTRON pour compatibilite avec
41 ! evaluation dynamique (eventuelle) de la sous-troncature en
42 ! fonction de la troncature et du nombre de bits par valeur
43 ! compactee.
44 !
45 ! Avril 2004, D. Paradis, DSI/DEV:
46 !
47 ! -Initialisations des tableaux XLAPxDx et FLAP1Dx faites
48 ! en debut de routine par appel a FAIXLA et FAIFLA.
49 !
50 ! April 2009, F. Vana and NEC:
51 !
52 ! - OpenMP directives
53 !
54 ! March 2010: J. Masek - fix of precomputed optimal Laplacian power
55 ! F. Vana - simplification of IFC_SMAX,IFC_SMIN for
56 ! better performance
57 !
58 !
59 TYPE(fa_com) :: FA
60 INTEGER (KIND=JPLIKB) KREP, KRANG, KPULAS, KSTRON
61 !
62 REAL (KIND=JPDBLR) PCHAME (*), PCHAMS (*)
63 !
64 INTEGER (KIND=JPLIKB) IDIMNC, IRANGC, ITRONC, IPUFLA
65 INTEGER (KIND=JPLIKB) JN, J
66 INTEGER (KIND=JPLIKB) IMLIM, IOFF, IM, IMOD, INDLAP
67 INTEGER (KIND=JPLIKB) INDZ, ILONG, IDECAL, IMINI
68 INTEGER (KIND=JPLIKB) IMAXI, ILCHAM, INBITS, IMTRONC
69 INTEGER (KIND=JPLIKB) IMODPL, JIND
70 INTEGER (KIND=JPLIKB) IMEILL, JSENS, INDICE, IPUISS
71 INTEGER (KIND=JPLIKB) IPOSEX, JMODPL
72 INTEGER (KIND=JPLIKB) IPLUS, IMOINS, IPUISX, IPUIS2
73 INTEGER (KIND=JPLIKB) IRAPOR, IPUISR, INIMES
74 INTEGER (KIND=JPLIKB) INUMER, IDEB, IFIN, IXLOPA
75 INTEGER (KIND=JPLIKB) IPULAS (0:1)
76 !
77 REAL (KIND=JPDBLR) ZMIN, ZMAX, ZERRXI, ZERRXF, ZBIGVA
78 REAL (KIND=JPDBLR) ZMINI (fa%jpxtro,0:2),ZMAXI (fa%jpxtro,0:2)
79 REAL (KIND=JPDBLR) Z(4*fa%jpxtro*fa%jpxtro,2)
80 REAL (KIND=JPDBLR) ZECART (2,0:1)
81 !
82 LOGICAL LLARPE,LLMLAM
83 !
84 INTEGER (KIND=JPLIKB), EXTERNAL :: ISMIN_164 , ISMAX_164
85 !
86 CHARACTER(LEN=FA%JPXNOM) CLACTI
87 CHARACTER(LEN=FA%JPLMES) CLMESS
88 CHARACTER(LEN=FA%JPLSPX) CLNSPR
89 LOGICAL LLFATA
90 
91 !**
92 ! 1. - CONTROLES DES PARAMETRES D'APPEL, INITIALISATIONS.
93 !-----------------------------------------------------------------------
94 !
95 REAL(KIND=JPRB) :: ZHOOK_HANDLE
96 IF (lhook) CALL dr_hook('FACSIM_MT',0,zhook_handle)
97 clacti=''
98 idimnc=0
99 zbigva=huge(zbigva)
100 !
101 IF (krang.LE.0.OR.krang.GT.fa%JPNXFA) THEN
102  krep=-66
103  GOTO 1001
104 ENDIF
105 !
106 ! Si ce n'est pas encore fait, initialisation des tableaux XLAP... et FA%FLAP1D.
107 !
108 IF (fa%LIXLAP) THEN
109  CALL faixla_fort &
110 & (fa)
111  fa%LIXLAP = .false.
112 ENDIF
113 IF (fa%FICHIER(krang)%LIFLAP) THEN
114  CALL faifla_fort &
115 & (fa, krang)
116  fa%FICHIER(krang)%LIFLAP = .false.
117 ENDIF
118 !
119 irangc=fa%FICHIER(krang)%NUCADR
120 itronc=fa%CADRE(irangc)%MTRONC
121 ixlopa=fa%CADRE(irangc)%NXLOPA
122 llmlam=fa%CADRE(irangc)%LIMLAM
123 !
124 IF (llmlam) imtronc=fa%CADRE(irangc)%NOZPAR(2)
125 IF (itronc.LE.kstron) THEN
126  krep=-88
127  GOTO 1001
128 ELSEIF (llmlam.AND.imtronc.LE.kstron) THEN
129  krep=-88
130  GOTO 1001
131 ELSEIF (llmlam.AND.(imtronc.GT.3*itronc.OR. &
132 & itronc.GT.3*imtronc)) THEN
133 ! Il s'agit d'un garde-fou, modifiable (ne pas oublier FARCIS et FAPULA)
134  krep=-114
135  GOTO 1001
136 ELSE
137  krep=0
138 ENDIF
139 !
140 ipufla=fa%FICHIER(krang)%NPUFLA
141 imodpl=fa%FICHIER(krang)%NMFDPL
142 !
143 IF (llmlam) THEN
144  ilcham=fa%CADRE(irangc)%NSFLAM
145  idimnc=4*(1+itronc+imtronc+(kstron*(kstron-1))/2)
146 !DP IDIMNC=FA%NOZPAR(5,IRANGC)+4*KSTRON-1
147 ELSE
148  ilcham=(1+itronc)**2
149  idimnc=(1+kstron)**2
150 ENDIF
151 !**
152 ! 2. - DETERMINATION DE LA "MEILLEURE" PUISSANCE DE LAPLACIEN
153 ! POUR LA PARTIE DU CHAMP QUI SERA COMPACTEE EN "GRIB".
154 !-----------------------------------------------------------------------
155 !
156 IF (imodpl.EQ.0) THEN
157 !
158 ! On elimine le cas ou aucune modulation de la puissance
159 ! de laplacien n'est possible.
160 !
161  kpulas=ipufla
162  GOTO 300
163 ENDIF
164 !*
165 ! 2.1 - AMORCAGE DU PROCESSUS ITERATIF: CALCUL DES EXTREMA DU CHAMP
166 ! MULTIPLIE PAR LA PUISSANCE DE LAPLACIEN NOMINALE DU FICHIER
167 ! ( le traitement est decoupe nombre d'onde "n" par "n" )
168 !-----------------------------------------------------------------------
169 !
170 ! Calcul des extrema du champ d'entree (partie a compacter),
171 ! pour chaque nombre d'onde "n".
172 !
173 IF (llmlam) THEN
174  zmin=zbigva
175  zmax=-zbigva
176 !$OMP PARALLEL DO IF(FA%LOPENMP) &
177 !$OMP&PRIVATE(JN,IMLIM,IDEB,IFIN,JIND,IOFF,IM,IMOD,INDLAP,INDZ) &
178 !$OMP&REDUCTION(MAX:ZMAX) REDUCTION(MIN:ZMIN)
179  DO jn=1,itronc
180  imlim=kstron-jn
181  ideb=max(fa%CADRE(irangc)%NOZPAR(2*jn+3)+4*(1+imlim), &
182 & fa%CADRE(irangc)%NOZPAR(2*jn+3)+4)
183  ifin=fa%CADRE(irangc)%NOZPAR(2*jn+4)
184  DO jind=ideb,ifin
185  ioff=jind-fa%CADRE(irangc)%NOZPAR(2*jn+3)
186  im=ioff/4
187  imod=mod(ioff,4_jplikb )
188 !
189  indlap=((jn-1)*fa%JPXTRO)+im
190  indz=imod*fa%JPXTRO*fa%JPXTRO+indlap
191  z(indz,1)=pchame(jind)*fa%FICHIER(krang)%FLAP1DA(indlap)
192  zmax=max(zmax,z(indz,1))
193  zmin=min(zmin,z(indz,1))
194 !
195  ENDDO
196  ENDDO
197 !$OMP END PARALLEL DO
198 ELSE
199  DO jn=kstron+1,itronc
200  ilong=2*jn+1
201  idecal=jn**2
202  imaxi=ismax_164(ilong, pchame(idecal+1))
203  zmaxi(jn,0)=pchame(idecal+imaxi)
204  imini=ismin_164(ilong, pchame(idecal+1))
205  zmini(jn,0)=pchame(idecal+imini)
206  ENDDO
207 !
208 !
209 !
210  DO jn=kstron+1,itronc
211  zmaxi(jn,1)=zmaxi(jn,0)*fa%FICHIER(krang)%FLAP1D(jn)
212  zmini(jn,1)=zmini(jn,0)*fa%FICHIER(krang)%FLAP1D(jn)
213  ENDDO
214 !
215 !
216  imaxi=kstron+ismax_164 &
217 & (itronc-kstron,zmaxi(kstron+1,1))
218  imini=kstron+ismin_164 &
219 & (itronc-kstron,zmini(kstron+1,1))
220  zmin=zmini(imini,1)
221  zmax=zmaxi(imaxi,1)
222 ENDIF
223 !
224 inbits=fa%FICHIER(krang)%NBFCSP
225 llarpe=fa%FICHIER(krang)%NFGRIB.EQ.2
226 !
227 IF (zmax.LE.zmin) THEN
228 !
229 ! On elimine le cas trivial du champ constant,
230 ! eventuellement apres transformation...
231 !
232  kpulas=ipufla
233  GOTO 300
234 ENDIF
235 !
236 ! Calcul de l'erreur de compactage initiale.
237 !
238 CALL faxion_fort &
239 & (fa, pchame,ipufla,idimnc,ilcham,zmin, &
240 & zmax,inbits,llarpe,zerrxi,llmlam,fa%CADRE(irangc)%NOZPAR(1), &
241 & kstron,itronc,ixlopa)
242 imeill=0
243 zecart(2,imeill)=zerrxi
244 !*
245 ! 2.3 - BOUCLE SUR LES DEGRES DE MODULATION POSSIBLES,
246 ! PAR INCREMENTS DE PUISSANCE VALANT +1 (ESSAYE EN PREMIER)
247 ! PUIS (-1).
248 !-----------------------------------------------------------------------
249 !
250 DO 239 jsens=1,-1,-2
251 indice=(1-jsens)/2
252 ipuiss=ipufla
253 zecart(1,indice)=zerrxi
254 iposex=2
255 !
256 IF (jsens.EQ.-1) THEN
257 !
258 ! Compte-tenu du caractere "incremental" du calcul des extrema
259 ! pour des puissances successives, on doit reinitialiser lors du
260 ! changement de sens de balayage ZMAXI et ZMINI pour le cas ARPEGE
261 ! et Z pour le cas ALADIN.
262 !
263  IF (llmlam) THEN
264 !
265  zmin=zbigva
266  zmax=-zbigva
267 !$OMP PARALLEL DO IF(FA%LOPENMP) &
268 !$OMP&PRIVATE(JN,IMLIM,IDEB,IFIN,JIND,IOFF,IM,IMOD,INDLAP,INDZ)
269  DO jn=1,itronc
270  imlim=kstron-jn
271  ideb=max(fa%CADRE(irangc)%NOZPAR(2*jn+3)+4*(1+imlim), &
272 & fa%CADRE(irangc)%NOZPAR(2*jn+3)+4)
273  ifin=fa%CADRE(irangc)%NOZPAR(2*jn+4)
274  DO jind=ideb,ifin
275  ioff=jind-fa%CADRE(irangc)%NOZPAR(2*jn+3)
276  im=ioff/4
277  imod=mod(ioff,4_jplikb )
278 !
279  indlap=((jn-1)*fa%JPXTRO)+im
280  indz=imod*fa%JPXTRO*fa%JPXTRO+indlap
281  z(indz,1)=pchame(jind)*fa%FICHIER(krang)%FLAP1DA(indlap)
282 !
283  ENDDO
284  ENDDO
285 !$OMP END PARALLEL DO
286 !
287  ELSE
288 !
289  DO jn=kstron+1,itronc
290  zmaxi(jn,1)=zmaxi(jn,0)*fa%FICHIER(krang)%FLAP1D(jn)
291  zmini(jn,1)=zmini(jn,0)*fa%FICHIER(krang)%FLAP1D(jn)
292  ENDDO
293 !
294  ENDIF
295 !
296 ENDIF
297 !
298 DO jmodpl=1,imodpl
299 ipuiss=ipuiss+jsens
300 !
301 IF (llmlam) THEN
302  zmin=zbigva
303  zmax=-zbigva
304 !$OMP PARALLEL DO IF(FA%LOPENMP) &
305 !$OMP&PRIVATE(JN,IMLIM,IDEB,IFIN,JIND,IOFF,IM,IMOD,INDLAP,INDZ) &
306 !$OMP&REDUCTION(MAX:ZMAX) REDUCTION(MIN:ZMIN)
307  DO jn=1,itronc
308  imlim=kstron-jn
309  ideb=max(fa%CADRE(irangc)%NOZPAR(2*jn+3)+4*(1+imlim), &
310 & fa%CADRE(irangc)%NOZPAR(2*jn+3)+4)
311  ifin=fa%CADRE(irangc)%NOZPAR(2*jn+4)
312 !ocl novrec
313  DO jind=ideb,ifin
314  ioff=jind-fa%CADRE(irangc)%NOZPAR(2*jn+3)
315  im=ioff/4
316  imod=mod(ioff,4_jplikb )
317 !
318  indlap=((jn-1)*fa%JPXTRO)+im
319  indz=imod*fa%JPXTRO*fa%JPXTRO+((jn-1)*fa%JPXTRO)+im
320  z(indz,iposex)=z(indz,3-iposex)* &
321 & fa%XLAP1DA(indlap,indice)
322  zmax=max(zmax,z(indz,iposex))
323  zmin=min(zmin,z(indz,iposex))
324 !
325  ENDDO
326  ENDDO
327 !$OMP END PARALLEL DO
328 ELSE
329  DO jn=kstron+1,itronc
330  zmaxi(jn,iposex)=zmaxi(jn,3-iposex)*fa%XLAP1D(jn,indice)
331  zmini(jn,iposex)=zmini(jn,3-iposex)*fa%XLAP1D(jn,indice)
332  ENDDO
333 !
334  imaxi=kstron+ismax_164 &
335 & (itronc-kstron,zmaxi(kstron+1,iposex))
336  imini=kstron+ismin_164 &
337 & (itronc-kstron,zmini(kstron+1,iposex))
338  zmin=zmini(imini,iposex)
339  zmax=zmaxi(imaxi,iposex)
340 ENDIF
341 !
342 IF (zmax.LE.zmin) THEN
343 !
344 ! On elimine le cas du champ constant...
345 !
346  kpulas=ipuiss
347  GOTO 240
348 ENDIF
349 !
350 ! Calcul de la nouvelle erreur de compactage.
351 !
352 CALL faxion_fort &
353 & (fa, pchame,ipuiss,idimnc,ilcham,zmin,zmax,inbits, &
354 & llarpe,zecart(iposex,indice),llmlam, &
355 & fa%CADRE(irangc)%NOZPAR(1),kstron,itronc,ixlopa)
356 !
357 IF (zecart(iposex,indice).GE.zecart(3-iposex,indice)) THEN
358 !
359 ! Ecart pas meilleur que celui calcule precedemment, on s'arrete.
360 !
361  ipulas(indice)=ipuiss-jsens
362  GOTO 239
363 ENDIF
364 !
365 iposex=3-iposex
366 ENDDO
367 !
368 ! On a epuise les degres de modulation possibles... on plafonne.
369 ! (pour un sens de balayage)
370 !
371 ipulas(indice)=ipuiss
372 239 CONTINUE
373 !
374 ! Choix du meilleur resultat obtenu dans les 2 sens de balayage.
375 !
376 iplus=1+mod(ipulas(0)-ipufla,2_jplikb )
377 imoins=1+mod(ipufla-ipulas(1),2_jplikb )
378 !
379 IF (zecart(iplus,0).LE.zecart(imoins,1)) THEN
380  imeill=0
381 ELSE
382  imeill=1
383 ENDIF
384 !
385 kpulas=ipulas(imeill)
386 !
387 240 CONTINUE
388 !*
389 ! 2.4 - DIAGNOSTICS EVENTUELS, EN MODE MISE AU POINT SEULEMENT.
390 !-----------------------------------------------------------------------
391 !
392 IF (fa%LFAMOP) THEN
393  zerrxf=min(zecart(1,imeill),zecart(2,imeill))
394  WRITE (unit=fa%NULOUT,fmt=*) &
395 & 'FACSIM - Erreur Initiale (P=',ipufla,') ',zerrxi, &
396 & ', Finale (P=',kpulas,') ', zerrxf
397 ENDIF
398 !**
399 ! 3. - TRANSFORMATION DE LA PARTIE A COMPACTER DU CHAMP.
400 !-----------------------------------------------------------------------
401 !
402 300 CONTINUE
403 !
404 ! On fait des multiplications plutot que des divisions,
405 ! et on essaie d'eviter l'exponentiation.
406 !
407 IF (kpulas.EQ.0) THEN
408 !
409  IF (llmlam) THEN
410 !$OMP PARALLEL DO PRIVATE(JN,JIND) IF(FA%LOPENMP)
411  DO jn=0,itronc
412  DO jind=fa%CADRE(irangc)%NOZPAR(2*jn+3),fa%CADRE(irangc)%NOZPAR(2*jn+4)
413  pchams(jind)=pchame(jind)
414  ENDDO
415  ENDDO
416 !$OMP END PARALLEL DO
417  ELSE
418  DO j=idimnc+1,ilcham
419  pchams(j)=pchame(j)
420  ENDDO
421  ENDIF
422 !
423 ELSE
424  ipuisx=abs(kpulas)
425 !
426  IF (kpulas.GT.0) THEN
427  indice=0
428  ELSE
429  indice=1
430  ENDIF
431 !
432  IF (ipuisx.LE.fa%JPUILA) THEN
433 !
434  IF (llmlam) THEN
435 !$OMP PARALLEL DO PRIVATE(JN,JIND,IOFF,IM,INDLAP) IF(FA%LOPENMP)
436  DO jn=1,itronc
437  DO jind=fa%CADRE(irangc)%NOZPAR(2*jn+3)+4, &
438 & fa%CADRE(irangc)%NOZPAR(2*jn+4)
439  ioff=jind-fa%CADRE(irangc)%NOZPAR(2*jn+3)
440  im=ioff/4
441  indlap=((jn-1)*fa%JPXTRO)+im
442  pchams(jind)=pchame(jind)*fa%XLAP2DA(indlap,ipuisx,indice)
443  ENDDO
444  ENDDO
445 !$OMP END PARALLEL DO
446  ELSE
447  DO j=idimnc+1,ilcham
448  pchams(j)=pchame(j)*fa%XLAP2D(j,ipuisx,indice)
449  ENDDO
450  ENDIF
451 !
452  ELSEIF (ipuisx.LE.2*fa%JPUILA) THEN
453  ipuis2=ipuisx/2
454 !
455  IF (ipuisx.EQ.2*ipuis2) THEN
456 !
457  IF (llmlam) THEN
458 !$OMP PARALLEL DO PRIVATE(JN,JIND,IOFF,IM,INDLAP) IF(FA%LOPENMP)
459  DO jn=1,itronc
460  DO jind=fa%CADRE(irangc)%NOZPAR(2*jn+3)+4, &
461 & fa%CADRE(irangc)%NOZPAR(2*jn+4)
462  ioff=jind-fa%CADRE(irangc)%NOZPAR(2*jn+3)
463  im=ioff/4
464  indlap=((jn-1)*fa%JPXTRO)+im
465  pchams(jind)=pchame(jind)* &
466 & fa%XLAP2DA(indlap,ipuis2,indice)**2
467  ENDDO
468  ENDDO
469 !$OMP END PARALLEL DO
470  ELSE
471  DO j=idimnc+1,ilcham
472  pchams(j)=pchame(j)*fa%XLAP2D(j,ipuis2,indice)**2
473  ENDDO
474  ENDIF
475 !
476  ELSE
477 !
478  IF (llmlam) THEN
479 !$OMP PARALLEL DO PRIVATE(JN,JIND,IOFF,IM,INDLAP) IF(FA%LOPENMP)
480  DO jn=1,itronc
481  DO jind=fa%CADRE(irangc)%NOZPAR(2*jn+3)+4, &
482 & fa%CADRE(irangc)%NOZPAR(2*jn+4)
483  ioff=jind-fa%CADRE(irangc)%NOZPAR(2*jn+3)
484  im=ioff/4
485  indlap=((jn-1)*fa%JPXTRO)+im
486  pchams(jind)=pchame(jind)* &
487 & fa%XLAP2DA(indlap,fa%JPUILA,indice) &
488 & *fa%XLAP2DA(indlap,ipuisx-fa%JPUILA,indice)
489  ENDDO
490  ENDDO
491 !$OMP END PARALLEL DO
492 
493  ELSE
494  DO j=idimnc+1,ilcham
495  pchams(j)=pchame(j)*fa%XLAP2D(j,fa%JPUILA,indice) &
496 & *fa%XLAP2D(j,ipuisx-fa%JPUILA,indice)
497  ENDDO
498  ENDIF
499  ENDIF
500 !
501  ELSE
502  irapor=1+(ipuisx-1)/fa%JPUILA
503  ipuisr=ipuisx/irapor
504 !
505  IF (ipuisx.EQ.irapor*ipuisr) THEN
506 !
507  IF (llmlam) THEN
508 !$OMP PARALLEL DO PRIVATE(JN,JIND,IOFF,IM,INDLAP) IF(FA%LOPENMP)
509  DO jn=1,itronc
510  DO jind=fa%CADRE(irangc)%NOZPAR(2*jn+3)+4, &
511 & fa%CADRE(irangc)%NOZPAR(2*jn+4)
512  ioff=jind-fa%CADRE(irangc)%NOZPAR(2*jn+3)
513  im=ioff/4
514  indlap=((jn-1)*fa%JPXTRO)+im
515  pchams(jind)=pchame(jind)* &
516 & fa%XLAP2DA(indlap,ipuisr,indice)**irapor
517  ENDDO
518  ENDDO
519 !$OMP END PARALLEL DO
520  ELSE
521  DO j=idimnc+1,ilcham
522  pchams(j)=pchame(j)*fa%XLAP2D(j,ipuisr,indice)**irapor
523  ENDDO
524  ENDIF
525 !
526  ELSE
527 !
528  IF (llmlam) THEN
529 !$OMP PARALLEL DO PRIVATE(JN,JIND,IOFF,IM,INDLAP) IF(FA%LOPENMP)
530  DO jn=1,itronc
531  DO jind=fa%CADRE(irangc)%NOZPAR(2*jn+3)+4, &
532 & fa%CADRE(irangc)%NOZPAR(2*jn+4)
533  ioff=jind-fa%CADRE(irangc)%NOZPAR(2*jn+3)
534  im=ioff/4
535  indlap=((jn-1)*fa%JPXTRO)+im
536  pchams(jind)=pchame(jind)* &
537 & fa%XLAP2DA(indlap,fa%JPUILA,indice)**(irapor-1)* &
538 & fa%XLAP2DA(indlap,ipuisx-fa%JPUILA*(irapor-1),indice)
539  ENDDO
540  ENDDO
541 !$OMP END PARALLEL DO
542  ELSE
543  DO j=idimnc+1,ilcham
544  pchams(j)=pchame(j)* &
545 & fa%XLAP2D(j,fa%JPUILA,indice)**(irapor-1) &
546 & *fa%XLAP2D(j,ipuisx-fa%JPUILA*(irapor-1),indice)
547  ENDDO
548  ENDIF
549 !
550  ENDIF
551 !
552  ENDIF
553 !
554 ENDIF
555 !**
556 ! 10. - PHASE TERMINALE : MESSAGERIE EVENTUELLE,
557 ! VIA LE SOUS-PROGRAMME "FAIPAR" .
558 !-----------------------------------------------------------------------
559 !
560 1001 CONTINUE
561 
562 llfata=llmoer(krep,krang)
563 !
564 IF (fa%LFAMOP.OR.llfata) THEN
565  inimes=2
566  clnspr='FACSIM'
567  inumer=jpniil
568  WRITE (unit=clmess,fmt='(''KREP='',I4,'', KRANG='',I4, &
569 & '', PCHAME(1)='',G12.5,'', PCHAMS('',I3,'')='',G12.5, &
570 & '', KPULAS='',I3)') &
571 & krep,krang,pchame(1),idimnc+1,pchams(idimnc+1),kpulas
572  CALL faipar_fort &
573 & (fa, inumer,inimes,krep,.false.,clmess, &
574 & clnspr,clacti,.false.)
575 ENDIF
576 !
577 IF (lhook) CALL dr_hook('FACSIM_MT',1,zhook_handle)
578 
579 CONTAINS
580 
581 #include "facom2.llmoer.h"
582 
583 END SUBROUTINE
584 
585 
586 !INTF KREP OUT
587 !INTF KRANG IN
588 !INTF PCHAME IN DIMS=*
589 !INTF PCHAMS OUT DIMS=*
590 !INTF KPULAS OUT
591 !INTF KSTRON IN
subroutine facsim_fort(FA, KREP, KRANG, PCHAME, PCHAMS, KPULAS, KSTRON)
Definition: facsim.F90:6
subroutine faifla_fort(FA, KRANG)
Definition: faifla.F90:5
Definition: fa_mod.F90:1
integer, parameter jprb
Definition: parkind1.F90:32
subroutine faxion_fort(FA, PCHAME, KPUISS, KDIMNC, KLCHAM, PMIN, PMAX, KNBITS, LDARPE, PECART, LDMLAM, KNOZPA, KSTROF, KTRONC, KXLOPA)
Definition: faxion.F90:7
logical lhook
Definition: yomhook.F90:15
subroutine faixla_fort(FA)
Definition: faixla.F90:5
subroutine faipar_fort(FA, KNUMER, KNIMES, KCODE, LDFATA, CDMESS, CDNSPR, CDACTI, LDRLFI)
Definition: faipar.F90:6
integer(kind=jplikb), parameter jpniil
Definition: fa_mod.F90:31