SURFEX v7.3
General documentation of Surfex
|
00001 C Jan-2011 P. Marguinaud Thread-safe LFI 00002 SUBROUTINE LFIPXF_MT (LFI, KREP, KNUMER, KNUMEX, CDCFGX, 00003 S KLAREX, KXCNEX, 00004 S KFACEX, KNUTRA, CDNOMA, KLONG ) 00005 USE LFIMOD, ONLY : LFICOM 00006 USE PARKIND1, ONLY : JPRB 00007 USE YOMHOOK , ONLY : LHOOK, DR_HOOK 00008 C**** 00009 C Sous-programme Preparatoire a la realisation d'une 00010 C "version eXport" d'un Fichier LFI vers un systeme 00011 C a priori different. La methode utilisee suppose: 00012 C 00013 C - que les fichiers a acces direct FORTRAN soient implantes ou 00014 C traitables comme des fichiers non bloques sur le systeme 00015 C destinataire; 00016 C 00017 C - que l'on puisse ecrire par WRITE FORTRAN des fichiers 00018 C non bloques sur le systeme ou est fait la "version export", 00019 C aussi appelee "fichier export"; 00020 C 00021 C - que la conversion des variables, numeriques voire aussi 00022 C caracteres, soit faite au niveau des couches d'entrees/sorties 00023 C FORTRAN sur le systeme ou est fait le fichier export; 00024 C 00025 C ( dans la pratique, les deux points qui precedent impliquent un 00026 C parametrage au niveau du langage de controle, a priori ) 00027 C 00028 C - que le programme utilisateur ait ouvert au prealable le fichier 00029 C LFI dont on veut realiser une "version export", et appelle le 00030 C sous-programme LFIPXF; 00031 C 00032 C - que le programme utilisateur specifie le contenu des articles 00033 C a exporter en termes de types FORTRAN; ceci pouvant se faire 00034 C de deux manieres, eventuellement combinables: 00035 C 00036 C 1) Si le fichier contient (essentiellement) des donnees 00037 C utilisateur pouvant se decrire de maniere homogene, 00038 C par exemple rien que des variables reelles, et doit etre 00039 C exporte dans la totalite des articles, alors il suffira 00040 C d'appeler le sous-programme LFIXPH avec la description 00041 C correspondant a ces articles, que l'on peut aussi voir 00042 C comme une "description par defaut" (ou implicite); 00043 C 00044 C 2) Si ce n'est pas le cas, ou si une partie des articles ne 00045 C peut pas etre decrite de la meme maniere que les autres 00046 C articles, alors il faudra que le programme utilisateur 00047 C specifie, pour chacun de ces articles, 00048 C le contenu en termes de types FORTRAN en appelant le sous- 00049 C programme LFIXPA: il s'agit la d'une description explicite, 00050 C ayant precedence sur une eventuelle description implicite; 00051 C 00052 C - qu'en fin de compte le programme utilisateur appelle le sous- 00053 C programme LFIXPF qui fabriquera vraiment la version export, 00054 C a partir des specifications donnees via LFIPXF, LFIXPH, LFIXPA. 00055 C** 00056 C ARGUMENTS : KREP (Sortie) ==> Code-Reponse du sous-programme; 00057 C KNUMER (Entree) ==> Numero d'Unite Logique associe 00058 C au fichier LFI a exporter; 00059 C KNUMEX (Entree) ==> Numero d'Unite Logique associe 00060 C a la version export a realiser; 00061 C CDCFGX (Entree) ==> Configuration du systeme 00062 C destinataire du fichier export; 00063 C KLAREX (Entree) ==> Longueur d'ARticle Elementaire du 00064 C logiciel LFI du systeme destinatai- 00065 C re, exprimee en mots du systeme 00066 C destinataire; 00067 C (LFI%JPLARD du logiciel "distant") 00068 C KXCNEX (Entree) ==> Nombre maXimum de Caracteres par 00069 C Nom d'article du logiciel LFI du 00070 C systeme destinataire; 00071 C (LFI%JPNCPN du logiciel "distant") 00072 C KFACEX (Entree) ==> Facteur multiplicatif du fichier 00073 C export; 00074 C KNUTRA (Entree) ==> Numero d'Unite Logique utilisable 00075 C pour un fichier de travail eventuel 00076 C (si utilisation de LFIXPA), de type 00077 C LFI; 00078 C CDNOMA (Sortie) ==> Nom du premier article "candidat" 00079 C (potentiel) a l'export; 00080 C KLONG (Sortie) ==> Longueur de cet article. 00081 C 00082 C REMARQUE: Le fichier de travail n'est utilise que si l'on n'a pas 00083 C assez de place dans les tables pour stocker en memoire 00084 C les descripteurs. Mais si on en a besoin, il faut penser 00085 C que ce fichier occupera (temporairement, jusqu'a appel a 00086 C LFIXPF) une entree dans les tables LFI, et donc ne pas 00087 C avoir les tables saturees auparavant. 00088 C 00089 #ifndef f77 00090 #include "precision.h" 00091 #endif 00092 C 00093 TYPE(LFICOM) :: LFI 00094 CHARACTER CDNOMA*(*), CLNOMA*(LFI%JPNCPN) 00095 CHARACTER CDCFGX*(*), CLCFGX*(LFI%JPXCCF) 00096 C 00097 INTEGER KREP, KNUMER, KNUMEX, KLAREX, KXCNEX, KFACEX, KNUTRA 00098 INTEGER KLONG, ILCLNO, ILCDNO, IRANMX, ILCFGX, IDECBL, IPOSBL 00099 INTEGER IRANG, IREP, INUMER, INBALO, INTTRU, J, IRANIE, INIMES 00100 INTEGER IRGPIM, IRGPIF, IARTIC, IRETIN, ILCDCF 00101 C 00102 LOGICAL LLVERG, LLVERF, LLEXUL, LLOUVR 00103 C 00104 #include "lficom2.h" 00105 #include "lficom_mt.h" 00106 C** 00107 C 1. - CONTROLES DES PARAMETRES D'APPEL, PUIS INITIALISATIONS. 00108 C----------------------------------------------------------------------- 00109 C 00110 C Appel legerement anticipe a LFINUM, garantissant l'initialisa- 00111 C tion des variables globales du logiciel a la 1ere utilisation. 00112 C 00113 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00114 IF (LHOOK) CALL DR_HOOK('LFIPXF_MT',0,ZHOOK_HANDLE) 00115 CALL LFINUM_MT (LFI, KNUMER,IRANG) 00116 IREP=0 00117 INUMER=KNUMER 00118 LLVERF=.FALSE. 00119 LLVERG=.FALSE. 00120 ILCDNO=LEN (CDNOMA) 00121 ILCDCF=LEN (CDCFGX) 00122 CLNOMA=' ' 00123 ILCLNO=1 00124 CLCFGX=' ' 00125 ILCFGX=1 00126 KLONG=0 00127 C 00128 IF (MIN0 (KLAREX,KXCNEX,KFACEX).LE.0) THEN 00129 IREP=-14 00130 GOTO 1001 00131 ELSEIF (ILCDNO.LE.0) THEN 00132 IREP=-15 00133 CLNOMA=LFI%CHINCO(:LFI%JPNCPN) 00134 ILCLNO=LFI%JPNCPN 00135 ENDIF 00136 C 00137 IF (ILCDCF.LE.0) THEN 00138 IREP=-15 00139 CLCFGX=LFI%CHINCO(:LFI%JPNCPN) 00140 ILCFGX=LFI%JPNCPN 00141 ENDIF 00142 C 00143 IF (IREP.NE.0) THEN 00144 GOTO 1001 00145 ELSE 00146 CDNOMA=' ' 00147 ENDIF 00148 C 00149 C Recherche de la longueur "utile" de la configuration specifiee. 00150 C (c'est-a-dire sans tenir compte des blancs terminaux eventuels) 00151 C 00152 IDECBL=0 00153 C 00154 101 CONTINUE 00155 IPOSBL=IDECBL+INDEX (CDCFGX(IDECBL+1:),' ') 00156 C 00157 IF (IPOSBL.LE.IDECBL) THEN 00158 ILCFGX=ILCDCF 00159 ELSEIF (CDCFGX(IPOSBL:).EQ.' ') THEN 00160 ILCFGX=IPOSBL-1 00161 ELSE 00162 IDECBL=IPOSBL 00163 GOTO 101 00164 ENDIF 00165 C 00166 IF (ILCFGX.LE.LFI%JPXCCF) THEN 00167 CLCFGX=CDCFGX(:ILCFGX) 00168 ELSE 00169 CLCFGX=CDCFGX(:LFI%JPXCCF) 00170 ILCFGX=LFI%JPXCCF 00171 IREP=-15 00172 GOTO 1001 00173 ENDIF 00174 C 00175 DO 102 J=0,LFI%JPCFMX 00176 C 00177 IF (CDCFGX.EQ.LFI%CFGMXD(J)) THEN 00178 IRANMX=J 00179 GOTO 103 00180 ENDIF 00181 C 00182 102 CONTINUE 00183 C 00184 C Configuration du systeme destinataire inconnue ou non prevue. 00185 C 00186 IREP=-32 00187 GOTO 1001 00188 C 00189 103 CONTINUE 00190 C 00191 IF (KXCNEX.GT.LFI%JPXCIE) THEN 00192 IREP=-33 00193 GOTO 1001 00194 ENDIF 00195 C 00196 C Controle de validite FORTRAN et de non ouverture prealable 00197 C des Numeros d'Unite Logique KNUMEX et KNUTRA. 00198 C 00199 INUMER=KNUMEX 00200 INQUIRE (UNIT=KNUMEX,EXIST=LLEXUL,OPENED=LLOUVR,ERR=901, 00201 S IOSTAT=IREP) 00202 CLACTI='EXPORT' 00203 C 00204 IF (.NOT.LLEXUL) THEN 00205 IREP=-30 00206 GOTO 1001 00207 ELSEIF (LLOUVR) THEN 00208 IREP=-34 00209 GOTO 1001 00210 ENDIF 00211 C 00212 INUMER=KNUTRA 00213 INQUIRE (UNIT=KNUTRA,EXIST=LLEXUL,OPENED=LLOUVR,ERR=901, 00214 S IOSTAT=IREP) 00215 C 00216 IF (LFI%LFRANC) THEN 00217 CLACTI='DE TRAVAIL' 00218 ELSE 00219 CLACTI='WORK' 00220 ENDIF 00221 C 00222 IF (.NOT.LLEXUL) THEN 00223 IREP=-30 00224 GOTO 1001 00225 ELSEIF (LLOUVR) THEN 00226 IREP=-34 00227 GOTO 1001 00228 ENDIF 00229 C 00230 INUMER=KNUMER 00231 C 00232 IF (IRANG.EQ.0) THEN 00233 IREP=-1 00234 GOTO 1001 00235 ENDIF 00236 C 00237 IF (LFI%LMULTI) CALL LFIVER_MT (LFI, LFI%VERRUE(IRANG),'ON') 00238 LLVERF=LFI%LMULTI 00239 C 00240 IF (LFI%NEXPOR(IRANG).GT.0) THEN 00241 IREP=-35 00242 CLACTI='EXPORT' 00243 GOTO 1001 00244 ELSEIF (LFI%NIMPOR(IRANG).GT.0) THEN 00245 IREP=-35 00246 CLACTI='IMPORT' 00247 GOTO 1001 00248 ENDIF 00249 C 00250 INBALO=LFI%MDES1D(IXM(LFI%JPNALO,IRANG)) 00251 INTTRU=LFI%MDES1D(IXM(LFI%JPNTRU,IRANG))+LFI%NBTROU(IRANG) 00252 C 00253 IF (INBALO.EQ.INTTRU) THEN 00254 C 00255 C Fichier vide de donnees... inexportable. 00256 C 00257 IREP=-36 00258 CLACTI='EXPORT' 00259 GOTO 1001 00260 ENDIF 00261 C 00262 C Ouverture de l'unite logique KNUMEX. 00263 C 00264 INUMER=KNUMEX 00265 OPEN (UNIT=KNUMEX,STATUS='UNKNOWN',ACCESS='SEQUENTIAL', 00266 S FORM='UNFORMATTED',IOSTAT=IREP,ERR=902) 00267 REWIND (UNIT=KNUMEX,IOSTAT=IREP,ERR=906) 00268 INUMER=KNUMER 00269 C** 00270 C 2. - RECHERCHE DU PREMIER ARTICLE LOGIQUE DE DONNEES DU FICHIER. 00271 C----------------------------------------------------------------------- 00272 C 00273 C Reinitialisation des caracteristiques de type "pointeur". 00274 C 00275 LFI%NDERGF(IRANG)=LFI%JPNIL 00276 LFI%CNDERA(IRANG)=' ' 00277 LFI%NSUIVF(IRANG)=LFI%JPNIL 00278 LFI%NPRECF(IRANG)=LFI%JPNIL 00279 C 00280 CALL LFICAX_MT (LFI, IREP,IRANG,IRGPIM,IARTIC,IRETIN) 00281 C 00282 IF (IRETIN.EQ.1) THEN 00283 GOTO 903 00284 ELSEIF (IRETIN.EQ.2) THEN 00285 GOTO 904 00286 ELSEIF (IRETIN.NE.0) THEN 00287 GOTO 1001 00288 ELSEIF (IARTIC.EQ.0) THEN 00289 IREP=-16 00290 GOTO 1001 00291 ENDIF 00292 C 00293 IRGPIF=LFI%MRGPIF(IRGPIM) 00294 C 00295 IF (.NOT.LFI%LPHASP(IRGPIM)) THEN 00296 C 00297 CALL LFIPHA_MT (LFI, IREP,IRANG,IRGPIM,IRETIN) 00298 C 00299 IF (IRETIN.EQ.1) THEN 00300 GOTO 903 00301 ELSEIF (IRETIN.EQ.2) THEN 00302 GOTO 904 00303 ELSEIF (IRETIN.NE.0) THEN 00304 GOTO 1001 00305 ENDIF 00306 C 00307 ENDIF 00308 C 00309 KLONG=LFI%MLGPOS(IXM(IARTIC,IRGPIM)) 00310 CLNOMA=LFI%CNOMAR(IXC(IARTIC,IRGPIM)) 00311 C 00312 C Recherche de la longueur "utile" du nom d'article. 00313 C (c'est-a-dire sans tenir compte des blancs terminaux eventuels) 00314 C 00315 IDECBL=0 00316 C 00317 211 CONTINUE 00318 IPOSBL=IDECBL+INDEX (CLNOMA(IDECBL+1:),' ') 00319 C 00320 IF (IPOSBL.LE.IDECBL) THEN 00321 ILCLNO=LFI%JPNCPN 00322 ELSEIF (CLNOMA(IPOSBL:).EQ.' ') THEN 00323 ILCLNO=IPOSBL-1 00324 ELSE 00325 IDECBL=IPOSBL 00326 GOTO 211 00327 ENDIF 00328 C 00329 IF (ILCDNO.GE.ILCLNO) THEN 00330 CDNOMA=CLNOMA(:ILCLNO) 00331 ELSE 00332 IREP=-24 00333 CLACTI=CLNOMA 00334 GOTO 1001 00335 ENDIF 00336 C** 00337 C 3. - STOCKAGE DES PARAMETRES D'APPEL DANS LES TABLES. 00338 C----------------------------------------------------------------------- 00339 C 00340 C VERROUILLAGE GLOBAL EVENTUEL. 00341 C 00342 IF (LFI%LMULTI) CALL LFIVER_MT (LFI, LFI%VERGLA,'ON') 00343 LLVERG=LFI%LMULTI 00344 C 00345 IF (LFI%NUIMEX.LT.LFI%JPIMEX) THEN 00346 C 00347 DO 301 J=1,LFI%JPIMEX 00348 C 00349 IF (LFI%MNUIEX(J).EQ.LFI%JPNIL) THEN 00350 IRANIE=J 00351 LFI%NUIMEX=LFI%NUIMEX+1 00352 LFI%NINIEX(LFI%NUIMEX)=J 00353 LFI%MNUIEX(J)=KNUMER 00354 GOTO 302 00355 ENDIF 00356 C 00357 301 CONTINUE 00358 C 00359 IREP=-16 00360 GOTO 1001 00361 C 00362 ELSE 00363 C 00364 C Tables deja pleines... 00365 C 00366 IREP=-37 00367 GOTO 1001 00368 ENDIF 00369 C 00370 302 CONTINUE 00371 C 00372 C Deverrouillage Global eventuel. 00373 C 00374 IF (LFI%LMULTI) CALL LFIVER_MT (LFI, LFI%VERGLA,'OFF') 00375 LLVERG=.FALSE. 00376 C 00377 LFI%NEXPOR(IRANG)=IRANIE 00378 LFI%NAEXPL(IRANIE)=0 00379 LFI%CNIMPL(IRANIE)=' ' 00380 LFI%NIMPEX(IRANIE)=KNUMEX 00381 LFI%NUTRAV(IRANIE)=KNUTRA 00382 LFI%NLAPFD(IRANIE)=KLAREX*KFACEX 00383 LFI%NXCNLD(IRANIE)=KXCNEX 00384 LFI%NRCFMX(IRANIE)=IRANMX 00385 C 00386 GOTO 1001 00387 C** 00388 C 9. - CI-DESSOUS, ETIQUETTES DE BRANCHEMENT EN CAS D'ERREUR E/S. 00389 C----------------------------------------------------------------------- 00390 C 00391 901 CONTINUE 00392 CLACTI='INQUIRE' 00393 GOTO 909 00394 C 00395 902 CONTINUE 00396 CLACTI='OPEN' 00397 GOTO 909 00398 C 00399 903 CONTINUE 00400 CLACTI='WRITE' 00401 GOTO 909 00402 C 00403 904 CONTINUE 00404 CLACTI='READ' 00405 GOTO 909 00406 C 00407 906 CONTINUE 00408 CLACTI='REWIND' 00409 C 00410 909 CONTINUE 00411 C 00412 C AU CAS OU, ON FORCE LE CODE-REPONSE ENTREE/SORTIE A ETRE POSITIF. 00413 C 00414 IREP=IABS (IREP) 00415 C** 00416 C 10. - PHASE TERMINALE : MESSAGERIE, AVEC "ABORT" EVENTUEL, 00417 C VIA LE SOUS-PROGRAMME "LFIEMS" . 00418 C----------------------------------------------------------------------- 00419 C 00420 1001 CONTINUE 00421 KREP=IREP 00422 LLFATA=LLMOER (IREP,IRANG) 00423 IF (LLVERG) CALL LFIVER_MT (LFI, LFI%VERGLA,'OFF') 00424 C 00425 IF (IRANG.NE.0) THEN 00426 LFI%NDEROP(IRANG)=22 00427 LFI%NDERCO(IRANG)=IREP 00428 IF (LLVERF) CALL LFIVER_MT (LFI, LFI%VERRUE(IRANG),'OFF') 00429 ENDIF 00430 C 00431 IF (LLFATA.OR.IXNIMS (IRANG).EQ.2) THEN 00432 INIMES=2 00433 ELSE 00434 IF (LHOOK) CALL DR_HOOK('LFIPXF_MT',1,ZHOOK_HANDLE) 00435 RETURN 00436 ENDIF 00437 C 00438 CLNSPR='LFIPXF' 00439 WRITE (UNIT=CLMESS,FMT='(''ARGUMENTS='',I4,2('',' 00440 ',I3),A, S '','',I5,2('','',I2),'','',I3,A,'','',I6)') 00441 S KREP,KNUMER,KNUMEX,CLCFGX(:ILCFGX),KLAREX,KXCNEX,KFACEX, 00442 S KNUTRA,CLNOMA(:ILCLNO),KLONG 00443 CALL LFIEMS_MT (LFI, INUMER,INIMES,IREP,LLFATA, 00444 S CLMESS,CLNSPR,CLACTI) 00445 C 00446 IF (LHOOK) CALL DR_HOOK('LFIPXF_MT',1,ZHOOK_HANDLE) 00447 END 00448