SURFEX v7.3
General documentation of Surfex
|
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