SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/LIB/XRD38/FA/mt/facsim_mt.F
Go to the documentation of this file.
00001 C Jan-2011 P. Marguinaud Thread-safe FA
00002       SUBROUTINE FACSIM_MT (FA,  KREP, KRANG, PCHAME, PCHAMS, 
00003      S                   KPULAS, KSTRON )
00004       USE FA_MOD, ONLY : FA_COM
00005       USE PARKIND1, ONLY : JPRB
00006       USE YOMHOOK , ONLY : LHOOK, DR_HOOK
00007 C****
00008 C        Sous-programme INTERNE du logiciel de Fichiers ARPEGE:
00009 C     traitement des champs en coefficients spectraux, preparatoire
00010 C     au codage GRIB.
00011 C              ( Coefficients Spectraux, Integration Methodique ! )
00012 C**
00013 C    Arguments : KREP   (Sortie) ==> Code-reponse du sous-programme;
00014 C                KRANG  (Entree) ==> Rang de l'unite logique;
00015 C    ( Tableau ) PCHAME (Entree) ==> Champ en coef. spectraux en entree;
00016 C    ( Tableau ) PCHAMS (Sortie) ==> Champ en sortie, partie a coder;
00017 C                KPULAS (Sortie) ==> Puissance de laplacien utilisee.
00018 C                KSTRON (Entree) ==> Niveau de sous-troncature non
00019 C                                    compactee.
00020 C*
00021 C       En mode multi-taches, il doit y avoir verrouillage du fichier
00022 C     concerne avant l'appel au sous-programme.
00023 C
00024 C     Modifications
00025 C     -------------
00026 C
00027 C  Juillet 1998, J. Clochard, SCEM/TTI/DAO:
00028 C
00029 C    -Reinitialisation de tableaux utilises pour le calcul iteratif
00030 C     au changement de sens de balayage.
00031 C    -Plus de "IF" pour le calcul d'extrema dans le cas ALADIN.
00032 C    -Diagnostic plus precis en mode "mise au point".
00033 C
00034 C  Octobre 1998, J. Clochard, SCEM/TTI/DAO:
00035 C
00036 C    -Ajout de l'argument d'appel KSTRON pour compatibilite avec
00037 C     evaluation dynamique (eventuelle) de la sous-troncature en
00038 C     fonction de la troncature et du nombre de bits par valeur
00039 C     compactee.
00040 C
00041 C  Avril   2004, D. Paradis,  DSI/DEV:
00042 C
00043 C    -Initialisations des tableaux XLAPxDx et FLAP1Dx faites
00044 C     en debut de routine par appel a FAIXLA et FAIFLA.
00045 C
00046 C  April  2009, F. Vana and NEC:
00047 C
00048 C    - OpenMP directives
00049 C
00050 C  March 2010: J. Masek - fix of precomputed optimal Laplacian power
00051 C              F. Vana  - simplification of IFC_SMAX,IFC_SMIN for
00052 C                              better performance
00053 #include "precision.h"
00054 C
00055 C
00056       TYPE(FA_COM) :: FA
00057       INTEGER KREP, KRANG, KPULAS, KSTRON
00058 C
00059       REAL (KIND=JPDBLR) PCHAME (*), PCHAMS (*)
00060 C
00061       INTEGER IDIMNC, IRANGC, ITRONC, IPUFLA, IDMOPL, JN, JM, J
00062       INTEGER IMLIM, IOFF, IM, IMOD, INDLAP, INDZ, ILONG, IDECAL, IMINI
00063       INTEGER IMAXI, ILCHAM, INBITS, IMTRONC, IMODPL, JIND
00064       INTEGER IMEILL, JSENS, INDICE, IPUISS, IPOSEX, JMODPL
00065       INTEGER IPLUS, IMOINS, IPUISX, IPUIS2, IRAPOR, IPUISR, INIMES
00066       INTEGER INUMER, IDEB, IFIN, IXLOPA
00067       INTEGER IPULAS (0:1)
00068 C
00069       REAL (KIND=JPDBLR) ZMIN, ZMAX, ZERRXI, ZERRXF, ZBIGVA
00070       REAL (KIND=JPDBLR) ZMINI (FA%JPXTRO,0:2),ZMAXI (FA%JPXTRO,0:2)
00071       REAL (KIND=JPDBLR) Z(4*FA%JPXTRO*FA%JPXTRO,2), ZECART (2,0:1)
00072 C
00073       LOGICAL LLARPE,LLMLAM
00074 C
00075       INTEGER ISMIN_1, ISMAX_1
00076       EXTERNAL ISMIN_1, ISMAX_1
00077 C
00078 #include "facom2.h"
00079 #include "facom_mt.h"
00080 C**
00081 C     1.  -  CONTROLES DES PARAMETRES D'APPEL, INITIALISATIONS.
00082 C-----------------------------------------------------------------------
00083 C
00084       REAL(KIND=JPRB) :: ZHOOK_HANDLE
00085       IF (LHOOK) CALL DR_HOOK('FACSIM_MT',0,ZHOOK_HANDLE)
00086       IDIMNC=0
00087       ZBIGVA=HUGE(ZBIGVA)
00088 C
00089       IF (KRANG.LE.0.OR.KRANG.GT.FA%JPNXFA) THEN
00090         KREP=-66
00091         GOTO 1001
00092       ENDIF
00093 C
00094 C Si ce n'est pas encore fait, initialisation des tableaux XLAP... et FA%FLAP1D.
00095 C
00096       IF (FA%LIXLAP) THEN
00097         CALL FAIXLA_MT (FA)
00098         FA%LIXLAP = .FALSE.
00099       ENDIF
00100       IF (FA%LIFLAP(KRANG)) THEN
00101         CALL FAIFLA_MT(FA, KRANG)
00102         FA%LIFLAP(KRANG) = .FALSE.
00103       ENDIF
00104 C
00105       IRANGC=FA%NUCADR(KRANG)
00106       ITRONC=FA%MTRONC(IRANGC)
00107       IXLOPA=FA%NXLOPA(IRANGC)
00108       LLMLAM=FA%LIMLAM(IRANGC)
00109 C
00110       IF (LLMLAM) IMTRONC=FA%NOZPAR(2,IRANGC)
00111       IF (ITRONC.LE.KSTRON) THEN
00112         KREP=-88
00113         GOTO 1001
00114       ELSEIF (LLMLAM.AND.IMTRONC.LE.KSTRON) THEN
00115         KREP=-88
00116         GOTO 1001
00117       ELSEIF (LLMLAM.AND.(IMTRONC.GT.3*ITRONC.OR.
00118      S    ITRONC.GT.3*IMTRONC)) THEN
00119 C Il s'agit d'un garde-fou, modifiable (ne pas oublier FARCIS et FAPULA)
00120         KREP=-114
00121         GOTO 1001
00122       ELSE       
00123         KREP=0
00124       ENDIF
00125 C
00126       IPUFLA=FA%NPUFLA(KRANG)
00127       IMODPL=FA%NMFDPL(KRANG)
00128 C
00129       IF (LLMLAM) THEN
00130          ILCHAM=FA%NSFLAM(IRANGC)
00131          IDIMNC=4*(1+ITRONC+IMTRONC+(KSTRON*(KSTRON-1))/2)
00132 CDP      IDIMNC=FA%NOZPAR(5,IRANGC)+4*KSTRON-1
00133       ELSE
00134          ILCHAM=(1+ITRONC)**2
00135          IDIMNC=(1+KSTRON)**2
00136       ENDIF
00137 C**
00138 C     2.  -  DETERMINATION DE LA "MEILLEURE" PUISSANCE DE LAPLACIEN
00139 C            POUR LA PARTIE DU CHAMP QUI SERA COMPACTEE EN "GRIB".
00140 C-----------------------------------------------------------------------
00141 C
00142       IF (IMODPL.EQ.0) THEN
00143 C
00144 C           On elimine le cas ou aucune modulation de la puissance
00145 C         de laplacien n'est possible.
00146 C
00147         KPULAS=IPUFLA
00148         GOTO 300
00149       ENDIF
00150 C*
00151 C     2.1 -  AMORCAGE DU PROCESSUS ITERATIF: CALCUL DES EXTREMA DU CHAMP
00152 C            MULTIPLIE PAR LA PUISSANCE DE LAPLACIEN NOMINALE DU FICHIER
00153 C            ( le traitement est decoupe nombre d'onde "n" par "n" )
00154 C-----------------------------------------------------------------------
00155 C
00156 C       Calcul des extrema du champ d'entree (partie a compacter),
00157 C     pour chaque nombre d'onde "n".
00158 C
00159       IF (LLMLAM) THEN
00160         ZMIN=ZBIGVA
00161         ZMAX=-ZBIGVA
00162 !$OMP PARALLEL DO IF(FA%LOPENMP)
00163 !$OMP&PRIVATE(JN,IMLIM,IDEB,IFIN,JIND,IOFF,IM,IMOD,INDLAP,INDZ)
00164 !$OMP&REDUCTION(MAX:ZMAX) REDUCTION(MIN:ZMIN)
00165         DO 2110 JN=1,ITRONC
00166          IMLIM=KSTRON-JN
00167          IDEB=MAX(FA%NOZPAR(2*JN+3,IRANGC)+4*(1+IMLIM),
00168      S          FA%NOZPAR(2*JN+3,IRANGC)+4)
00169          IFIN=FA%NOZPAR(2*JN+4,IRANGC)
00170         DO 2110 JIND=IDEB,IFIN
00171           IOFF=JIND-FA%NOZPAR(2*JN+3,IRANGC)
00172           IM=IOFF/4
00173           IMOD=MOD(IOFF,4)
00174 C
00175           INDLAP=((JN-1)*FA%JPXTRO)+IM
00176           INDZ=IMOD*FA%JPXTRO*FA%JPXTRO+INDLAP
00177           Z(INDZ,1)=PCHAME(JIND)*FA%FLAP1DA(INDLAP,KRANG)
00178           ZMAX=MAX (ZMAX,Z(INDZ,1))
00179           ZMIN=MIN (ZMIN,Z(INDZ,1))
00180 C
00181  2110   CONTINUE
00182 !$OMP END PARALLEL DO
00183       ELSE
00184         DO 211 JN=KSTRON+1,ITRONC
00185         ILONG=2*JN+1
00186         IDECAL=JN**2
00187         IMAXI=ISMAX_1 (ILONG,PCHAME(IDECAL+1))
00188         ZMAXI(JN,0)=PCHAME(IDECAL+IMAXI)
00189         IMINI=ISMIN_1 (ILONG,PCHAME(IDECAL+1))
00190         ZMINI(JN,0)=PCHAME(IDECAL+IMINI)
00191   211   CONTINUE
00192 C
00193 C
00194 C
00195         DO 212 JN=KSTRON+1,ITRONC
00196         ZMAXI(JN,1)=ZMAXI(JN,0)*FA%FLAP1D(JN,KRANG)
00197         ZMINI(JN,1)=ZMINI(JN,0)*FA%FLAP1D(JN,KRANG)
00198   212   CONTINUE
00199 C
00200 C
00201         IMAXI=KSTRON+ISMAX_1 (ITRONC-KSTRON,ZMAXI(KSTRON+1,1))
00202         IMINI=KSTRON+ISMIN_1 (ITRONC-KSTRON,ZMINI(KSTRON+1,1))
00203         ZMIN=ZMINI(IMINI,1)
00204         ZMAX=ZMAXI(IMAXI,1)
00205       ENDIF
00206 C
00207       INBITS=FA%NBFCSP(KRANG)
00208       LLARPE=FA%NFGRIB(KRANG).EQ.2
00209 C
00210       IF (ZMAX.LE.ZMIN) THEN
00211 C
00212 C           On elimine le cas trivial du champ constant,
00213 C         eventuellement apres transformation...
00214 C
00215         KPULAS=IPUFLA
00216         GOTO 300
00217       ENDIF
00218 C
00219 C        Calcul de l'erreur de compactage initiale.
00220 C
00221       CALL FAXION_MT (FA, PCHAME,IPUFLA,IDIMNC,ILCHAM,ZMIN,
00222      S             ZMAX,INBITS,LLARPE,ZERRXI,LLMLAM,FA%NOZPAR(1,IRANGC),
00223      S             KSTRON,ITRONC,IXLOPA)
00224       IMEILL=0
00225       ZECART(2,IMEILL)=ZERRXI
00226 C*
00227 C     2.3 -  BOUCLE SUR LES DEGRES DE MODULATION POSSIBLES,
00228 C            PAR INCREMENTS DE PUISSANCE VALANT +1 (ESSAYE EN PREMIER)
00229 C            PUIS (-1).
00230 C-----------------------------------------------------------------------
00231 C
00232       DO 239 JSENS=1,-1,-2
00233       INDICE=(1-JSENS)/2
00234       IPUISS=IPUFLA
00235       ZECART(1,INDICE)=ZERRXI
00236       IPOSEX=2
00237 C
00238       IF (JSENS.EQ.-1) THEN
00239 C
00240 C       Compte-tenu du caractere "incremental" du calcul des extrema
00241 C       pour des puissances successives, on doit reinitialiser lors du
00242 C       changement de sens de balayage ZMAXI et ZMINI pour le cas ARPEGE
00243 C       et Z pour le cas ALADIN.
00244 C
00245         IF (LLMLAM) THEN
00246 C
00247           ZMIN=ZBIGVA
00248           ZMAX=-ZBIGVA
00249 !$OMP PARALLEL DO IF(FA%LOPENMP)
00250 !$OMP&PRIVATE(JN,IMLIM,IDEB,IFIN,JIND,IOFF,IM,IMOD,INDLAP,INDZ)
00251           DO 2311 JN=1,ITRONC
00252           IMLIM=KSTRON-JN
00253           IDEB=MAX(FA%NOZPAR(2*JN+3,IRANGC)+4*(1+IMLIM),
00254      S           FA%NOZPAR(2*JN+3,IRANGC)+4)
00255           IFIN=FA%NOZPAR(2*JN+4,IRANGC)
00256           DO 2311 JIND=IDEB,IFIN
00257           IOFF=JIND-FA%NOZPAR(2*JN+3,IRANGC)
00258           IM=IOFF/4
00259           IMOD=MOD(IOFF,4)
00260 C
00261              INDLAP=((JN-1)*FA%JPXTRO)+IM
00262              INDZ=IMOD*FA%JPXTRO*FA%JPXTRO+INDLAP
00263              Z(INDZ,1)=PCHAME(JIND)*FA%FLAP1DA(INDLAP,KRANG)
00264 C
00265  2311     CONTINUE
00266 !$OMP END PARALLEL DO
00267 C
00268         ELSE
00269 C
00270           DO 2312 JN=KSTRON+1,ITRONC
00271           ZMAXI(JN,1)=ZMAXI(JN,0)*FA%FLAP1D(JN,KRANG)
00272           ZMINI(JN,1)=ZMINI(JN,0)*FA%FLAP1D(JN,KRANG)
00273  2312     CONTINUE
00274 C
00275         ENDIF
00276 C
00277       ENDIF
00278 C
00279       DO 238 JMODPL=1,IMODPL
00280       IPUISS=IPUISS+JSENS
00281 C
00282       IF (LLMLAM) THEN
00283         ZMIN=ZBIGVA
00284         ZMAX=-ZBIGVA
00285 !$OMP PARALLEL DO IF(FA%LOPENMP)
00286 !$OMP&PRIVATE(JN,IMLIM,IDEB,IFIN,JIND,IOFF,IM,IMOD,INDLAP,INDZ)
00287 !$OMP&REDUCTION(MAX:ZMAX) REDUCTION(MIN:ZMIN)
00288         DO 2310 JN=1,ITRONC
00289         IMLIM=KSTRON-JN
00290         IDEB=MAX(FA%NOZPAR(2*JN+3,IRANGC)+4*(1+IMLIM),
00291      S         FA%NOZPAR(2*JN+3,IRANGC)+4)
00292         IFIN=FA%NOZPAR(2*JN+4,IRANGC)
00293 !ocl novrec
00294         DO 2313 JIND=IDEB,IFIN
00295         IOFF=JIND-FA%NOZPAR(2*JN+3,IRANGC)
00296         IM=IOFF/4
00297         IMOD=MOD(IOFF,4)
00298 C
00299            INDLAP=((JN-1)*FA%JPXTRO)+IM
00300            INDZ=IMOD*FA%JPXTRO*FA%JPXTRO+INDLAP
00301            Z(INDZ,IPOSEX)=Z(INDZ,3-IPOSEX)*
00302      S     FA%XLAP1DA(INDLAP,INDICE)
00303            ZMAX=MAX (ZMAX,Z(INDZ,IPOSEX))
00304            ZMIN=MIN (ZMIN,Z(INDZ,IPOSEX))
00305 C
00306  2313   CONTINUE
00307  2310   CONTINUE
00308 !$OMP END PARALLEL DO
00309       ELSE 
00310         DO 231 JN=KSTRON+1,ITRONC
00311         ZMAXI(JN,IPOSEX)=ZMAXI(JN,3-IPOSEX)*FA%XLAP1D(JN,INDICE)
00312         ZMINI(JN,IPOSEX)=ZMINI(JN,3-IPOSEX)*FA%XLAP1D(JN,INDICE)
00313   231   CONTINUE
00314 C
00315         IMAXI=KSTRON+ISMAX_1 (ITRONC-KSTRON,ZMAXI(KSTRON+1,IPOSEX))
00316         IMINI=KSTRON+ISMIN_1 (ITRONC-KSTRON,ZMINI(KSTRON+1,IPOSEX))
00317         ZMIN=ZMINI(IMINI,IPOSEX)
00318         ZMAX=ZMAXI(IMAXI,IPOSEX)
00319       ENDIF
00320 C
00321       IF (ZMAX.LE.ZMIN) THEN
00322 C
00323 C           On elimine le cas du champ constant...
00324 C
00325         KPULAS=IPUISS
00326         GOTO 240
00327       ENDIF
00328 C
00329 C        Calcul de la nouvelle erreur de compactage.
00330 C
00331       CALL FAXION_MT (FA, PCHAME,IPUISS,IDIMNC,ILCHAM,ZMIN,ZMAX,INBITS,
00332      S             LLARPE,ZECART(IPOSEX,INDICE),LLMLAM,
00333      S             FA%NOZPAR(1,IRANGC),KSTRON,ITRONC,IXLOPA)
00334 C
00335       IF (ZECART(IPOSEX,INDICE).GE.ZECART(3-IPOSEX,INDICE)) THEN
00336 C
00337 C        Ecart pas meilleur que celui calcule precedemment, on s'arrete.
00338 C
00339         IPULAS(INDICE)=IPUISS-JSENS
00340         GOTO 239
00341       ENDIF
00342 C
00343       IPOSEX=3-IPOSEX
00344   238 CONTINUE
00345 C
00346 C        On a epuise les degres de modulation possibles... on plafonne.
00347 C                    (pour un sens de balayage)
00348 C
00349       IPULAS(INDICE)=IPUISS
00350   239 CONTINUE
00351 C
00352 C        Choix du meilleur resultat obtenu dans les 2 sens de balayage.
00353 C
00354       IPLUS=1+MOD (IPULAS(0)-IPUFLA,2)
00355       IMOINS=1+MOD (IPUFLA-IPULAS(1),2)
00356 C
00357       IF (ZECART(IPLUS,0).LE.ZECART(IMOINS,1)) THEN
00358         IMEILL=0
00359       ELSE
00360         IMEILL=1
00361       ENDIF
00362 C
00363       KPULAS=IPULAS(IMEILL)
00364 C
00365   240 CONTINUE
00366 C*
00367 C     2.4 -  DIAGNOSTICS EVENTUELS, EN MODE MISE AU POINT SEULEMENT.
00368 C-----------------------------------------------------------------------
00369 C
00370       IF (FA%LFAMOP) THEN
00371         ZERRXF=MIN (ZECART(1,IMEILL),ZECART(2,IMEILL))
00372         WRITE (UNIT=FA%NULOUT,FMT=*)
00373      S         'FACSIM - Erreur Initiale (P=',IPUFLA,') ',ZERRXI,
00374      S         ', Finale (P=',KPULAS,') ', ZERRXF
00375       ENDIF
00376 C**
00377 C     3.  -  TRANSFORMATION DE LA PARTIE A COMPACTER DU CHAMP.
00378 C-----------------------------------------------------------------------
00379 C
00380   300 CONTINUE
00381 C
00382 C        On fait des multiplications plutot que des divisions,
00383 C     et on essaie d'eviter l'exponentiation.
00384 C
00385       IF (KPULAS.EQ.0) THEN
00386 C
00387         IF (LLMLAM) THEN
00388 !$OMP PARALLEL DO PRIVATE(JN,JIND) IF(FA%LOPENMP)
00389           DO 3010 JN=0,ITRONC
00390           DO 3010 JIND=FA%NOZPAR(2*JN+3,IRANGC),FA%NOZPAR(2*JN+4,IRANGC)
00391           PCHAMS(JIND)=PCHAME(JIND)
00392  3010     CONTINUE
00393 !$OMP END PARALLEL DO
00394         ELSE
00395           DO 301 J=IDIMNC+1,ILCHAM
00396           PCHAMS(J)=PCHAME(J)
00397   301     CONTINUE
00398         ENDIF
00399 C
00400       ELSE
00401         IPUISX=IABS (KPULAS)
00402 C
00403         IF (KPULAS.GT.0) THEN
00404           INDICE=0
00405         ELSE
00406           INDICE=1
00407         ENDIF
00408 C
00409         IF (IPUISX.LE.FA%JPUILA) THEN
00410 C
00411           IF (LLMLAM) THEN
00412 !$OMP PARALLEL DO PRIVATE(JN,JIND,IOFF,IM,INDLAP) IF(FA%LOPENMP)
00413             DO 3020 JN=1,ITRONC
00414             DO 3020 JIND=FA%NOZPAR(2*JN+3,IRANGC)+4,
00415      S                   FA%NOZPAR(2*JN+4,IRANGC)
00416             IOFF=JIND-FA%NOZPAR(2*JN+3,IRANGC)
00417             IM=IOFF/4
00418             INDLAP=((JN-1)*FA%JPXTRO)+IM
00419             PCHAMS(JIND)=PCHAME(JIND)*FA%XLAP2DA(INDLAP,IPUISX,INDICE)
00420  3020       CONTINUE
00421 !$OMP END PARALLEL DO
00422           ELSE
00423             DO 302 J=IDIMNC+1,ILCHAM
00424             PCHAMS(J)=PCHAME(J)*FA%XLAP2D(J,IPUISX,INDICE)
00425   302       CONTINUE
00426           ENDIF
00427 C
00428         ELSEIF (IPUISX.LE.2*FA%JPUILA) THEN
00429           IPUIS2=IPUISX/2
00430 C
00431           IF (IPUISX.EQ.2*IPUIS2) THEN
00432 C
00433             IF (LLMLAM) THEN
00434 !$OMP PARALLEL DO PRIVATE(JN,JIND,IOFF,IM,INDLAP) IF(FA%LOPENMP)
00435               DO 3030 JN=1,ITRONC
00436               DO 3030 JIND=FA%NOZPAR(2*JN+3,IRANGC)+4,
00437      S                     FA%NOZPAR(2*JN+4,IRANGC)
00438               IOFF=JIND-FA%NOZPAR(2*JN+3,IRANGC)
00439               IM=IOFF/4
00440               INDLAP=((JN-1)*FA%JPXTRO)+IM
00441               PCHAMS(JIND)=PCHAME(JIND)*
00442      S                     FA%XLAP2DA(INDLAP,IPUIS2,INDICE)**2
00443  3030         CONTINUE
00444 !$OMP END PARALLEL DO
00445             ELSE
00446               DO 303 J=IDIMNC+1,ILCHAM
00447               PCHAMS(J)=PCHAME(J)*FA%XLAP2D(J,IPUIS2,INDICE)**2
00448   303         CONTINUE
00449             ENDIF
00450 C
00451           ELSE
00452 C
00453             IF (LLMLAM) THEN
00454 !$OMP PARALLEL DO PRIVATE(JN,JIND,IOFF,IM,INDLAP) IF(FA%LOPENMP)
00455               DO 3040 JN=1,ITRONC
00456               DO 3040 JIND=FA%NOZPAR(2*JN+3,IRANGC)+4,
00457      S                     FA%NOZPAR(2*JN+4,IRANGC)     
00458               IOFF=JIND-FA%NOZPAR(2*JN+3,IRANGC)
00459               IM=IOFF/4
00460               INDLAP=((JN-1)*FA%JPXTRO)+IM
00461               PCHAMS(JIND)=PCHAME(JIND)*
00462      S                FA%XLAP2DA(INDLAP,FA%JPUILA,INDICE)
00463      S                *FA%XLAP2DA(INDLAP,IPUISX-FA%JPUILA,INDICE)
00464  3040         CONTINUE
00465 !$OMP END PARALLEL DO
00466 
00467             ELSE
00468               DO 304 J=IDIMNC+1,ILCHAM
00469               PCHAMS(J)=PCHAME(J)*FA%XLAP2D(J,FA%JPUILA,INDICE)
00470      S                *FA%XLAP2D(J,IPUISX-FA%JPUILA,INDICE)
00471   304         CONTINUE
00472             ENDIF
00473           ENDIF
00474 C
00475         ELSE
00476           IRAPOR=1+(IPUISX-1)/FA%JPUILA
00477           IPUISR=IPUISX/IRAPOR
00478 C
00479           IF (IPUISX.EQ.IRAPOR*IPUISR) THEN
00480 C 
00481             IF (LLMLAM) THEN
00482 !$OMP PARALLEL DO PRIVATE(JN,JIND,IOFF,IM,INDLAP) IF(FA%LOPENMP)
00483               DO 3050 JN=1,ITRONC
00484               DO 3050 JIND=FA%NOZPAR(2*JN+3,IRANGC)+4,
00485      S                     FA%NOZPAR(2*JN+4,IRANGC)
00486               IOFF=JIND-FA%NOZPAR(2*JN+3,IRANGC)
00487               IM=IOFF/4
00488               INDLAP=((JN-1)*FA%JPXTRO)+IM
00489               PCHAMS(JIND)=PCHAME(JIND)*
00490      S            FA%XLAP2DA(INDLAP,IPUISR,INDICE)**IRAPOR
00491  3050         CONTINUE
00492 !$OMP END PARALLEL DO
00493             ELSE
00494               DO 305 J=IDIMNC+1,ILCHAM
00495               PCHAMS(J)=PCHAME(J)*FA%XLAP2D(J,IPUISR,INDICE)**IRAPOR
00496   305         CONTINUE
00497             ENDIF
00498 C 
00499           ELSE
00500 C
00501             IF (LLMLAM) THEN
00502 !$OMP PARALLEL DO PRIVATE(JN,JIND,IOFF,IM,INDLAP) IF(FA%LOPENMP)
00503               DO 3060 JN=1,ITRONC
00504               DO 3060 JIND=FA%NOZPAR(2*JN+3,IRANGC)+4,
00505      S                     FA%NOZPAR(2*JN+4,IRANGC)
00506               IOFF=JIND-FA%NOZPAR(2*JN+3,IRANGC)
00507               IM=IOFF/4
00508               INDLAP=((JN-1)*FA%JPXTRO)+IM
00509               PCHAMS(JIND)=PCHAME(JIND)*
00510      S          FA%XLAP2DA(INDLAP,FA%JPUILA,INDICE)**(IRAPOR-1)*
00511      S          FA%XLAP2DA(INDLAP,IPUISX-FA%JPUILA*(IRAPOR-1),INDICE)
00512  3060         CONTINUE 
00513 !$OMP END PARALLEL DO
00514             ELSE
00515               DO 306 J=IDIMNC+1,ILCHAM
00516               PCHAMS(J)=PCHAME(J)*
00517      S                  FA%XLAP2D(J,FA%JPUILA,INDICE)**(IRAPOR-1)
00518      S                *FA%XLAP2D(J,IPUISX-FA%JPUILA*(IRAPOR-1),INDICE)
00519   306         CONTINUE
00520             ENDIF
00521 C
00522           ENDIF
00523 C
00524         ENDIF
00525 C
00526       ENDIF
00527 C**
00528 C    10.  -  PHASE TERMINALE : MESSAGERIE EVENTUELLE,
00529 C            VIA LE SOUS-PROGRAMME "FAIPAR" .
00530 C-----------------------------------------------------------------------
00531 C
00532  1001 CONTINUE
00533       LLFATA=LLMOER (KREP,KRANG)
00534 C
00535       IF (FA%LFAMOP.OR.LLFATA) THEN
00536         INIMES=2
00537         CLNSPR='FACSIM'
00538         INUMER=FA%JPNIIL
00539         WRITE (UNIT=CLMESS,FMT='(''KREP='',I4,'', KRANG='
00540 ',I4,     S         '', PCHAME(1)='',G12.5,'', PCHAMS('',I3,'')='
00541 ',G12.5,     S         '', KPULAS='',I3)')
00542      S     KREP,KRANG,PCHAME(1),IDIMNC+1,PCHAMS(IDIMNC+1),KPULAS
00543         CALL FAIPAR_MT (FA, INUMER,INIMES,KREP,.FALSE.,CLMESS,
00544      S               CLNSPR,CLACTI,.FALSE.)
00545       ENDIF
00546 C
00547       IF (LHOOK) CALL DR_HOOK('FACSIM_MT',1,ZHOOK_HANDLE)
00548       END
00549