Télécharger lirnas.eso

Retour à la liste

Numérotation des lignes :

lirnas
  1. C LIRNAS SOURCE PV090527 26/06/26 21:15:10 12582
  2. SUBROUTINE LIRNAS
  3.  
  4. CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  5. C
  6. C BUT: Lecture des données au format NASTRAN sous forme de
  7. C fichier NAS (ASCII). Les données sont logées dans une table
  8. C qui est renvoyée comme résultat.
  9. C
  10. C Auteur : Clément BERTHINIER
  11. C Mai 2016
  12. C
  13. C Liste des Corrections :
  14. C CB215821 : Ajout des cartes de PROPERTY lors de la lecture
  15. C CB215821 : Correction d'un MELEME mal defini
  16. C CB215821 : Sur SEMT2, si une chaine de caractere contient le retour
  17. C chariot, le READ sort sur ERR=
  18. C
  19. C Appelé par : LIREFI
  20. C
  21. CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  22.  
  23.  
  24. IMPLICIT INTEGER(I-N)
  25. IMPLICIT REAL*8 (A-H,O-Z)
  26.  
  27.  
  28. C Déclarations
  29. CHARACTER*256 FicNAS
  30. CHARACTER*80 LIGNE,COLO80
  31. CHARACTER*17 COLO17
  32. CHARACTER*16 COLO16
  33. CHARACTER*9 COLO9
  34. CHARACTER*8 COLO8
  35. CHARACTER*4 COLO4
  36.  
  37. LOGICAL BEGIN, PRECID
  38.  
  39. C Unite logique du fichier d'impression au format .nas et nom du fichier
  40. PARAMETER (IUNAS=68)
  41.  
  42. C Définition des COMMON utiles
  43.  
  44. -INC PPARAM
  45. -INC CCOPTIO
  46. -INC CCREEL
  47. -INC SMCOORD
  48. -INC CCGEOME
  49. -INC SMELEME
  50. -INC TMTRAV
  51. -INC SMTABLE
  52.  
  53. C Déclaration de tableaux
  54.  
  55. PARAMETER (NBFLO=3 )
  56. REAL*8 XFL(NBFLO )
  57.  
  58. PARAMETER (NBGEO1=32 )
  59. PARAMETER (NBSY =6 )
  60. PARAMETER (NBCART=20 )
  61. PARAMETER (NPROPE=3 )
  62. CHARACTER*8 GETYPE(NBGEO1+NBSY+NBCART),PROTYP(NPROPE)
  63. INTEGER NONLUE(NBGEO1+NBSY+NBCART)
  64. CHARACTER*4 ELCAS1(NBGEO1)
  65. CHARACTER*4 ELCAS2(NBGEO1)
  66.  
  67. C IELEQ1 : Place dans NOMS des elements equivalents dans Cast3M d'ordre 1
  68. C IELEQ2 : Place dans NOMS des elements equivalents dans Cast3M d'ordre 2
  69. C NBNOE1 : Nombre de noeuds pour l'element concerne d'ordre 1
  70. C NBNOE2 : Nombre de noeuds pour l'element concerne d'ordre 2
  71. INTEGER IELEQ1(NBGEO1)
  72. INTEGER IELEQ2(NBGEO1)
  73. INTEGER NBNOE1(NBGEO1)
  74. INTEGER NBNOE2(NBGEO1)
  75.  
  76.  
  77. PARAMETER (NBGEO2=15)
  78. INTEGER IORDCO(NBGEO2*20)
  79. CHARACTER*4 CTYPE(NBGEO2)
  80.  
  81. C Liste des CARACTERES RECONNUS pour détecter les CR et LF
  82. CHARACTER*76 CARAOK
  83. DATA CARAOK /'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP
  84. &QRSTUVWXYZ+-/*=.,:;=?&_#'/
  85.  
  86. C Liste des mots clés en début de ligne d'un fichier .nas
  87. DATA GETYPE / 'GRID ','GRID* ',
  88. & 'RBE2 ','RBE2* ','RBE3 ','RBE3* ',
  89. & 'CTRIA3 ','CTRIA3* ',
  90. & 'CTRIA6 ','CTRIA6* ',
  91. & 'CQUAD4 ','CQUAD4* ',
  92. & 'CQUAD8 ','CQUAD8* ',
  93. & 'CTETRA ','CTETRA* ',
  94. & 'CPYRA ','CPYRA* ',
  95. & 'CPENTA ','CPENTA* ',
  96. & 'CHEXA ','CHEXA* ',
  97. & 'CBAR ','CBAR* ','CBEAM ','CBEAM* ',
  98. & 'CONM2 ','CONM2* ','RBAR ','RBAR* ',
  99. & 'CELAS2 ','CELAS2* ',
  100. & 'CORD2R ','CORD2R* ','CORD2C ','CORD2C* ',
  101. & 'CORD2S ','CORD2S* ',
  102. & 'SPC ','SPC* ','SPCD ','SPCD* ',
  103. & 'LOAD ','LOAD* ','PLOAD ','PLOAD* ',
  104. & 'PLOAD1 ','PLOAD1* ','PLOAD2 ','PLOAD2* ',
  105. & 'PLOAD4 ','PLOAD4* ','FORCE ','FORCE* ',
  106. & 'MOMENT ','MOMENT* ','TEMP ','TEMP* ' /
  107.  
  108. DATA PROTYP / 'PROD ','PSHELL ','PSOLID ' /
  109.  
  110. C Elements equivalents dans Cast3M
  111. DATA ELCAS1 / 'POI1','POI1',
  112. & 'SEG2','SEG2',
  113. & 'SEG3','SEG3',
  114. & 'TRI3','TRI3',
  115. & 'TRI6','TRI6',
  116. & 'QUA4','QUA4',
  117. & 'QUA8','QUA8',
  118. & 'TET4','TET4',
  119. & 'PYR5','PYR5',
  120. & 'PRI6','PRI6',
  121. & 'CUB8','CUB8',
  122. & 'SEG2','SEG2',
  123. & 'SEG2','SEG2',
  124. & 'POI1','POI1',
  125. & 'SEG2','SEG2',
  126. & 'SEG2','SEG2' /
  127.  
  128. C Elements alternatifs equivalents dans Cast3M (Meme nom entre ordre 1 et ordre 2)
  129. C pour les éléments CTETRA, CPYRA, CPENTA, CHEXA
  130. DATA ELCAS2 / 'POI1','POI1',
  131. & 'SEG2','SEG2',
  132. & 'SEG3','SEG3',
  133. & 'TRI3','TRI3',
  134. & 'TRI6','TRI6',
  135. & 'QUA4','QUA4',
  136. & 'QUA8','QUA8',
  137. & 'TE10','TE10',
  138. & 'PY13','PY13',
  139. & 'PR15','PR15',
  140. & 'CU20','CU20',
  141. & 'SEG2','SEG2',
  142. & 'SEG2','SEG2',
  143. & 'POI1','POI1',
  144. & 'SEG2','SEG2',
  145. & 'SEG2','SEG2' /
  146.  
  147. C Le nombre de noeuds est lu dans NBNNE(i) (bdata.eso)
  148. C 'i' est l''index de l''élément de Cast3M dans NOMS (bdata.eso)
  149.  
  150. C Data indiquant le nom de l'element auquel correspond IORDCO
  151. DATA CTYPE /
  152. & 'POI1',
  153. & 'SEG2',
  154. & 'SEG3',
  155. & 'TRI3',
  156. & 'TRI6',
  157. & 'QUA4',
  158. & 'QUA8',
  159. & 'TET4',
  160. & 'TE10',
  161. & 'PYR5',
  162. & 'PY13',
  163. & 'PRI6',
  164. & 'PR15',
  165. & 'CUB8',
  166. & 'CU20' /
  167.  
  168.  
  169. C Data permettrant de mettre le bon ordre dans la connectivité des éléments
  170. C Le facteur 20 de ce DATA vient du fait que l'élément le plus
  171. C Complexe a une connectivité à 20 éléments (CU20 ou HEXA 2nd Ordre)
  172. DATA IORDCO /
  173. & 1,0,0,0 ,0,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0,0 ,0,0 , POI1
  174. & 1,2,0,0 ,0,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0,0 ,0,0 , SEG2
  175. & 3,1,2,0 ,0,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0,0 ,0,0 , SEG3
  176. & 1,2,3,0 ,0,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0,0 ,0,0 , TRI3
  177. & 1,4,2,5 ,3,6 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0,0 ,0,0 , TRI6
  178. & 1,2,3,4 ,0,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0,0 ,0,0 , QUA4
  179. & 1,5,2,6 ,3,7 ,4 ,8 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0,0 ,0,0 , QUA8
  180. & 1,2,3,4 ,0,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0,0 ,0,0 , TET4
  181. & 1,5,2,6 ,3,7 ,8 ,9 ,10,4 ,0 ,0 ,0 ,0 ,0 ,0 ,0,0 ,0,0 , TE10
  182. & 1,2,3,4 ,5,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0,0 ,0,0 , PYR5
  183. & 2,7,3,8 ,4,9 ,1 ,6 ,11,12,13,10,5 ,0 ,0 ,0 ,0,0 ,0,0 , PY13
  184. & 1,2,3,4 ,5,6 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0,0 ,0,0 , PRI6
  185. & 1,7,2,8 ,3,9 ,10,11,12,4 ,13,5 ,14,6 ,15,0 ,0,0 ,0,0 , PR15
  186. & 1,2,3,4 ,5,6 ,7 ,8 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0,0 ,0,0 , CUB8
  187. & 1,9,2,10,3,11,4 ,12,13,14,15,16,5 ,17,6 ,18,7,19,8,20 / CU20
  188.  
  189.  
  190. C***********************************************************************
  191. C Définition des différents segments et de leur contenu
  192. C***********************************************************************
  193. C Enregistrement des POINTS du MODELE
  194. SEGMENT MLINOE
  195. C JGNOLU : ID du noeud lu dans le fichier
  196. C ICORNO : Correspondance depuis la numérotation lue vers la numérotation LOCALE des noeuds
  197. C ISYSTE : Entier valant 0 pour le systeme global et l'ID du systeme sinon
  198. C XCOLU : FLOTTANTS indiquant les coordonnées non transformées par les systèmes
  199. INTEGER ICORNO(JGNOLU)
  200. INTEGER ISYSTE(JGNOLU)
  201. REAL*8 XCOLU (3,JGNOLU)
  202. ENDSEGMENT
  203.  
  204. C Enregistrement des ELEMENTS du MODELE
  205. SEGMENT MLIELE
  206. C JGELLO : ID de l''élément dans la numérotation LOCALE
  207. C JGELLU : ID de l''élément lu dans le fichier
  208. C JELCON : Nombre total connectivité lues
  209. C IELCON : Ou aller lire le début de la connectivité dans MLIELE.ICONTO
  210. C IELNBN : Nombre de noeuds de connectivité à lire dans MLIELE.ICONTO
  211. C IELTYP : Type de l''élément lu pour Cast3M
  212. C IDPROP : ID de la propriété
  213. C IRBE2 : Code du bloquage pour RBE2
  214. C ICONTO : Tableau dans lequel sont placées toutes les connectivités les unes après les autres
  215. C ICOREL : Correspondance depuis la numérotation LOCALE vers la numérotation lue des ELEMENTS
  216. INTEGER IELCON(JGELLU)
  217. INTEGER IELNBN(JGELLU)
  218. INTEGER IELTYP(JGELLU)
  219. INTEGER IDPROP(JGELLU)
  220. INTEGER IRBE2 (JGELLU)
  221. INTEGER ICONTO(JELCON)
  222. INTEGER ICOREL(JGELLO)
  223. ENDSEGMENT
  224.  
  225. C Enregistrement des PROPERTY du MODELE
  226. SEGMENT MPROP
  227. C NBPROP : Nombre de Property dans le MODELE
  228. C ICOPRO : Correspondance entre le numéro d''ordre de lecture et l''ID de la propriete lue
  229. C ITYPRO : Type de MELEME presents dans la Property (taille de NOMS est spécifiée maximum égale à 100 dans CCGEOME.INC)
  230. C IMELSI : Pointeur MELEME SIMPLE du TYPE en question
  231. C NBELPR : Nombre d''element a mesure qu''ils sont triés (à la fin)
  232. C IMELCO : Pointeur MELEME COMPLEXE
  233. INTEGER ICOPRO(NBPROP)
  234. INTEGER ITYPRO(100,NBPROP)
  235. INTEGER IMELSI(100,NBPROP)
  236. INTEGER NBELPR(100,NBPROP)
  237. INTEGER IMELCO(NBPROP)
  238. ENDSEGMENT
  239.  
  240. C Enregistrement des SYSTEME du MODELE
  241. SEGMENT MSYSTE
  242. C JGSYST : Nombre de systemes dans le MODELE
  243. C ITYSYS : Type du systeme 1 Cartesien, 2 Cylindrique, 3 Spherique
  244. C IDSYST : Tableau contenant les ID des systemes dans l''ordre de lecture
  245. C INOSYS : Numéro des 4 noeuds du systeme dans la numérotation absolue de Cast3M
  246. C SYSCOR : 12 Coordonnees des noeuds du systeme 9 suffisent les 3 dernières sont calculées par produit vectoriel
  247. C SCOOR2 : matrice de passage du repère local au repere global
  248. INTEGER IDSYST(JGSYST)
  249. INTEGER ITYSYS(JGSYST)
  250. INTEGER INOSYS(4,JGSYST)
  251. REAL*8 SYSCOR(12,JGSYST)
  252. REAL*8 SCOOR2(9,JGSYST)
  253. ENDSEGMENT
  254.  
  255. C Enregistrement des RBE2 (Rigid Body)
  256. SEGMENT MRBE2
  257. C JGRBE2 : Nombre de RBE2 de type differents dans le MODELE
  258. C NELRBE : Tableau indiquant combient de RBE de ce type il faut creer
  259. C IBLRBE : Code du bloquage pour ce RBE2
  260. C IMELRB : Pointeur MELEME SIMPLE du TYPE en question
  261. INTEGER NELRBE(JGRBE2)
  262. INTEGER IBLRBE(JGRBE2)
  263. INTEGER IMELRB(JGRBE2)
  264. ENDSEGMENT
  265.  
  266. C Enregistrement des SPC (Blocages)
  267. SEGMENT MSPC
  268. C JGSPC : Nombre de SPC dans le MODELE
  269. C NBSDIF : Nombre d''ID de SPC
  270. C IDSPC : ID lue pour ce SPC
  271. C ILISPC : Liste des ID de SPC differents
  272. C NBESPC : nombre d''elements PO1I dans cet ID de SPC
  273. C INOSPC : ID lue du noeud pour ce SPC
  274. C IBLOLU : Code du blocage pour ce SPC
  275. C IHASHS : HashCode (numero unique) du code du blocage
  276. C ICOSPC : Correspondance entre le numéro du SPC et la position de son ID dans liste ILISPC
  277. C XSPC : Flottant lue pour ce SPC
  278. C IMELSP : Pointeur MELEME SIMPLE pour cet ID de SPC
  279. INTEGER IDSPC (JGSPC )
  280. INTEGER ILISPC(NBSDIF)
  281. INTEGER NBESPC(NBSDIF)
  282. INTEGER INOSPC(JGSPC )
  283. INTEGER IBLOLU(JGSPC )
  284. INTEGER IHASHS(JGSPC )
  285. INTEGER ICOSPC(JGSPC )
  286. REAL*8 XSPC (JGSPC )
  287. INTEGER IMELSP(NBSDIF)
  288. ENDSEGMENT
  289.  
  290. C Enregistrement des TEMPERATURES
  291. SEGMENT MTEMP
  292. C JGTEMP : Nombre de TEMPERATURE dans le MODELE
  293. C NBTDIF : Nombre d''ID de TEMPERATURE
  294. C IDTEMP : ID lue pour cette TEMPERATURE
  295. C ILITEM : Liste des ID de TEMPERATURE differentes
  296. C NBETEM : nombre d''elements PO1I dans cet ID de TEMPERATURE
  297. C INOTEM : ID lue du noeud pour cet ID de TEMPERATURE
  298. C ICOTEM : Correspondance entre le numéro de la carte TEMPERATURE et la position de son ID dans liste ILITEM
  299. C XTEMP : Flottant lue pour la TEMPERATURE
  300. INTEGER IDTEMP(JGTEMP )
  301. INTEGER ILITEM(NBTDIF)
  302. INTEGER NBETEM(NBTDIF)
  303. INTEGER INOTEM(JGTEMP )
  304. INTEGER ICOTEM(JGTEMP )
  305. REAL*8 XTEMP (JGTEMP )
  306. ENDSEGMENT
  307.  
  308. C Enregistrement des FORCES
  309. SEGMENT MFORCE
  310. C JGFORC : Nombre de FORCES dans le MODELE
  311. C NBFDIF : Nombre d''ID de FORCES
  312. C IDFORC : ID lue pour cette FORCES
  313. C ILIFOR : Liste des ID de FORCES differentes
  314. C NBEFOR : nombre d''elements PO1I dans cet ID de FORCES
  315. C INOFOR : ID lue du noeud pour cet ID de FORCES
  316. C ICOFOR : Correspondance entre le numéro de la carte FORCES et la position de son ID dans liste ILIFOR
  317. C XFORCE : Flottants lus pour la FORCES
  318. INTEGER IDFORC(JGFORC)
  319. INTEGER ILIFOR(NBFDIF)
  320. INTEGER NBEFOR(NBFDIF)
  321. INTEGER INOFOR(JGFORC)
  322. INTEGER ICOFOR(JGFORC)
  323. REAL*8 XFORCE(3,JGFORC)
  324. ENDSEGMENT
  325.  
  326.  
  327. C Enregistrement des MOMENTS
  328. SEGMENT MMOMEN
  329. C JGMOME : Nombre de MOMENTS dans le MODELE
  330. C NBMDIF : Nombre d''ID de MOMENTS
  331. C IDMOME : ID lue pour cette MOMENTS
  332. C ILIMOM : Liste des ID de MOMENTS differentes
  333. C NBEMOM : nombre d''elements PO1I dans cet ID de MOMENTS
  334. C INOMOM : ID lue du noeud pour cet ID de MOMENTS
  335. C ICOMOM : Correspondance entre le numéro de la carte MOMENTS et la position de son ID dans liste ILIFOR
  336. C XMOMEN : Flottants lus pour la MOMENTS
  337. INTEGER IDMOME(JGMOME)
  338. INTEGER ILIMOM(NBMDIF)
  339. INTEGER NBEMOM(NBMDIF)
  340. INTEGER INOMOM(JGMOME)
  341. INTEGER ICOMOM(JGMOME)
  342. REAL*8 XMOMEN(3,JGMOME)
  343. ENDSEGMENT
  344.  
  345. C***********************************************************************
  346. C Début du programme
  347. C***********************************************************************
  348. C Création de la table VIDE de sortie
  349. M=0
  350. SEGINI,MTABLE
  351.  
  352. C Initialisation des Segments
  353. NBNPTS = 0
  354. NELTOT = 0
  355. NBCONN = 0
  356. NBSYST = 0
  357. NBRBE2 = 0
  358. NBSPC = 0
  359. NBTEMP = 0
  360. NBFORC = 0
  361. NBMOME = 0
  362.  
  363. INCJGN = 50
  364. INCJGE = 50
  365. INCJCO = 50
  366. INCJSY = 50
  367. INCJGR = 50
  368. INCSPC = 50
  369. INCTEM = 50
  370. INCFOR = 50
  371. INCMOM = 50
  372.  
  373. C INCJGN : Incrément de NOEUD
  374. C INCJGE : Incrément d' ELEMENT
  375. C INCJCO : Incrément de CONNECTIVITE
  376. C INCJSY : Incrément de SYSTEME
  377. C INCJGR : Incrément de RBE2 de type different
  378. C INCSPC : Incrément de SPC
  379. C INCTEM : Incrément de TEMPERATURE
  380. C INCFOR : Incrément de FORCES
  381. C INCMOM : Incrément de MOMENTS
  382.  
  383. JGNOLO=INCJGN
  384. JGNOLU=INCJGN
  385. SEGINI,MLINOE
  386.  
  387. JGELLU=INCJGE
  388. JGELLO=INCJGE
  389. JELCON=INCJCO
  390. SEGINI,MLIELE
  391.  
  392. NBPROP = 0
  393. SEGINI,MPROP
  394.  
  395. JGSYST = 0
  396. SEGINI,MSYSTE
  397.  
  398. JGRBE2 = 0
  399. SEGINI,MRBE2
  400.  
  401. JGSPC = 0
  402. NBSDIF = 0
  403. SEGINI,MSPC
  404.  
  405. JGTEMP = 0
  406. NBTDIF = 0
  407. SEGINI,MTEMP
  408.  
  409. JGFORC = 0
  410. NBFDIF = 0
  411. SEGINI,MFORCE
  412.  
  413. JGMOME = 0
  414. NBMDIF = 0
  415. SEGINI,MMOMEN
  416.  
  417. NBLIGN = 0
  418. BEGIN = .FALSE.
  419. PRECID = .FALSE.
  420.  
  421. C Remplissage de IELEQ1, IELEQ2, NBNOE1, NBNOE2
  422. DO 9 INDICE = 1, NBGEO1
  423. COLO4=ELCAS1(INDICE)
  424. CALL PLACE(NOMS,100,IRETO3,COLO4)
  425. IELEQ1(INDICE)=IRETO3
  426. NBNOE1(INDICE)=NBNNE(IRETO3)
  427.  
  428. COLO4=ELCAS2(INDICE)
  429. CALL PLACE(NOMS,100,IRETO3,COLO4)
  430. IELEQ2(INDICE)=IRETO3
  431. NBNOE2(INDICE)=NBNNE(IRETO3)
  432. 9 CONTINUE
  433.  
  434. C Mise à zéro de NONLUE
  435. DO INDICE=1,NBGEO1+NBSY+NBCART
  436. NONLUE(INDICE)=0
  437. ENDDO
  438.  
  439.  
  440. C Lecture des arguments : Nom du fichier à lire (toto.nas)
  441. CALL LIRCHA(FicNAS,1,IRETO1)
  442. IF (IERR.NE.0) RETURN
  443.  
  444. C Par defaut, Erreur Cast3M numero 424
  445. C Erreur 424 : Problème %i1 en ouvrant le fichier : %m1:40
  446. iOK=424
  447. L=LEN(FicNAS)
  448. MOTERR=FicNAS(1:L)
  449. INTERR(1)=0
  450.  
  451. C Ouverture du fichier .nas
  452. CLOSE(UNIT=IUNAS,ERR=991)
  453. OPEN (UNIT=IUNAS,STATUS='OLD',FILE=FicNAS(1:L),
  454. & IOSTAT=IOS,FORM='FORMATTED')
  455.  
  456. C Traitement des erreurs d'ouverture des fichiers
  457. IF (IOS.NE.0) THEN
  458. INTERR(1)=IOS
  459. C IF (DEBCB) THEN
  460. C WRITE(IOIMP,*) 'Fichier introuvable : ',FicNAS
  461. C ENDIF
  462. CALL ERREUR(424)
  463. RETURN
  464. ELSE
  465. C IF (DEBCB) THEN
  466. C WRITE(IOIMP,*) 'Ouverture OK du fichier NAS'
  467. C ENDIF
  468.  
  469. C Changement de dimension (si necessaire)
  470. iOK=0
  471. IDIMI=IDIM
  472. IDIMF=3
  473. IF (IDIMF.NE.IDIMI) THEN
  474. CALL ECRENT(IDIMF)
  475. CALL ECRCHA('DIME')
  476. CALL OPTION(1)
  477. IF (IERR.NE.0) THEN
  478. CALL ERREUR(IERR)
  479. RETURN
  480. ENDIF
  481. WRITE(IOIMP,*) ' '
  482. WRITE(IOIMP,*) ' Passage en DIMEnsion 3'
  483. WRITE(IOIMP,*) ' '
  484. ENDIF
  485. ENDIF
  486. idimp1=IDIM+1
  487. segact mcoord*mod
  488. NBANC=nbpts
  489. NBPTS=NBANC+JGNOLO
  490. SEGADJ,MCOORD
  491.  
  492. 10 CONTINUE
  493. C Lecture de la ligne complete (80 caracteres)
  494. 1000 FORMAT(A80)
  495. READ(IUNAS,1000,ERR=990,END=100) LIGNE
  496. ITLIGN = 80
  497. CALL LENCHA(LIGNE,ITLIGN)
  498. INDXE=INDEX(CARAOK,LIGNE(ITLIGN:ITLIGN))
  499. IF (INDXE .EQ. 0) LIGNE(ITLIGN:ITLIGN)=' '
  500. NBLIGN = NBLIGN + 1
  501. C IF (DEBCB) THEN
  502. C WRITE(IOIMP,*),NBLIGN,LIGNE
  503. C ENDIF
  504.  
  505. C Detection de la ligne BEGIN BULK
  506. IF (LIGNE(1:10) .EQ. 'BEGIN BULK') THEN
  507. C WRITE(IOIMP,*),'BEGIN BULK, LIGNE',NBLIGN
  508. BEGIN=.TRUE.
  509. GOTO 100
  510. ENDIF
  511. GOTO 10
  512.  
  513. 100 CONTINUE
  514.  
  515. C Cas ou BEGIN BULK n'a pas ete lu...
  516. IF (BEGIN .EQV. .FALSE.) THEN
  517. CALL ERREUR(21)
  518. RETURN
  519. ENDIF
  520.  
  521. C***********************************************************************
  522. C Lecture des cartes NASTRAN dans le fichier
  523. C***********************************************************************
  524. C Boucle "infinie" sur la lecture des lignes
  525. 11 CONTINUE
  526. C Acquisition d''une nouvelle ligne
  527. READ(IUNAS,1000,ERR=990,END=990) LIGNE
  528. CALL LENCHA(LIGNE,ITLIGN)
  529. INDXE=INDEX(CARAOK,LIGNE(ITLIGN:ITLIGN))
  530. IF (INDXE .EQ. 0) LIGNE(ITLIGN:ITLIGN)=' '
  531. NBLIGN = NBLIGN + 1
  532.  
  533. C Premiere lettre de la ligne
  534. IF ((LIGNE(1:1) .EQ. ' ') .OR. (LIGNE(1:1) .EQ. '$')) GOTO 11
  535.  
  536. C Premier mot de la ligne
  537. IDEB = 1
  538. IFIN = MIN(IDEB + 8 - 1,ITLIGN)
  539. COLO8=LIGNE(IDEB:IFIN)
  540.  
  541. IRETO1 = 0
  542. C Recherche dans le DATA des PROPERTY
  543. CALL PLACE(PROTYP,NPROPE ,IRETO1,COLO8)
  544. IF (IRETO1 .NE. 0) THEN
  545. WRITE(IOIMP,*) 'PROPERTY non traitee : ',PROTYP(IRETO1)
  546. GOTO 11
  547. ENDIF
  548.  
  549. IRETO1 = 0
  550. IRETO2 = 0
  551. C Recherche dans le DATA des éléments géométriques
  552. CALL PLACE(GETYPE,NBGEO1+NBSY+NBCART,IRETO1 ,COLO8)
  553. IF (IRETO1 .EQ. 0) GOTO 11
  554.  
  555. 12 CONTINUE
  556.  
  557. C Lecture simple ou double precision
  558. IF ((MOD(IRETO1,2)) .EQ. 0) THEN
  559. PRECID = .TRUE.
  560. NCOLOL = 4
  561. LCOL = LEN(COLO16)
  562. C PRINT *,'Lecture en double precision ',GETYPE(IRETO1)
  563. ELSE
  564. PRECID = .FALSE.
  565. NCOLOL = 8
  566. LCOL = LEN(COLO8)
  567. C PRINT *,'Lecture en simple precision ',GETYPE(IRETO1)
  568. ENDIF
  569.  
  570. IDEB = 8 + 1
  571. IFIN = MIN(IDEB + LCOL - 1,ITLIGN)
  572.  
  573. C Cas des POINTS
  574. IF ((IRETO1 .EQ. 1) .OR. (IRETO1 .EQ. 2)) THEN
  575. C PRINT *,':',GETYPE(IRETO1),':',LIGNE(IDEB:IFIN),':',IDEB
  576. READ(LIGNE(IDEB:IFIN),'(I80)',ERR=11,IOSTAT=IOSTA1) IDLU
  577. IF (IOSTA1 .NE. 0) THEN
  578. moterr ='READ (IOSTAT)'
  579. interr(1) = IOSTA1
  580. CALL ERREUR(873)
  581. RETURN
  582. ENDIF
  583.  
  584. C PRINT *,'ID Noeud :',IDLU
  585. NBNPTS = NBNPTS + 1
  586.  
  587. C Ajustement des SEGMENTS MLINOE et MCOORD
  588. IF( NBNPTS .GT. JGNOLO) THEN
  589. INCJGN = 2 * INCJGN
  590. JGNOLO = JGNOLO + INCJGN
  591. NBPTS = JGNOLO + NBANC
  592. SEGADJ,MLINOE,MCOORD
  593. C PRINT * ,'MLINOE Ajustement intermediaire'
  594. ENDIF
  595.  
  596. IF(IDLU.GT.JGNOLU) THEN
  597. INCJGN = 2 * INCJGN
  598. JGNOLU = IDLU + INCJGN
  599. SEGADJ,MLINOE
  600. ENDIF
  601. MLINOE.ICORNO(IDLU) =NBNPTS
  602.  
  603. C Lecture d''un ID de systeme local (COLONNE 2)
  604. IDEB = IFIN + 1
  605. IFIN = MIN(IDEB + LCOL - 1,ITLIGN)
  606. READ(LIGNE(IDEB:IFIN),'(I80)',ERR=11,IOSTAT=IOSSY1) IDSYS
  607. IF (IOSSY1 .NE. 0) IDSYS = 0
  608. MLINOE.ISYSTE(IDLU) = IDSYS
  609.  
  610. C Lecture des Coordonnees
  611. DO IFLOT=1,3
  612. IF ((IFLOT .EQ.3) .AND. (PRECID)) THEN
  613. C Lecture de la ligne suivante
  614. READ(IUNAS,1000,ERR=990,END=990) LIGNE
  615. CALL LENCHA(LIGNE,ITLIGN)
  616. INDXE=INDEX(CARAOK,LIGNE(ITLIGN:ITLIGN))
  617. IF (INDXE .EQ. 0) LIGNE(ITLIGN:ITLIGN)=' '
  618. NBLIGN = NBLIGN + 1
  619. IDEB = 8 + 1
  620. IFIN = MIN(IDEB + LCOL - 1,ITLIGN)
  621. ELSE
  622. IDEB = IFIN + 1
  623. IFIN = MIN(IDEB + LCOL - 1,ITLIGN)
  624. ENDIF
  625.  
  626. C Correction à la volée d'une caractéristique du format .nas le 'E' n'est pas toujours mis pour les puissances négatives
  627. IF (PRECID) THEN
  628. COLO16= LIGNE(IDEB:IFIN)
  629. COLO17= COLO16//' '
  630. IF(COLO16(1:1).EQ.'-')THEN
  631. IADD = 1
  632. ELSE
  633. IADD = 0
  634. ENDIF
  635.  
  636. DO 16 ICHARA = 1+IADD, LCOL
  637. IF((COLO16(ICHARA:ICHARA).EQ.'-').AND.
  638. & (COLO16(ICHARA-1:ICHARA-1).NE.'e').AND.
  639. & (COLO16(ICHARA-1:ICHARA-1).NE.'E').AND.
  640. & (COLO16(ICHARA-1:ICHARA-1).NE.'d').AND.
  641. & (COLO16(ICHARA-1:ICHARA-1).NE.'D').AND.
  642. & (COLO16(ICHARA-1:ICHARA-1).NE.' '))THEN
  643. COLO17 =COLO16(1:ICHARA-1)//'E-'//
  644. & COLO16(ICHARA+1:LCOL)
  645. C PRINT*, 'Nouvelle COLO17 : ',COLO17
  646. ENDIF
  647. 16 CONTINUE
  648.  
  649. READ(COLO17,'(G80.0)',ERR=11,IOSTAT=IOSTA1) Flot1
  650. IF (IOSTA1 .NE. 0) THEN
  651. moterr ='READ (IOSTAT)'
  652. interr(1) = IOSTA1
  653. CALL ERREUR(873)
  654. RETURN
  655. ENDIF
  656.  
  657. ELSE
  658. COLO8 = LIGNE(IDEB:IFIN)
  659. COLO9 = COLO8//' '
  660. IF(COLO8(1:1).EQ.'-')THEN
  661. IADD = 1
  662. ELSE
  663. IADD = 0
  664. ENDIF
  665.  
  666. DO 15 ICHARA = 1+IADD, LCOL
  667. IF((COLO8(ICHARA:ICHARA).EQ.'-').AND.
  668. & (COLO8(ICHARA-1:ICHARA-1).NE.'e').AND.
  669. & (COLO8(ICHARA-1:ICHARA-1).NE.'E').AND.
  670. & (COLO8(ICHARA-1:ICHARA-1).NE.'d').AND.
  671. & (COLO8(ICHARA-1:ICHARA-1).NE.'D').AND.
  672. & (COLO8(ICHARA-1:ICHARA-1).NE.' '))THEN
  673. COLO9 =COLO8(1:ICHARA-1)//'E-'//COLO8(ICHARA+1:LCOL)
  674. C PRINT *, 'Nouvelle COLO9 : ',COLO9
  675. ENDIF
  676. 15 CONTINUE
  677.  
  678. READ(COLO9,'(G80.0)',ERR=11,IOSTAT=IOSTA1) Flot1
  679. IF (IOSTA1 .NE. 0) THEN
  680. moterr ='READ (IOSTAT)'
  681. interr(1) = IOSTA1
  682. CALL ERREUR(873)
  683. RETURN
  684. ENDIF
  685. ENDIF
  686.  
  687. j=(NBANC+NBNPTS-1)*idimp1
  688. MCOORD.XCOOR(j+IFLOT) =Flot1
  689. MLINOE.XCOLU(IFLOT,IDLU)=Flot1
  690. C PRINT *,IDLU,Flot1
  691. ENDDO
  692.  
  693. CC Lecture d''un ID de systeme local (COLONNE 2 de la LIGNE 2)
  694. C IDEB = IFIN + 1
  695. C IFIN = MIN(IDEB + LCOL - 1,ITLIGN)
  696. C READ(LIGNE(IDEB:IFIN),*,ERR=11,IOSTAT=IOSSY2) IDSYS2
  697. C IF (IOSSY2 .EQ. 0) THEN
  698. C IF ((IOSSY1 .EQ. 0) .AND. (IDSYS .NE. IDSYS2)) THEN
  699. CC Lecture de 2 systemes differents pour ce noeud
  700. C WRITE(IOIMP,*) '2 systeme different pour le noeud',IDLU
  701. C CALL ERREUR(21)
  702. C RETURN
  703. C ENDIF
  704. C
  705. CC PRINT *, IDLU, 'Systeme ID :',IDSYS2,'COLONNE 2 LIGNE 2'
  706. C MLINOE.ISYSTE(IDLU) = IDSYS2
  707. C IDSYS = IDSYS2
  708. C ENDIF
  709.  
  710. C Conversion à la volée des coordonnées en fonction du type de repère
  711. IF (IDSYS .NE. 0) THEN
  712. DO NUMSYS=1,NBSYST
  713. IF(MSYSTE.IDSYST(NUMSYS) .EQ. IDSYS) GOTO 160
  714. ENDDO
  715. WRITE(IOIMP,*) 'On n''a pas lu le repere d''ID:',IDSYS
  716. CALL ERREUR(21)
  717. RETURN
  718.  
  719. 160 CONTINUE
  720. ITYPES = MSYSTE.ITYSYS(NUMSYS)
  721. C PRINT *,'Type de repere', ITYPES, NUMSYS
  722. XFL(1) = REAL(0.D0)
  723. XFL(2) = REAL(0.D0)
  724. XFL(3) = REAL(0.D0)
  725. j=(NBANC+NBNPTS-1)*idimp1
  726. IF (ITYPES .EQ. 1) THEN
  727. C Transformation Cartesienne
  728. C Le X lu devient mon Y
  729. XLU=MCOORD.XCOOR(j+1)
  730. MCOORD.XCOOR(j+1)=MCOORD.XCOOR(j+2)
  731. MCOORD.XCOOR(j+2)=XLU
  732.  
  733. ELSEIF (ITYPES .EQ. 2) THEN
  734. C Transformation Cylindrique
  735. C Passage en Cartesien Local X', Y', Z'
  736. RFLO = MCOORD.XCOOR(j+1)
  737. TETA = MCOORD.XCOOR(j+2) * (2.D0*XPI) / 360.D0
  738.  
  739. MCOORD.XCOOR(j+1) = RFLO * COS(TETA)
  740. MCOORD.XCOOR(j+2) = -RFLO * SIN(TETA)
  741.  
  742. C Le X calculé devient mon -Z
  743. XLU=MCOORD.XCOOR(j+1)
  744. MCOORD.XCOOR(j+1)=MCOORD.XCOOR(j+3)
  745. MCOORD.XCOOR(j+3)=-XLU
  746.  
  747. ELSEIF (ITYPES .EQ. 3) THEN
  748. C Transformation Spherique
  749. C Passage en Cartesien Local X', Y', Z'
  750. RFLO = MCOORD.XCOOR(j+1)
  751. PHI = MCOORD.XCOOR(j+2) * (2.D0*XPI) / 360.D0
  752. TETA = MCOORD.XCOOR(j+3) * (2.D0*XPI) / 360.D0
  753.  
  754. MCOORD.XCOOR(j+1) = RFLO * SIN(PHI) * COS(TETA)
  755. MCOORD.XCOOR(j+2) = RFLO * SIN(PHI) * SIN(TETA)
  756. MCOORD.XCOOR(j+3) = RFLO * COS(PHI)
  757.  
  758. C Le X calculé devient mon Y
  759. XLU=MCOORD.XCOOR(j+1)
  760. MCOORD.XCOOR(j+1)=MCOORD.XCOOR(j+2)
  761. MCOORD.XCOOR(j+2)=XLU
  762. ELSE
  763. WRITE(IOIMP,*) 'Systeme de type inconnu :',ITYPES
  764. CALL ERREUR(21)
  765. RETURN
  766. ENDIF
  767.  
  768. C Passage en coordonnées X,Y,Z centrées sur le repère Local
  769. DO III=1,3
  770. DO IFLOT=1,3
  771. Flot = MCOORD.XCOOR(j+IFLOT)
  772. INDICE=(III-1)*3 + IFLOT
  773. XFL(III)=XFL(III)+ MSYSTE.SCOOR2(INDICE,NUMSYS)*Flot
  774. C PRINT *,INDICE,SYSCOR(INDICE,NUMSYS),Flot,XFL(III)
  775. ENDDO
  776. ENDDO
  777.  
  778. C Remplacement dans MCOORD
  779. DO IFLOT=1,3
  780. C Translation dans le repere X,Y,Z général & Remplacement dans MCOORD
  781. XFL(IFLOT) = XFL(IFLOT) + MSYSTE.SYSCOR(IFLOT,NUMSYS)
  782. C PRINT *,IFLOT,NUMSYS, MSYSTE.SYSCOR(IFLOT,NUMSYS)
  783. MCOORD.XCOOR(j+IFLOT)=XFL(IFLOT)
  784. ENDDO
  785. ENDIF
  786.  
  787. GOTO 11
  788.  
  789. ELSEIF (IRETO1 .LE. NBGEO1) THEN
  790. IF ((IRETO1 .EQ. 3) .OR. (IRETO1 .EQ. 4)) THEN
  791. C Cas des ELEMENTS RBE2
  792. NELTOT = NELTOT + 1
  793. C Ajustement du segment MLIELE
  794. IF(NELTOT .GT. JGELLO) THEN
  795. INCJGE = 2 * INCJGE
  796. JGELLO = NELTOT + INCJGE
  797. SEGADJ,MLIELE
  798. ENDIF
  799.  
  800. C Lecture du numero d'element
  801. READ(LIGNE(IDEB:IFIN),'(I80)',ERR=11,IOSTAT=IOSTA1) IDLU
  802. IF (IOSTA1 .NE. 0) THEN
  803. moterr ='READ (IOSTAT)'
  804. interr(1) = IOSTA1
  805. CALL ERREUR(873)
  806. RETURN
  807. ENDIF
  808. C PRINT *,' '
  809. C PRINT *,'ELEMENT :',IDLU, GETYPE(IRETO1),NELTOT
  810.  
  811. IF (IDLU .GT. JGELLU) THEN
  812. INCJGE = 2 * INCJGE
  813. JGELLU = IDLU + INCJGE
  814. SEGADJ,MLIELE
  815. ENDIF
  816.  
  817. C Enregistrement de la correspondance
  818. MLIELE.ICOREL(NELTOT)= IDLU
  819. MLIELE.IELTYP(IDLU) = IELEQ1(IRETO1)
  820.  
  821. IDEB = IFIN + 1
  822. IFIN = MIN(IDEB + LCOL - 1,ITLIGN)
  823.  
  824. C Lecture du Noeud Maitre
  825. C PRINT *,'LIGNE(IDEB:IFIN):',LIGNE(IDEB:IFIN),':'
  826. READ(LIGNE(IDEB:IFIN),'(I80)',ERR=11,IOSTAT=IOSTA1) INOEMA
  827. IF (IOSTA1 .NE. 0) THEN
  828. moterr ='READ (IOSTAT)'
  829. interr(1) = IOSTA1
  830. CALL ERREUR(873)
  831. RETURN
  832. ENDIF
  833. C Enregistrer ou débute la lecture de la connectivité
  834. MLIELE.IELCON(IDLU)=NBCONN+1
  835. NBCONN = NBCONN + 1
  836.  
  837. C Ajustement du segment MLIELE
  838. IF (NBCONN .GT. JELCON) THEN
  839. INCJCO = 2 * INCJCO
  840. JELCON = NBCONN + INCJCO
  841. SEGADJ,MLIELE
  842. ENDIF
  843. MLIELE.ICONTO(NBCONN)=INOEMA
  844. MLIELE.IELNBN(IDLU) =MLIELE.IELNBN(IDLU) + 1
  845.  
  846. IDEB = IFIN + 1
  847. IFIN = MIN(IDEB + LCOL - 1,ITLIGN)
  848.  
  849. C Lecture du code de bloquage
  850. C PRINT *,'LIGNE(IDEB:IFIN):',LIGNE(IDEB:IFIN),':'
  851. READ(LIGNE(IDEB:IFIN),'(I80)',ERR=11,IOSTAT=IOSTA1) IBLOQ
  852. IF (IOSTA1 .NE. 0) THEN
  853. moterr ='READ (IOSTAT)'
  854. interr(1) = IOSTA1
  855. CALL ERREUR(873)
  856. RETURN
  857. ENDIF
  858. MLIELE.IRBE2(IDLU)=IBLOQ
  859.  
  860. NBRBE2=NBRBE2 + 1
  861.  
  862. IF (NBRBE2 .GT. JGRBE2) THEN
  863. INCJGR = 2 * INCJGR
  864. JGRBE2 = JGRBE2 + INCJGR
  865. SEGADJ,MRBE2
  866. ENDIF
  867. MRBE2.IBLRBE(NBRBE2) = IBLOQ
  868. MLIELE.IDPROP(IDLU) = NBRBE2
  869.  
  870. C Lecture de la connectivite
  871. C PRINT *, 'IBLOQ',IBLOQ,NBRBE2
  872. NUMCOL = 3
  873. 170 CONTINUE
  874. IRETO2 = 0
  875. NUMCOL = NUMCOL + 1
  876. IDEB = IFIN + 1
  877. IFIN = MIN(IDEB + LCOL - 1,ITLIGN)
  878. C PRINT *,MLIELE.IELNBN(IDLU)+1,':',LIGNE(IDEB:IFIN),':'
  879. READ(LIGNE(IDEB:IFIN),'(I80)',ERR=170,IOSTAT=IOSTA1) INOELU
  880. IF (IOSTA1 .NE. 0) GOTO 11
  881.  
  882. NBCONN = NBCONN + 1
  883.  
  884. C Ajustement du segment MLIELE
  885. IF (NBCONN .GT. JELCON) THEN
  886. INCJCO = 2 * INCJCO
  887. JELCON = NBCONN + INCJCO
  888. SEGADJ,MLIELE
  889. ENDIF
  890.  
  891. C Enregistrer la connectivité de l'élément et le nombre de noeuds
  892. MLIELE.ICONTO(NBCONN)= INOELU
  893. MLIELE.IELNBN(IDLU) = MLIELE.IELNBN(IDLU) + 1
  894. MRBE2.NELRBE(NBRBE2) = MRBE2.NELRBE(NBRBE2) + 1
  895.  
  896. IF (NUMCOL .EQ. NCOLOL) THEN
  897.  
  898. C Lecture d'une nouvelle ligne pour savoir si on continue a lire
  899. READ(IUNAS,1000,ERR=990,END=990) LIGNE
  900. C PRINT * ,'Nouvelle ligne : NBLIGN,'
  901. CALL LENCHA(LIGNE,ITLIGN)
  902. INDXE=INDEX(CARAOK,LIGNE(ITLIGN:ITLIGN))
  903. IF (INDXE .EQ. 0) LIGNE(ITLIGN:ITLIGN)=' '
  904. NBLIGN = NBLIGN + 1
  905.  
  906. C Premiere lettre de la ligne
  907. IF ((LIGNE(1:1).EQ.' ') .OR. (LIGNE(1:1).EQ.'$')) GOTO 11
  908.  
  909. C Premier mot de la ligne
  910. COLO8=LIGNE(1:8)
  911.  
  912. IRETO2=0
  913. C Recherche dans le DATA des PROPERTY
  914. CALL PLACE(PROTYP,NPROPE ,IRETO2,COLO8)
  915. IF (IRETO2 .NE. 0) THEN
  916. WRITE(IOIMP,*) 'PROPERTY non traitee : ',PROTYP(IRETO1)
  917. GOTO 11
  918. ENDIF
  919.  
  920. IRETO2=0
  921. C Recherche dans le DATA des éléments géométriques
  922. CALL PLACE(GETYPE,NBGEO1,IRETO2,COLO8)
  923. IF (IRETO2.NE.0) GOTO 12
  924.  
  925. IFIN = 8
  926. NUMCOL = 0
  927. ENDIF
  928. GOTO 170
  929.  
  930. ELSEIF ((IRETO1 .EQ. 5) .OR. (IRETO1 .EQ. 6)) THEN
  931. C Cas des ELEMENTS RBE3
  932. IF (NONLUE(IRETO1) .EQ. 0) THEN
  933. WRITE(IOIMP,*) 'Elements non traites : ',GETYPE(IRETO1)
  934. NONLUE(IRETO1)=1
  935. ENDIF
  936.  
  937. ELSEIF ((IRETO1 .GE. 27) .AND. (IRETO1 .LE. 32)) THEN
  938. C Cas des ELEMENTS RBAR, CELAS2
  939. IF (NONLUE(IRETO1) .EQ. 0) THEN
  940. WRITE(IOIMP,*) 'Elements non traites : ',GETYPE(IRETO1)
  941. NONLUE(IRETO1)=1
  942. ENDIF
  943.  
  944. ELSE
  945. C Cas des ELEMENTS Classiques
  946. NELTOT = NELTOT + 1
  947. C Ajustement du segment MLIELE
  948. IF(NELTOT .GT. JGELLO) THEN
  949. INCJGE = 2 * INCJGE
  950. JGELLO = NELTOT + INCJGE
  951. SEGADJ,MLIELE
  952. ENDIF
  953.  
  954. C Lecture du numero d'element
  955. C PRINT *,'LIGNE(IDEB:IFIN):',LIGNE(IDEB:IFIN),':'
  956. READ(LIGNE(IDEB:IFIN),'(I80)',ERR=11,IOSTAT=IOSTA1) IDLU
  957. IF (IOSTA1 .NE. 0) THEN
  958. moterr ='READ (IOSTAT)'
  959. interr(1) = IOSTA1
  960. CALL ERREUR(873)
  961. RETURN
  962. ENDIF
  963.  
  964. C PRINT *,' '
  965. C PRINT *,'ELEMENT :',IDLU, GETYPE(IRETO1),NELTOT
  966.  
  967. IF (IDLU .GT. JGELLU) THEN
  968. INCJGE = 2 * INCJGE
  969. JGELLU = IDLU + INCJGE
  970. SEGADJ,MLIELE
  971. ENDIF
  972.  
  973. C Enregistrement de la correspondance
  974. MLIELE.ICOREL(NELTOT)= IDLU
  975.  
  976. IDEB = IFIN + 1
  977. IFIN = MIN(IDEB + LCOL - 1,ITLIGN)
  978.  
  979. C Lecture de la Property à laquelle appartient l'élément
  980. C PRINT *,'LIGNE(IDEB:IFIN):',LIGNE(IDEB:IFIN),':'
  981. READ(LIGNE(IDEB:IFIN),'(I80)',ERR=11,IOSTAT=IOSTA1) IPLU
  982. IF (IOSTA1 .NE. 0) THEN
  983. moterr ='READ (IOSTAT)'
  984. interr(1) = IOSTA1
  985. CALL ERREUR(873)
  986. RETURN
  987. ENDIF
  988. MLIELE.IDPROP(IDLU)=IPLU
  989.  
  990. C Ajustement du SEGMENT MPROP
  991. DO IP=1,NBPROP
  992. IF (MPROP.ICOPRO(IP) .EQ. IPLU) GOTO 190
  993. ENDDO
  994. NBPROP = NBPROP + 1
  995. IP = NBPROP
  996. SEGADJ, MPROP
  997. C PRINT *,'NBR PROP =',NBPROP,IPLU
  998. SEGADJ,MLIELE
  999. MPROP.ICOPRO(NBPROP) = IPLU
  1000. 190 CONTINUE
  1001.  
  1002. C Lecture de la connectivite
  1003. NUMCOL = 2
  1004. C Enregistrer ou débute la lecture de la connectivité
  1005. MLIELE.IELCON(IDLU)=NBCONN+1
  1006. 200 CONTINUE
  1007. IRETO2 = 0
  1008. NUMCOL = NUMCOL + 1
  1009. IDEB = IFIN + 1
  1010. IFIN = IDEB + LCOL - 1
  1011. C PRINT *,MLIELE.IELNBN(IDLU)+1,':',LIGNE(IDEB:IFIN),':'
  1012. ** write(6,*) 'ideb ifin ligne',ideb,ifin,ligne(ideb:ifin)
  1013. IF (IFIN.GT.80) GOTO 13
  1014. IF (LIGNE(IDEB:IFIN).EQ.' ') GOTO 13
  1015. READ(LIGNE(IDEB:IFIN),'(I80)',ERR=200,IOSTAT=IOSTA1) INOELU
  1016. IF (IOSTA1 .NE. 0) GOTO 13
  1017.  
  1018. NBCONN = NBCONN + 1
  1019.  
  1020. C Ajustement du segment MLIELE
  1021. IF (NBCONN .GT. JELCON) THEN
  1022. INCJCO = 2 * INCJCO
  1023. JELCON = NBCONN + INCJCO
  1024. SEGADJ,MLIELE
  1025. ENDIF
  1026.  
  1027. C Enregistrer la connectivité de l'élément et le nombre de noeuds
  1028. MLIELE.ICONTO(NBCONN)=INOELU
  1029. MLIELE.IELNBN(IDLU) =MLIELE.IELNBN(IDLU) + 1
  1030.  
  1031. IF (NUMCOL .EQ. NCOLOL) THEN
  1032.  
  1033. C Lecture d'une nouvelle ligne pour savoir si on continue a lire
  1034. READ(IUNAS,1000,ERR=990,END=990) LIGNE
  1035. C PRINT * ,'Nouvelle ligne : NBLIGN,'
  1036. CALL LENCHA(LIGNE,ITLIGN)
  1037. INDXE=INDEX(CARAOK,LIGNE(ITLIGN:ITLIGN))
  1038. IF (INDXE .EQ. 0) LIGNE(ITLIGN:ITLIGN)=' '
  1039. NBLIGN = NBLIGN + 1
  1040.  
  1041. C Premiere lettre de la ligne
  1042. IF ((LIGNE(1:1).EQ.' ') .OR. (LIGNE(1:1).EQ.'$')) GOTO 13
  1043.  
  1044. C Premier mot de la ligne
  1045. COLO8=LIGNE(1:8)
  1046.  
  1047. IRETO2 =0
  1048. IRETO21=0
  1049. C Recherche dans le DATA des PROPERTY
  1050. CALL PLACE(PROTYP,NPROPE ,IRETO21,COLO8)
  1051. IF (IRETO21 .NE. 0) THEN
  1052. WRITE(IOIMP,*) 'PROPERTY non traitee : ',PROTYP(IRETO21)
  1053. GOTO 13
  1054. ENDIF
  1055.  
  1056. C Recherche dans le DATA des éléments géométriques
  1057. CALL PLACE(GETYPE,NBGEO1,IRETO2,COLO8)
  1058. IF (IRETO2.NE.0) GOTO 13
  1059.  
  1060. IFIN = 8
  1061. NUMCOL = 0
  1062. ENDIF
  1063. GOTO 200
  1064.  
  1065. 13 CONTINUE
  1066.  
  1067. IF (MLIELE.IELNBN(IDLU) .EQ. NBNOE1(IRETO1)) THEN
  1068. MPROP.ITYPRO(IELEQ1(IRETO1),IP)=
  1069. & MPROP.ITYPRO(IELEQ1(IRETO1),IP) + 1
  1070. MLIELE.IELTYP(IDLU) = IELEQ1(IRETO1)
  1071. C PRINT *,'Nombre de Noeuds :',MLIELE.IELNBN(IDLU),
  1072. C & IELEQ1(IRETO1),IP,MPROP.ITYPRO(IELEQ1(IRETO1),IP)
  1073. ELSEIF(MLIELE.IELNBN(IDLU) .EQ. NBNOE2(IRETO1)) THEN
  1074. MPROP.ITYPRO(IELEQ2(IRETO1),IP)=
  1075. & MPROP.ITYPRO(IELEQ2(IRETO1),IP) + 1
  1076. MLIELE.IELTYP(IDLU) = IELEQ2(IRETO1)
  1077. C PRINT *,'Nombre de Noeuds :',MLIELE.IELNBN(IDLU),
  1078. C & IELEQ2(IRETO1),IP,MPROP.ITYPRO(IELEQ1(IRETO1),IP)
  1079. ELSE
  1080. CALL ERREUR(21)
  1081. RETURN
  1082. ENDIF
  1083.  
  1084. IF (IRETO2 .NE. 0) THEN
  1085. GOTO 12
  1086. ELSE
  1087. GOTO 11
  1088. ENDIF
  1089. ENDIF
  1090.  
  1091. ELSEIF ((IRETO1 .GE. 33) .AND. (IRETO1 .LE. 38)) THEN
  1092. C Cas des systemes de coordonnees locales
  1093. IF ((IRETO1 .EQ. 33) .OR. (IRETO1 .EQ. 34)) THEN
  1094. C Repere Cartesien
  1095. ITYPES=1
  1096. ELSEIF((IRETO1 .EQ. 35) .OR. (IRETO1 .EQ. 36)) THEN
  1097. C Repere Cylindrique
  1098. ITYPES=2
  1099. ELSEIF((IRETO1 .EQ. 37) .OR. (IRETO1 .EQ. 38)) THEN
  1100. C Repere Spherique
  1101. ITYPES=3
  1102. ENDIF
  1103.  
  1104. C PRINT *,':',GETYPE(IRETO1),':',LIGNE(IDEB:IFIN),':',IDEB
  1105. READ(LIGNE(IDEB:IFIN),'(I80)',ERR=11,IOSTAT=IOSTA1) IDLU
  1106. IF (IOSTA1 .NE. 0) THEN
  1107. moterr ='READ (IOSTAT)'
  1108. interr(1) = IOSTA1
  1109. CALL ERREUR(873)
  1110. RETURN
  1111. ENDIF
  1112.  
  1113. NBSYST = NBSYST + 1
  1114.  
  1115. C Ajustement des SEGMENTS MLINOE et MCOORD
  1116. IF( NBSYST .GT. JGSYST) THEN
  1117. INCJSY = 2 * INCJSY
  1118. JGSYST = JGSYST + INCJSY
  1119. SEGADJ,MSYSTE
  1120. C PRINT * ,'MSYSTE Ajustement intermediaire'
  1121. ENDIF
  1122.  
  1123. MSYSTE.IDSYST(NBSYST)=IDLU
  1124. MSYSTE.ITYSYS(NBSYST)=ITYPES
  1125.  
  1126. C PRINT *,IDLU,ITYPES,NBSYST
  1127. C Lecture des 9 coordonnees du systeme
  1128. NUMCOL = 1
  1129. IDEB = IFIN + 1
  1130. IFIN = MIN(IDEB + LCOL - 1,ITLIGN)
  1131. DO IFLOT=1,9
  1132. NUMCOL = NUMCOL + 1
  1133. IF (NUMCOL .EQ. NCOLOL) THEN
  1134. C Lecture de la ligne suivante
  1135. READ(IUNAS,1000,ERR=990,END=990) LIGNE
  1136. CALL LENCHA(LIGNE,ITLIGN)
  1137. INDXE=INDEX(CARAOK,LIGNE(ITLIGN:ITLIGN))
  1138. IF (INDXE .EQ. 0) LIGNE(ITLIGN:ITLIGN)=' '
  1139. NBLIGN = NBLIGN + 1
  1140. IDEB = 8 + 1
  1141. IFIN = MIN(IDEB + LCOL - 1,ITLIGN)
  1142. NUMCOL = 0
  1143. ELSE
  1144. IDEB = IFIN + 1
  1145. IFIN = MIN(IDEB + LCOL - 1,ITLIGN)
  1146. ENDIF
  1147.  
  1148. C PRINT *,':',LIGNE(IDEB:IFIN),':'
  1149. READ(LIGNE(IDEB:IFIN),'(G80.0)',ERR=11,IOSTAT=IOSTA1) Flot1
  1150. IF (IOSTA1 .NE. 0) THEN
  1151. moterr ='READ (IOSTAT)'
  1152. interr(1) = IOSTA1
  1153. CALL ERREUR(873)
  1154. RETURN
  1155. ENDIF
  1156. MSYSTE.SYSCOR(IFLOT,NBSYST) = Flot1
  1157.  
  1158. C Ajout du troisieme point par produit vectoriel
  1159. IF (IFLOT .EQ. 9) THEN
  1160. F11 = MSYSTE.SYSCOR(1,NBSYST)
  1161. F12 = MSYSTE.SYSCOR(2,NBSYST)
  1162. F13 = MSYSTE.SYSCOR(3,NBSYST)
  1163.  
  1164. F21 = MSYSTE.SYSCOR(4,NBSYST)
  1165. F22 = MSYSTE.SYSCOR(5,NBSYST)
  1166. F23 = MSYSTE.SYSCOR(6,NBSYST)
  1167.  
  1168. F31 = MSYSTE.SYSCOR(7,NBSYST)
  1169. F32 = MSYSTE.SYSCOR(8,NBSYST)
  1170. F33 = MSYSTE.SYSCOR(9,NBSYST)
  1171.  
  1172. u1 = F21 - F11
  1173. u2 = F22 - F12
  1174. u3 = F23 - F13
  1175.  
  1176. v1 = F31 - F11
  1177. v2 = F32 - F12
  1178. v3 = F33 - F13
  1179.  
  1180. w1= u2*v3 - u3*v2
  1181. w2= u3*v1 - u1*v3
  1182. w3= u1*v2 - u2*v1
  1183.  
  1184. C Je norme les vecteurs
  1185. XL1 = SQRT(u1**2 + u2**2 + u3**2)
  1186. XL2 = SQRT(v1**2 + v2**2 + v3**2)
  1187. XL3 = SQRT(w1**2 + w2**2 + w3**2)
  1188.  
  1189. MSYSTE.SCOOR2(7,NBSYST) = u1/XL1
  1190. MSYSTE.SCOOR2(8,NBSYST) = u2/XL1
  1191. MSYSTE.SCOOR2(9,NBSYST) = u3/XL1
  1192.  
  1193. MSYSTE.SCOOR2(4,NBSYST) = v1/XL2
  1194. MSYSTE.SCOOR2(5,NBSYST) = v2/XL2
  1195. MSYSTE.SCOOR2(6,NBSYST) = v3/XL2
  1196.  
  1197. MSYSTE.SCOOR2(1,NBSYST) = w1/XL3
  1198. MSYSTE.SCOOR2(2,NBSYST) = w2/XL3
  1199. MSYSTE.SCOOR2(3,NBSYST) = w3/XL3
  1200.  
  1201. C F21 = (u1/XL1) + F11
  1202. C F22 = (u2/XL1) + F12
  1203. C F23 = (u3/XL1) + F13
  1204. C
  1205. C F31 = (v1/XL2) + F11
  1206. C F32 = (v2/XL2) + F12
  1207. C F33 = (v3/XL2) + F13
  1208. C
  1209. F41 = (w1/(MAX(XL1,XL2))) + F11
  1210. F42 = (w2/(MAX(XL1,XL2))) + F12
  1211. F43 = (w3/(MAX(XL1,XL2))) + F13
  1212. C
  1213. C MSYSTE.SYSCOR(4 ,NBSYST) = F21
  1214. C MSYSTE.SYSCOR(5 ,NBSYST) = F22
  1215. C MSYSTE.SYSCOR(6 ,NBSYST) = F23
  1216. C
  1217. C MSYSTE.SYSCOR(7 ,NBSYST) = F31
  1218. C MSYSTE.SYSCOR(8 ,NBSYST) = F32
  1219. C MSYSTE.SYSCOR(9 ,NBSYST) = F33
  1220. C
  1221. MSYSTE.SYSCOR(10,NBSYST) = F41
  1222. MSYSTE.SYSCOR(11,NBSYST) = F42
  1223. MSYSTE.SYSCOR(12,NBSYST) = F43
  1224.  
  1225. C PRINT *,u1 ,u2 ,u3
  1226. C PRINT *,v1 ,v2 ,v3
  1227. C PRINT *,w1 ,w2 ,w3
  1228. C
  1229. C PRINT *,'XL1,XL2,XL3',XL1,XL2,XL3
  1230. C PRINT *,F11 ,F12 ,F13
  1231. C PRINT *,F21 ,F22 ,F23
  1232. C PRINT *,F31 ,F32 ,F33
  1233. C PRINT *,F41, F42, F43
  1234. ENDIF
  1235. ENDDO
  1236. ELSEIF ((IRETO1 .GE. 39) .AND. (IRETO1 .LE. 42)) THEN
  1237. C Cas des SPC et SPCD
  1238. READ(LIGNE(IDEB:IFIN),'(I80)',ERR=11,IOSTAT=IOSTA1) IDLU
  1239. IF (IOSTA1 .NE. 0) THEN
  1240. moterr ='READ (IOSTAT)'
  1241. interr(1) = IOSTA1
  1242. CALL ERREUR(873)
  1243. RETURN
  1244. ENDIF
  1245. C PRINT *, GETYPE(IRETO1),IDLU,(IRETO1 - (NBGEO1+NBSY) + 1)/2
  1246. NBSPC = NBSPC + 1
  1247.  
  1248. IF (NBSPC .GT. JGSPC) THEN
  1249. INCSPC = 2 * INCSPC
  1250. JGSPC = JGSPC + INCSPC
  1251. SEGADJ, MSPC
  1252. ENDIF
  1253.  
  1254. DO IDVU=1,NBSDIF
  1255. IF (IDLU .EQ. MSPC.ILISPC(IDVU)) GOTO 301
  1256. ENDDO
  1257.  
  1258. NBSDIF = NBSDIF + 1
  1259. IDVU = NBSDIF
  1260. SEGADJ,MSPC
  1261. MSPC.ILISPC(NBSDIF)=IDLU
  1262.  
  1263. 301 CONTINUE
  1264. MSPC.NBESPC(IDVU) =MSPC.NBESPC(IDVU) + 1
  1265. MSPC.ICOSPC(NBSPC)=IDVU
  1266. IDEB = IFIN + 1
  1267. IFIN = MIN(IDEB + LCOL - 1,ITLIGN)
  1268. READ(LIGNE(IDEB:IFIN),'(I80)',ERR=11,IOSTAT=IOSTA1) INOLU
  1269. IF (IOSTA1 .NE. 0) THEN
  1270. moterr ='READ (IOSTAT)'
  1271. interr(1) = IOSTA1
  1272. CALL ERREUR(873)
  1273. RETURN
  1274. ENDIF
  1275.  
  1276. C Determination du HashCode des SPC
  1277. IDEB = IFIN + 1
  1278. IFIN = MIN(IDEB + LCOL - 1,ITLIGN)
  1279. READ(LIGNE(IDEB:IFIN),'(I80)',ERR=11,IOSTAT=IOSTA1) IBLOQ
  1280. IF (IOSTA1 .NE. 0) THEN
  1281. moterr ='READ (IOSTAT)'
  1282. interr(1) = IOSTA1
  1283. CALL ERREUR(873)
  1284. RETURN
  1285. ENDIF
  1286. IPOS1 = MIN(MAX(INDEX(LIGNE(IDEB:IFIN),'1') - 10,0),1)
  1287. IPOS2 = MIN(MAX(INDEX(LIGNE(IDEB:IFIN),'2') - 10,0),1)
  1288. IPOS3 = MIN(MAX(INDEX(LIGNE(IDEB:IFIN),'3') - 10,0),1)
  1289. IPOS4 = MIN(MAX(INDEX(LIGNE(IDEB:IFIN),'4') - 10,0),1)
  1290. IPOS5 = MIN(MAX(INDEX(LIGNE(IDEB:IFIN),'5') - 10,0),1)
  1291. IPOS6 = MIN(MAX(INDEX(LIGNE(IDEB:IFIN),'6') - 10,0),1)
  1292.  
  1293. IHCODE=IPOS1*(2**5) + IPOS2*(2**4) + IPOS3*(2**3) +
  1294. & IPOS4*(2**2) + IPOS5*(2) + IPOS6
  1295.  
  1296. IDEB = IFIN + 1
  1297. IFIN = MIN(IDEB + LCOL - 1,ITLIGN)
  1298. READ(LIGNE(IDEB:IFIN),'(G80.0)',ERR=11,IOSTAT=IOSTA1) FLOT1
  1299. IF (IOSTA1 .NE. 0) THEN
  1300. moterr ='READ (IOSTAT)'
  1301. interr(1) = IOSTA1
  1302. CALL ERREUR(873)
  1303. RETURN
  1304. ENDIF
  1305.  
  1306. MSPC.IDSPC (NBSPC)=IDLU
  1307. MSPC.INOSPC(NBSPC)=INOLU
  1308. MSPC.IBLOLU(NBSPC)=IBLOQ
  1309. MSPC.IHASHS(NBSPC)=IHCODE
  1310. MSPC.XSPC (NBSPC)=FLOT1
  1311. C PRINT *,IDLU,INOLU,IBLOQ,FLOT1,NBSDIF
  1312.  
  1313. ELSEIF ((IRETO1 .EQ. 43) .OR. (IRETO1 .EQ. 44)) THEN
  1314. C Cas des LOAD
  1315. IF (NONLUE(IRETO1) .EQ. 0) THEN
  1316. WRITE(IOIMP,*) 'Carte Non lue : ',GETYPE(IRETO1)
  1317. NONLUE(IRETO1)=1
  1318. ENDIF
  1319.  
  1320. ELSEIF ((IRETO1 .EQ. 45) .OR. (IRETO1 .EQ. 46)) THEN
  1321. C Cas des PLOAD
  1322. IF (NONLUE(IRETO1) .EQ. 0) THEN
  1323. WRITE(IOIMP,*) 'Carte Non lue : ',GETYPE(IRETO1)
  1324. NONLUE(IRETO1)=1
  1325. ENDIF
  1326.  
  1327. ELSEIF ((IRETO1 .EQ. 47) .OR. (IRETO1 .EQ. 48)) THEN
  1328. C Cas des PLOAD1
  1329. IF (NONLUE(IRETO1) .EQ. 0) THEN
  1330. WRITE(IOIMP,*) 'Carte Non lue : ',GETYPE(IRETO1)
  1331. NONLUE(IRETO1)=1
  1332. ENDIF
  1333.  
  1334. ELSEIF ((IRETO1 .EQ. 49) .OR. (IRETO1 .EQ. 50)) THEN
  1335. C Cas des PLOAD2
  1336. IF (NONLUE(IRETO1) .EQ. 0) THEN
  1337. WRITE(IOIMP,*) 'Carte Non lue : ',GETYPE(IRETO1)
  1338. NONLUE(IRETO1)=1
  1339. ENDIF
  1340.  
  1341. ELSEIF ((IRETO1 .EQ. 51) .OR. (IRETO1 .EQ. 52)) THEN
  1342. C Cas des PLOAD4
  1343. IF (NONLUE(IRETO1) .EQ. 0) THEN
  1344. WRITE(IOIMP,*) 'Carte Non lue : ',GETYPE(IRETO1)
  1345. NONLUE(IRETO1)=1
  1346. ENDIF
  1347.  
  1348. ELSEIF ((IRETO1 .EQ. 53) .OR. (IRETO1 .EQ. 54)) THEN
  1349. C Cas des FORCE
  1350. READ(LIGNE(IDEB:IFIN),'(I80)',ERR=11,IOSTAT=IOSTA1) IDLU
  1351. IF (IOSTA1 .NE. 0) THEN
  1352. moterr ='READ (IOSTAT)'
  1353. interr(1) = IOSTA1
  1354. CALL ERREUR(873)
  1355. RETURN
  1356. ENDIF
  1357. C PRINT *, GETYPE(IRETO1),IDLU,(IRETO1 - (NBGEO1+NBSY) + 1)/2
  1358. NBFORC = NBFORC + 1
  1359.  
  1360. IF (NBFORC .GT. JGFORC) THEN
  1361. INCFOR = 2 * INCFOR
  1362. JGFORC = JGFORC + INCFOR
  1363. SEGADJ, MFORCE
  1364. ENDIF
  1365.  
  1366. DO IDVU=1,NBFDIF
  1367. IF (IDLU .EQ. MFORCE.ILIFOR(IDVU)) GOTO 303
  1368. ENDDO
  1369.  
  1370. NBFDIF = NBFDIF + 1
  1371. IDVU = NBFDIF
  1372. SEGADJ,MFORCE
  1373. MFORCE.ILIFOR(NBFDIF)=IDLU
  1374.  
  1375. 303 CONTINUE
  1376. MFORCE.NBEFOR(IDVU )=MFORCE.NBEFOR(IDVU) + 1
  1377. MFORCE.ICOFOR(NBFORC)=IDVU
  1378. IDEB = IFIN + 1
  1379. IFIN = MIN(IDEB + LCOL - 1,ITLIGN)
  1380. READ(LIGNE(IDEB:IFIN),'(I80)',ERR=11,IOSTAT=IOSTA1) INOLU
  1381. IF (IOSTA1 .NE. 0) THEN
  1382. moterr ='READ (IOSTAT)'
  1383. interr(1) = IOSTA1
  1384. CALL ERREUR(873)
  1385. RETURN
  1386. ENDIF
  1387.  
  1388. IDEB = IFIN + 1
  1389. IFIN = MIN(IDEB + LCOL - 1,ITLIGN)
  1390. READ(LIGNE(IDEB:IFIN),'(I80)',ERR=11,IOSTAT=IOSTA1) IDSYS
  1391. IF (IOSTA1 .NE. 0) IDSYS = 0
  1392.  
  1393. IDEB = IFIN + 1
  1394. IFIN = MIN(IDEB + LCOL - 1,ITLIGN)
  1395. READ(LIGNE(IDEB:IFIN),'(G80.0)',ERR=11,IOSTAT=IOSTA1) FLOT1
  1396. IF (IOSTA1 .NE. 0) THEN
  1397. moterr ='READ (IOSTAT)'
  1398. interr(1) = IOSTA1
  1399. CALL ERREUR(873)
  1400. RETURN
  1401. ENDIF
  1402.  
  1403. IF (PRECID) THEN
  1404. C Lecture d'une nouvelle ligne pour savoir si on continue a lire
  1405. READ(IUNAS,1000,ERR=990,END=990) LIGNE
  1406. C PRINT * ,'Nouvelle ligne : NBLIGN,'
  1407. CALL LENCHA(LIGNE,ITLIGN)
  1408. INDXE=INDEX(CARAOK,LIGNE(ITLIGN:ITLIGN))
  1409. IF (INDXE .EQ. 0) LIGNE(ITLIGN:ITLIGN)=' '
  1410. NBLIGN = NBLIGN + 1
  1411. IFIN = 8
  1412. ENDIF
  1413.  
  1414. MFORCE.IDFORC(NBFORC)=IDLU
  1415. MFORCE.INOFOR(NBFORC)=INOLU
  1416. DO IFO=1,3
  1417. IDEB = IFIN + 1
  1418. IFIN = MIN(IDEB + LCOL - 1,ITLIGN)
  1419. READ(LIGNE(IDEB:IFIN),'(G80.0)',ERR=11,IOSTAT=IOSTA1) FLOT2
  1420. IF (IOSTA1 .NE. 0) THEN
  1421. moterr ='READ (IOSTAT)'
  1422. interr(1) = IOSTA1
  1423. CALL ERREUR(873)
  1424. RETURN
  1425. ENDIF
  1426. MFORCE.XFORCE(IFO,NBFORC)=FLOT2*FLOT1
  1427. ENDDO
  1428. C PRINT *,IDLU,INOLU,IDSYS,NBFDIF
  1429.  
  1430. C Passage dans le repère général
  1431. IF (IDSYS.NE.0) THEN
  1432. DO NUMSYS=1,NBSYST
  1433. IF(MSYSTE.IDSYST(NUMSYS) .EQ. IDSYS) GOTO 304
  1434. ENDDO
  1435. WRITE(IOIMP,*) 'On n''a pas lu le repere d''ID:',IDSYS
  1436. CALL ERREUR(21)
  1437. RETURN
  1438.  
  1439. 304 CONTINUE
  1440. ITYPES = MSYSTE.ITYSYS(NUMSYS)
  1441. C PRINT *,'Type de repere', ITYPES, NUMSYS
  1442. XFL(1) = REAL(0.D0)
  1443. XFL(2) = REAL(0.D0)
  1444. XFL(3) = REAL(0.D0)
  1445. NUMPTS = MLINOE.ICORNO(INOLU)
  1446. j=(NBANC+NUMPTS-1)*idimp1
  1447. IF (ITYPES .EQ. 1) THEN
  1448. C Transformation Cartesienne
  1449. C Le X lu devient mon Y
  1450. XLU=MFORCE.XFORCE(1,NBFORC)
  1451. MFORCE.XFORCE(1,NBFORC)=MFORCE.XFORCE(2,NBFORC)
  1452. MFORCE.XFORCE(2,NBFORC)=XLU
  1453.  
  1454. ELSEIF (ITYPES .EQ. 2) THEN
  1455. C Transformation Cylindrique
  1456. WRITE(IOIMP,*) 'Repere Cylindrique non supporte: IDFORCE,',
  1457. & ' Noeud, Ligne',IDLU,INOLU,NBLIGN
  1458. GOTO 11
  1459.  
  1460. ELSEIF (ITYPES .EQ. 3) THEN
  1461. C Transformation Spherique
  1462. WRITE(IOIMP,*) 'Repere Spherique non supporte: IDFORCE,',
  1463. & ' Noeud, Ligne',IDLU,INOLU,NBLIGN
  1464. GOTO 11
  1465.  
  1466. ELSE
  1467. WRITE(IOIMP,*) 'Systeme de type inconnu :',ITYPES
  1468. CALL ERREUR(21)
  1469. RETURN
  1470. ENDIF
  1471.  
  1472. C Passage en coordonnées X,Y,Z centrées sur le repère Local
  1473. DO III=1,3
  1474. DO IFLOT=1,3
  1475. Flot = MFORCE.XFORCE(IFLOT,NBFORC)
  1476. INDICE=(III-1)*3 + IFLOT
  1477. XFL(III)=XFL(III)+ MSYSTE.SCOOR2(INDICE,NUMSYS)*Flot
  1478. C PRINT *,INDICE,SYSCOR(INDICE,NUMSYS),Flot,XFL(III)
  1479. ENDDO
  1480. ENDDO
  1481.  
  1482. C Remplacement dans MFORCE
  1483. DO IFLOT=1,3
  1484. C Remplacement dans MFORCE
  1485. MFORCE.XFORCE(IFLOT,NBFORC)=XFL(IFLOT)
  1486. ENDDO
  1487. ENDIF
  1488.  
  1489. ELSEIF ((IRETO1 .EQ. 55) .OR. (IRETO1 .EQ. 56)) THEN
  1490. C Cas des MOMENT
  1491. READ(LIGNE(IDEB:IFIN),'(I80)',ERR=11,IOSTAT=IOSTA1) IDLU
  1492. IF (IOSTA1 .NE. 0) THEN
  1493. moterr ='READ (IOSTAT)'
  1494. interr(1) = IOSTA1
  1495. CALL ERREUR(873)
  1496. RETURN
  1497. ENDIF
  1498. C PRINT *, GETYPE(IRETO1),IDLU,(IRETO1 - (NBGEO1+NBSY) + 1)/2
  1499. NBMOME = NBMOME + 1
  1500.  
  1501. IF (NBMOME .GT. JGMOME) THEN
  1502. INCMOM = 2 * INCMOM
  1503. JGMOME = JGMOME + INCMOM
  1504. SEGADJ, MMOMEN
  1505. ENDIF
  1506.  
  1507. DO IDVU=1,NBMDIF
  1508. IF (IDLU .EQ. MMOMEN.ILIMOM(IDVU)) GOTO 305
  1509. ENDDO
  1510.  
  1511. NBMDIF = NBMDIF + 1
  1512. IDVU = NBMDIF
  1513. SEGADJ,MMOMEN
  1514. MMOMEN.ILIMOM(NBMDIF)=IDLU
  1515.  
  1516. 305 CONTINUE
  1517. MMOMEN.NBEMOM(IDVU )=MMOMEN.NBEMOM(IDVU) + 1
  1518. MMOMEN.ICOMOM(NBMOME)=IDVU
  1519. IDEB = IFIN + 1
  1520. IFIN = MIN(IDEB + LCOL - 1,ITLIGN)
  1521. READ(LIGNE(IDEB:IFIN),'(I80)',ERR=11,IOSTAT=IOSTA1) INOLU
  1522. IF (IOSTA1 .NE. 0) THEN
  1523. moterr ='READ (IOSTAT)'
  1524. interr(1) = IOSTA1
  1525. CALL ERREUR(873)
  1526. RETURN
  1527. ENDIF
  1528.  
  1529. IDEB = IFIN + 1
  1530. IFIN = MIN(IDEB + LCOL - 1,ITLIGN)
  1531. READ(LIGNE(IDEB:IFIN),'(I80)',ERR=11,IOSTAT=IOSTA1) IDSYS
  1532. IF (IOSTA1 .NE. 0) IDSYS = 0
  1533.  
  1534. IDEB = IFIN + 1
  1535. IFIN = MIN(IDEB + LCOL - 1,ITLIGN)
  1536. READ(LIGNE(IDEB:IFIN),'(G80.0)',ERR=11,IOSTAT=IOSTA1) FLOT1
  1537. IF (IOSTA1 .NE. 0) THEN
  1538. moterr ='READ (IOSTAT)'
  1539. interr(1) = IOSTA1
  1540. CALL ERREUR(873)
  1541. RETURN
  1542. ENDIF
  1543.  
  1544. IF (PRECID) THEN
  1545. C Lecture d'une nouvelle ligne pour savoir si on continue a lire
  1546. READ(IUNAS,1000,ERR=990,END=990) LIGNE
  1547. C PRINT * ,'Nouvelle ligne : NBLIGN,'
  1548. CALL LENCHA(LIGNE,ITLIGN)
  1549. INDXE=INDEX(CARAOK,LIGNE(ITLIGN:ITLIGN))
  1550. IF (INDXE .EQ. 0) LIGNE(ITLIGN:ITLIGN)=' '
  1551. NBLIGN = NBLIGN + 1
  1552. IFIN = 8
  1553. ENDIF
  1554.  
  1555. MMOMEN.IDMOME(NBMOME)=IDLU
  1556. MMOMEN.INOMOM(NBMOME)=INOLU
  1557. DO IFO=1,3
  1558. IDEB = IFIN + 1
  1559. IFIN = MIN(IDEB + LCOL - 1,ITLIGN)
  1560. READ(LIGNE(IDEB:IFIN),'(G80.0)',ERR=11,IOSTAT=IOSTA1) FLOT2
  1561. IF (IOSTA1 .NE. 0) THEN
  1562. moterr ='READ (IOSTAT)'
  1563. interr(1) = IOSTA1
  1564. CALL ERREUR(873)
  1565. RETURN
  1566. ENDIF
  1567. MMOMEN.XMOMEN(IFO,NBMOME)=FLOT2*FLOT1
  1568. ENDDO
  1569. C PRINT *,IDLU,INOLU,IDSYS,NBMDIF
  1570.  
  1571. C Passage dans le repère général
  1572. IF (IDSYS.NE.0) THEN
  1573. DO NUMSYS=1,NBSYST
  1574. IF(MSYSTE.IDSYST(NUMSYS) .EQ. IDSYS) GOTO 306
  1575. ENDDO
  1576. WRITE(IOIMP,*) 'On n''a pas lu le repere d''ID:',IDSYS
  1577. CALL ERREUR(21)
  1578. RETURN
  1579.  
  1580. 306 CONTINUE
  1581. ITYPES = MSYSTE.ITYSYS(NUMSYS)
  1582. C PRINT *,'Type de repere', ITYPES, NUMSYS
  1583. XFL(1) = REAL(0.D0)
  1584. XFL(2) = REAL(0.D0)
  1585. XFL(3) = REAL(0.D0)
  1586. NUMPTS = MLINOE.ICORNO(INOLU)
  1587. j=(NBANC+NUMPTS-1)*idimp1
  1588. IF (ITYPES .EQ. 1) THEN
  1589. C Transformation Cartesienne
  1590. C Le X lu devient mon Y
  1591. XLU=MMOMEN.XMOMEN(1,NBMOME)
  1592. MMOMEN.XMOMEN(1,NBMOME)=MMOMEN.XMOMEN(2,NBMOME)
  1593. MMOMEN.XMOMEN(2,NBMOME)=XLU
  1594.  
  1595. ELSEIF (ITYPES .EQ. 2) THEN
  1596. C Transformation Cylindrique
  1597. WRITE(IOIMP,*) 'Repere Cylindrique non supporte:MOMENT, ',
  1598. & 'Noeud',IDLU,INOLU,NBLIGN
  1599. GOTO 11
  1600.  
  1601. ELSEIF (ITYPES .EQ. 3) THEN
  1602. C Transformation Spherique
  1603. WRITE(IOIMP,*) 'Repere Spherique non supporte:MOMENT, ',
  1604. & 'Noeud',IDLU,INOLU,NBLIGN
  1605. GOTO 11
  1606.  
  1607. ELSE
  1608. WRITE(IOIMP,*) 'Systeme de type inconnu :',ITYPES
  1609. CALL ERREUR(21)
  1610. RETURN
  1611. ENDIF
  1612.  
  1613. C Passage en coordonnées X,Y,Z centrées sur le repère Local
  1614. DO III=1,3
  1615. DO IFLOT=1,3
  1616. Flot = MMOMEN.XMOMEN(IFLOT,NBMOME)
  1617. INDICE=(III-1)*3 + IFLOT
  1618. XFL(III)=XFL(III)+ MSYSTE.SCOOR2(INDICE,NUMSYS)*Flot
  1619. C PRINT *,INDICE,SYSCOR(INDICE,NUMSYS),Flot,XFL(III)
  1620. ENDDO
  1621. ENDDO
  1622.  
  1623. C Remplacement dans MMOMEN
  1624. DO IFLOT=1,3
  1625. C Remplacement dans MMOMEN
  1626. MMOMEN.XMOMEN(IFLOT,NBMOME)=XFL(IFLOT)
  1627. ENDDO
  1628. ENDIF
  1629.  
  1630. ELSEIF ((IRETO1 .EQ. 57) .OR. (IRETO1 .EQ. 58)) THEN
  1631. C Cas des TEMPERATURES
  1632. READ(LIGNE(IDEB:IFIN),'(I80)',ERR=11,IOSTAT=IOSTA1) IDLU
  1633. IF (IOSTA1 .NE. 0) THEN
  1634. moterr ='READ (IOSTAT)'
  1635. interr(1) = IOSTA1
  1636. CALL ERREUR(873)
  1637. RETURN
  1638. ENDIF
  1639. C PRINT *, GETYPE(IRETO1),IDLU,(IRETO1 - (NBGEO1+NBSY) + 1)/2
  1640. NBTEMP = NBTEMP + 1
  1641.  
  1642. IF (NBTEMP .GT. JGTEMP) THEN
  1643. INCTEM = 2 * INCTEM
  1644. JGTEMP = JGTEMP + INCTEM
  1645. SEGADJ, MTEMP
  1646. ENDIF
  1647.  
  1648. DO IDVU=1,NBTDIF
  1649. IF (IDLU .EQ. MTEMP.ILITEM(IDVU)) GOTO 302
  1650. ENDDO
  1651.  
  1652. NBTDIF = NBTDIF + 1
  1653. IDVU = NBTDIF
  1654. SEGADJ,MTEMP
  1655. MTEMP.ILITEM(NBTDIF)=IDLU
  1656.  
  1657. 302 CONTINUE
  1658. MTEMP.NBETEM(IDVU )=MTEMP.NBETEM(IDVU) + 1
  1659. MTEMP.ICOTEM(NBTEMP)=IDVU
  1660. IDEB = IFIN + 1
  1661. IFIN = MIN(IDEB + LCOL - 1,ITLIGN)
  1662. READ(LIGNE(IDEB:IFIN),'(I80)',ERR=11,IOSTAT=IOSTA1) INOLU
  1663. IF (IOSTA1 .NE. 0) THEN
  1664. moterr ='READ (IOSTAT)'
  1665. interr(1) = IOSTA1
  1666. CALL ERREUR(873)
  1667. RETURN
  1668. ENDIF
  1669.  
  1670. IDEB = IFIN + 1
  1671. IFIN = MIN(IDEB + LCOL - 1,ITLIGN)
  1672. READ(LIGNE(IDEB:IFIN),'(G80.0)',ERR=11,IOSTAT=IOSTA1) FLOT1
  1673. IF (IOSTA1 .NE. 0) THEN
  1674. moterr ='READ (IOSTAT)'
  1675. interr(1) = IOSTA1
  1676. CALL ERREUR(873)
  1677. RETURN
  1678. ENDIF
  1679.  
  1680. MTEMP.IDTEMP(NBTEMP)=IDLU
  1681. MTEMP.INOTEM(NBTEMP)=INOLU
  1682. MTEMP.XTEMP (NBTEMP)=FLOT1
  1683. C PRINT *,IDLU,INOLU,FLOT1,NBTDIF
  1684. ENDIF
  1685. GOTO 11
  1686.  
  1687.  
  1688. C***********************************************************************
  1689. C Fermeture du fichier en lecture
  1690. C***********************************************************************
  1691. 990 CONTINUE
  1692. CLOSE(UNIT=IUNAS,ERR=991)
  1693.  
  1694. C Ajustement du segment MCOORD
  1695. IF (NBNPTS .LT. JGNOLO) THEN
  1696. JGNOLO=NBNPTS
  1697. NBPTS=NBANC+JGNOLO
  1698. SEGADJ,MCOORD
  1699. ENDIF
  1700.  
  1701. C***********************************************************************
  1702. C Creation des MAILLAGES par ID de PROPERTY
  1703. C***********************************************************************
  1704. C PRINT *,'RECOMPOSITION DES MAILLAGES', NBPROP
  1705. IF (NBPROP .GT. 0) THEN
  1706. M=NBPROP
  1707. SEGINI,MTAB1
  1708.  
  1709. C Ecriture dans la table de Sortie de la TABLE MAILLAGES
  1710. COLO80='MAILLAGES'
  1711. CALL ECCTAB(MTABLE,'MOT ',0,0.d0,COLO80 ,.FALSE.,0,
  1712. & 'TABLE ',0,0.d0,'RIEN',.FALSE.,MTAB1)
  1713. IF (IERR.NE.0) RETURN
  1714. ENDIF
  1715.  
  1716. DO IP=1,NBPROP
  1717. NBMAIL=0
  1718.  
  1719. NBNN =0
  1720. NBELEM=0
  1721. NBSOUS=100
  1722. NBREF =0
  1723. SEGINI,MELEME
  1724. MPROP.IMELCO(IP)=MELEME
  1725. DO ITY=1,100
  1726. IF (MPROP.ITYPRO(ITY,IP) .GT. 0) THEN
  1727. NBMAIL= NBMAIL + 1
  1728. NBNN = NBNNE(ITY)
  1729. NBELEM= MPROP.ITYPRO(ITY,IP)
  1730. NBSOUS= 0
  1731. NBREF = 0
  1732. SEGINI,IPT1
  1733. IPT1.ITYPEL=ITY
  1734. MPROP.IMELSI(ITY,IP)=IPT1
  1735. MELEME.LISOUS(NBMAIL)=IPT1
  1736. C PRINT *, IP, MPROP.ITYPRO(ITY,IP), NOMS(ITY), NBNNE(ITY)
  1737. ENDIF
  1738. ENDDO
  1739. III=MELEME
  1740. NBSOUS=NBMAIL
  1741. IF (NBSOUS .EQ. 1) THEN
  1742. SEGSUP,MELEME
  1743. MPROP.IMELCO(IP)=IPT1
  1744. MELEME=IPT1
  1745. ELSE
  1746. NBNN =0
  1747. NBELEM=0
  1748. NBREF =0
  1749. SEGADJ,MELEME
  1750. SEGDES,MELEME
  1751. ENDIF
  1752.  
  1753. C Ecriture dans la table MAILLAGES
  1754. IPROP = MPROP.ICOPRO(IP)
  1755. CALL ECCTAB(MTAB1 ,'ENTIER ',IPROP,0.d0,'RIEN',.FALSE.,0,
  1756. & 'MAILLAGE',0 ,0.d0,'RIEN',.FALSE.,MELEME)
  1757. IF (IERR.NE.0) RETURN
  1758. ENDDO
  1759.  
  1760. IF (NBPROP .GT. 0) SEGDES,MTAB1
  1761.  
  1762. C***********************************************************************
  1763. C Creation des MAILLAGES par type de RBE2
  1764. C***********************************************************************
  1765. IF (NBRBE2 .GT. 0) THEN
  1766. M=NBRBE2
  1767. SEGINI,MTAB2
  1768.  
  1769. C Ecriture dans la table de Sortie de la TABLE RBE2
  1770. COLO80='RBE2'
  1771. CALL ECCTAB(MTABLE,'MOT ',0,0.d0,COLO80 ,.FALSE.,0,
  1772. & 'TABLE ',0,0.d0,'RIEN',.FALSE.,MTAB2)
  1773. IF (IERR.NE.0) RETURN
  1774. ENDIF
  1775.  
  1776. DO NURBE2=1,NBRBE2
  1777. C PRINT *,NURBE2,MRBE2.NELRBE(NURBE2)+1
  1778.  
  1779. NBNN =1
  1780. NBELEM=MRBE2.NELRBE(NURBE2)+1
  1781. NBSOUS=0
  1782. NBREF =0
  1783. SEGINI,MELEME
  1784. MELEME.ITYPEL=1
  1785. MRBE2.IMELRB(NURBE2) = MELEME
  1786.  
  1787. C Ecriture dans la table RBE2
  1788. M=2
  1789. SEGINI,MTAB3
  1790. CALL ECCTAB(MTAB3 ,'MOT ',0 ,0.d0,'MAILLAGE',.FALSE.,0,
  1791. & 'MAILLAGE',0 ,0.d0,'RIEN ',.FALSE.,MELEME)
  1792. IF (IERR.NE.0) RETURN
  1793. IBLOQ = MRBE2.IBLRBE(NURBE2)
  1794. C PRINT *,'NURBE2,IBLOQ',NURBE2,IBLOQ
  1795. CALL ECCTAB(MTAB3 ,'MOT ',0 ,0.d0,'HASHCODE',.FALSE.,0,
  1796. & 'ENTIER ',IBLOQ ,0.d0,'RIEN ',.FALSE.,0)
  1797. IF (IERR.NE.0) RETURN
  1798. SEGDES,MTAB3
  1799.  
  1800. CALL ECCTAB(MTAB2 ,'ENTIER ',NURBE2,0.d0,'MAILLAGE',.FALSE.,0,
  1801. & 'TABLE ',0 ,0.d0,'RIEN ',.FALSE.,MTAB3)
  1802. IF (IERR.NE.0) RETURN
  1803. ENDDO
  1804. IF (NBRBE2 .GT. 0) SEGDES,MTAB2
  1805.  
  1806. C***********************************************************************
  1807. C Remplissage des MAILLAGES
  1808. C***********************************************************************
  1809. DO 299 IELEM=1,NELTOT
  1810. IDELEM = MLIELE.ICOREL(IELEM)
  1811. IDCONN = MLIELE.IELCON(IDELEM)
  1812. IDTYPE = MLIELE.IELTYP(IDELEM)
  1813. IPLU = MLIELE.IDPROP(IDELEM)
  1814.  
  1815. ITYP2 = 0
  1816. COLO4 = NOMS(IDTYPE)
  1817. C Recherche dans le DATA des éléments géométriques
  1818. CALL PLACE(CTYPE,NBGEO2,ITYP2,COLO4)
  1819.  
  1820. C PRINT *,NOMS(IDTYPE),ITYP2
  1821. IF (MLIELE.IRBE2(IDELEM) .NE. 0) THEN
  1822. C Traitement des RBE2
  1823. NURBE2 = MLIELE.IDPROP(IDELEM)
  1824. IPT1 = MRBE2.IMELRB(NURBE2)
  1825. NBNN = IPT1.NUM(/1)
  1826. NBELEM = IPT1.NUM(/2)
  1827.  
  1828. C Reconstitution de la Connectivite
  1829. DO IEL = 1,NBELEM
  1830. NUMEL = NBELEM - MRBE2.NELRBE(NURBE2)
  1831. IDCOLU = ICONTO(IDCONN+(IEL - 1))
  1832. IDCOCA = MLINOE.ICORNO(IDCOLU)+NBANC
  1833. C PRINT *,NUMEL,IDCOLU,NBELEM
  1834.  
  1835. MRBE2.NELRBE(NURBE2) = MRBE2.NELRBE(NURBE2) - 1
  1836. IPT1.NUM(1,NUMEL) = IDCOCA
  1837. ENDDO
  1838. IF (NUMEL .EQ. NBELEM) THEN
  1839. SEGDES, IPT1
  1840. C PRINT *,'SEGDES,IPT1',IPT1
  1841. ENDIF
  1842.  
  1843. ELSE
  1844. C Traitement des Elements classiques
  1845. DO IPLO=1,NBPROP
  1846. C Recherche de la Property qui a le même ID
  1847. IF (MPROP.ICOPRO(IPLO) .EQ. IPLU) GOTO 300
  1848. ENDDO
  1849. WRITE(IOIMP,*) 'Aucune Property n''a ete trouvee...'
  1850. CALL ERREUR(21)
  1851. RETURN
  1852.  
  1853. 300 CONTINUE
  1854. MELEME= MPROP.IMELCO(IPLO)
  1855. C PRINT *,MELEME,IDTYPE,IPLO,IPLU,IDELEM
  1856. IPT1 = MPROP.IMELSI(IDTYPE,IPLO)
  1857. NBNN = IPT1.NUM(/1)
  1858. NBELEM= IPT1.NUM(/2)
  1859. NUMEL = MPROP.NBELPR(IDTYPE,IPLO) + 1
  1860. MPROP.NBELPR(IDTYPE,IPLO) = NUMEL
  1861.  
  1862.  
  1863. C Reconstitution de la Connectivite
  1864. C PRINT *,NOMS(IDTYPE),IDELEM,IPLU,IPLO
  1865. DO INOEUD=1,NBNN
  1866. ITEST = IORDCO(20* (ITYP2-1) + INOEUD)
  1867. IDCOLU = ICONTO(IDCONN+(ITEST-1))
  1868. IDCOCA = MLINOE.ICORNO(IDCOLU)+NBANC
  1869. IPT1.NUM(INOEUD,NUMEL) = IDCOCA
  1870. C PRINT *,'INOEUD',IDCOLU,IDCOCA
  1871. ENDDO
  1872. IF (NUMEL .EQ. NBELEM) THEN
  1873. SEGDES, IPT1
  1874. C PRINT *,'SEGDES, MELEME classique',IPT1
  1875. ENDIF
  1876. ENDIF
  1877. 299 CONTINUE
  1878.  
  1879. C***********************************************************************
  1880. C Generation des MELEME pour les SPC
  1881. C***********************************************************************
  1882. IF (NBSDIF .GT. 0) THEN
  1883. M=NBSDIF
  1884. SEGINI,MTAB1
  1885.  
  1886. C Ecriture dans la table de Sortie de la TABLE BLOCAGES
  1887. COLO80='BLOCAGES'
  1888. CALL ECCTAB(MTABLE,'MOT ',0,0.d0,COLO80 ,.FALSE.,0,
  1889. & 'TABLE ',0,0.d0,'RIEN',.FALSE.,MTAB1)
  1890. IF (IERR.NE.0) RETURN
  1891. ENDIF
  1892.  
  1893. DO ISPC=1,NBSDIF
  1894. NBMAIL=0
  1895.  
  1896. NBNN =1
  1897. NBELEM=MSPC.NBESPC(ISPC)
  1898. NBSOUS=0
  1899. NBREF =0
  1900. SEGINI,MELEME
  1901. MELEME.ITYPEL=1
  1902. MSPC.IMELSP(ISPC)=MELEME
  1903.  
  1904. C Ecriture dans la table BLOCAGES
  1905. IDS = MSPC.ILISPC(ISPC)
  1906. CALL ECCTAB(MTAB1 ,'ENTIER ',IDS ,0.d0,'RIEN',.FALSE.,0,
  1907. & 'MAILLAGE',0 ,0.d0,'RIEN',.FALSE.,MELEME)
  1908. IF (IERR.NE.0) RETURN
  1909. ENDDO
  1910.  
  1911. IF (NBSDIF .GT. 0) SEGDES,MTAB1
  1912.  
  1913. DO IELEM = 1,NBSPC
  1914. IDIF = MSPC.ICOSPC(IELEM)
  1915. IDNOLU = MSPC.INOSPC(IELEM)
  1916. IF(IDNOLU .EQ. 0)THEN
  1917. CALL ERREUR(1064)
  1918. RETURN
  1919. ENDIF
  1920. MELEME = MSPC.IMELSP(IDIF)
  1921. NBNN = MELEME.NUM(/1)
  1922. NBELEM = MELEME.NUM(/2)
  1923. NUMEL = NBELEM - MSPC.NBESPC(IDIF) + 1
  1924. MSPC.NBESPC(IDIF) = MSPC.NBESPC(IDIF) - 1
  1925. IDCOCA = MLINOE.ICORNO(IDNOLU)+NBANC
  1926. C PRINT *,IDIF,IDNOLU,IDCOCA,XCOOR(/1)/idimp1
  1927. MELEME.NUM(1,NUMEL) = IDCOCA
  1928. IF (NUMEL .EQ. NBELEM) THEN
  1929. SEGDES, MELEME
  1930. C PRINT *,'SEGDES, MELEME, BLOCAGES',MELEME
  1931. ENDIF
  1932. ENDDO
  1933.  
  1934. C***********************************************************************
  1935. C Generation des CHPOINT pour les FORCES
  1936. C***********************************************************************
  1937. IF (NBFDIF .GT. 0) THEN
  1938. M=NBFDIF
  1939. SEGINI,MTAB1
  1940.  
  1941. C Ecriture dans la table de Sortie de la TABLE FORCES
  1942. COLO80='FORCES'
  1943. CALL ECCTAB(MTABLE,'MOT ',0,0.d0,COLO80 ,.FALSE.,0,
  1944. & 'TABLE ',0,0.d0,'RIEN',.FALSE.,MTAB1)
  1945. IF (IERR.NE.0) RETURN
  1946. ENDIF
  1947.  
  1948. DO IFOR=1,NBFDIF
  1949. NNIN = 3
  1950. NNNOE= MFORCE.NBEFOR(IFOR)
  1951. SEGINI,MTRAV
  1952. ITRAV = MTRAV
  1953. MTRAV.INCO(1)='FX '
  1954. MTRAV.INCO(2)='FY '
  1955. MTRAV.INCO(3)='FZ '
  1956.  
  1957. DO IELEM = 1,NBFORC
  1958. IF (MFORCE.IDFORC(IELEM) .EQ. MFORCE.ILIFOR(IFOR)) THEN
  1959. IDNOLU = MFORCE.INOFOR(IELEM)
  1960. IDCOCA = MLINOE.ICORNO(IDNOLU)+NBANC
  1961. DO IVAL=1,3
  1962. XVAL = MFORCE.XFORCE(IVAL,IELEM)
  1963. MTRAV.BB (IVAL,NNNOE) = XVAL
  1964. MTRAV.IBIN(IVAL,NNNOE) = 1
  1965. ENDDO
  1966. MTRAV.IGEO( NNNOE) = IDCOCA
  1967. NNNOE = NNNOE - 1
  1968. IF (NNNOE .EQ. 0) THEN
  1969. CALL CRECHP(ITRAV,ICHPO1)
  1970. C PRINT *,'SEGSUP,MTRAV',MTRAV
  1971. SEGSUP,MTRAV
  1972. C Ecriture dans la table FORCES
  1973. IDT = MFORCE.ILIFOR(IFOR)
  1974. CALL ECCTAB(MTAB1 ,'ENTIER ',IDT ,0.d0,'RIEN',.FALSE.,0,
  1975. & 'CHPOINT ',0 ,0.d0,'RIEN',.FALSE.,ICHPO1)
  1976. IF (IERR.NE.0) RETURN
  1977. ENDIF
  1978. ENDIF
  1979. ENDDO
  1980. ENDDO
  1981.  
  1982. IF (NBFORC .GT. 0) SEGDES,MTAB1
  1983.  
  1984.  
  1985. C***********************************************************************
  1986. C Generation des CHPOINT pour les MOMENTS
  1987. C***********************************************************************
  1988. IF (NBMDIF .GT. 0) THEN
  1989. M=NBMDIF
  1990. SEGINI,MTAB1
  1991.  
  1992. C Ecriture dans la table de Sortie de la TABLE MOMENTS
  1993. COLO80='MOMENTS'
  1994. CALL ECCTAB(MTABLE,'MOT ',0,0.d0,COLO80 ,.FALSE.,0,
  1995. & 'TABLE ',0,0.d0,'RIEN',.FALSE.,MTAB1)
  1996. IF (IERR.NE.0) RETURN
  1997. ENDIF
  1998.  
  1999. DO IMOM=1,NBMDIF
  2000. NNIN = 3
  2001. NNNOE= MMOMEN.NBEMOM(IMOM)
  2002. SEGINI,MTRAV
  2003. ITRAV = MTRAV
  2004. MTRAV.INCO(1)='MX '
  2005. MTRAV.INCO(2)='MY '
  2006. MTRAV.INCO(3)='MZ '
  2007.  
  2008. DO IELEM = 1,NBFORC
  2009. IF (MMOMEN.IDMOME(IELEM) .EQ. MMOMEN.ILIMOM(IMOM)) THEN
  2010. IDNOLU = MMOMEN.INOMOM(IELEM)
  2011. IDCOCA = MLINOE.ICORNO(IDNOLU)+NBANC
  2012. DO IVAL=1,3
  2013. XVAL = MMOMEN.XMOMEN(IVAL,IELEM)
  2014. MTRAV.BB (IVAL,NNNOE) = XVAL
  2015. MTRAV.IBIN(IVAL,NNNOE) = 1
  2016. ENDDO
  2017. MTRAV.IGEO( NNNOE) = IDCOCA
  2018. NNNOE = NNNOE - 1
  2019. IF (NNNOE .EQ. 0) THEN
  2020. CALL CRECHP(ITRAV,ICHPO1)
  2021. C PRINT *,'SEGSUP,MTRAV',MTRAV
  2022. SEGSUP,MTRAV
  2023. C Ecriture dans la table MOMENTS
  2024. IDT = MMOMEN.ILIMOM(IMOM)
  2025. CALL ECCTAB(MTAB1 ,'ENTIER ',IDT ,0.d0,'RIEN',.FALSE.,0,
  2026. & 'CHPOINT ',0 ,0.d0,'RIEN',.FALSE.,ICHPO1)
  2027. IF (IERR.NE.0) RETURN
  2028. ENDIF
  2029. ENDIF
  2030. ENDDO
  2031. ENDDO
  2032.  
  2033. IF (NBFORC .GT. 0) SEGDES,MTAB1
  2034.  
  2035. C***********************************************************************
  2036. C Generation des CHPOINT pour les TEMPERATURE
  2037. C***********************************************************************
  2038. IF (NBTDIF .GT. 0) THEN
  2039. M=NBTDIF
  2040. SEGINI,MTAB1
  2041.  
  2042. C Ecriture dans la table de Sortie de la TABLE TEMPERATURES
  2043. COLO80='TEMPERATURES'
  2044. CALL ECCTAB(MTABLE,'MOT ',0,0.d0,COLO80 ,.FALSE.,0,
  2045. & 'TABLE ',0,0.d0,'RIEN',.FALSE.,MTAB1)
  2046. IF (IERR.NE.0) RETURN
  2047. ENDIF
  2048.  
  2049. DO ITMP=1,NBTDIF
  2050. NNIN = 1
  2051. NNNOE= MTEMP.NBETEM(ITMP)
  2052. SEGINI,MTRAV
  2053. ITRAV = MTRAV
  2054. MTRAV.INCO(1)='T '
  2055.  
  2056. DO IELEM = 1,NBTEMP
  2057. IF (MTEMP.IDTEMP(IELEM) .EQ. MTEMP.ILITEM(ITMP)) THEN
  2058. IDNOLU = MTEMP.INOTEM(IELEM)
  2059. XVAL1 = MTEMP.XTEMP(IELEM)
  2060. IDCOCA = MLINOE.ICORNO(IDNOLU)+NBANC
  2061. MTRAV.BB (1,NNNOE) = XVAL1
  2062. MTRAV.IBIN(1,NNNOE) = 1
  2063. MTRAV.IGEO( NNNOE) = IDCOCA
  2064. NNNOE = NNNOE - 1
  2065. IF (NNNOE .EQ. 0) THEN
  2066. CALL CRECHP(ITRAV,ICHPO1)
  2067. C PRINT *,'SEGSUP,MTRAV',MTRAV
  2068. SEGSUP,MTRAV
  2069. C Ecriture dans la table TEMPERATURES
  2070. IDT = MTEMP.ILITEM(ITMP)
  2071. CALL ECCTAB(MTAB1 ,'ENTIER ',IDT ,0.d0,'RIEN',.FALSE.,0,
  2072. & 'CHPOINT ',0 ,0.d0,'RIEN',.FALSE.,ICHPO1)
  2073. IF (IERR.NE.0) RETURN
  2074. ENDIF
  2075. ENDIF
  2076. ENDDO
  2077. ENDDO
  2078.  
  2079. IF (NBTDIF .GT. 0) SEGDES,MTAB1
  2080.  
  2081. C***********************************************************************
  2082. C Generation des trièdres pour les SYSTEMES : SEG2
  2083. C***********************************************************************
  2084. IF (NBSYST .GT. 0) THEN
  2085. M=NBSYST
  2086. SEGINI,MTAB2
  2087.  
  2088. C Ecriture dans la table de Sortie de la TABLE SYSTEMS
  2089. COLO80='SYSTEMES'
  2090. CALL ECCTAB(MTABLE,'MOT ',0,0.d0,COLO80 ,.FALSE.,0,
  2091. & 'TABLE ',0,0.d0,'RIEN',.FALSE.,MTAB2)
  2092. IF (IERR.NE.0) RETURN
  2093.  
  2094. C Ajustement du SEGMENT MCOORD
  2095. NBANC2=nbpts
  2096. NBPTS=NBANC2+(4*NBSYST)
  2097. SEGADJ,MCOORD
  2098. ENDIF
  2099.  
  2100. DO NUMSYS=1,NBSYST
  2101. C Ajout au SEGMENT MCOORD des points en question
  2102. IFLOT2 = 0
  2103. j =(NBANC2+(NUMSYS-1)*4)*idimp1
  2104. DO IFLOT=1,12
  2105. IFLOT2=IFLOT2 + 1
  2106. IF (MOD(IFLOT2,4) .EQ. 0) THEN
  2107. C On saute la couleur
  2108. IFLOT2=IFLOT2 + 1
  2109. ENDIF
  2110. Flot1 = MSYSTE.SYSCOR(IFLOT,NUMSYS)
  2111. MCOORD.XCOOR(j+IFLOT2)=Flot1
  2112. C PRINT *,NUMSYS,j+IFLOT2,NBANC2+(NUMSYS-1)*4,Flot1
  2113. ENDDO
  2114.  
  2115. NBNN = 2
  2116. NBELEM = 3
  2117. NBSOUS = 0
  2118. NBREF = 0
  2119. SEGINI,IPT3
  2120. IPT3.ITYPEL = IELEQ1(3)
  2121.  
  2122. NUMORIG=NBANC2+(NUMSYS-1)*4 + 1
  2123. DO IEL=1,NBELEM
  2124. DO INN=1,NBNN
  2125. IF (INN .EQ. 1) THEN
  2126. IPT3.NUM(INN,IEL)=NUMORIG + INN - 1
  2127. ELSE
  2128. IPT3.NUM(INN,IEL)=NUMORIG + IEL
  2129. ENDIF
  2130. C PRINT *, IPT3.NUM(INN,IEL),nbpts
  2131. ENDDO
  2132. ENDDO
  2133.  
  2134. C Ecriture dans la table SYSTEMS
  2135. IDSYS = MSYSTE.IDSYST(NUMSYS)
  2136. CALL ECCTAB(MTAB2 ,'ENTIER ',IDSYS,0.d0,'RIEN',.FALSE.,0,
  2137. & 'MAILLAGE',0 ,0.d0,'RIEN',.FALSE.,IPT3)
  2138. IF (IERR.NE.0) RETURN
  2139. ENDDO
  2140.  
  2141.  
  2142. C***********************************************************************
  2143. C FIN et sortie
  2144. C***********************************************************************
  2145. 991 CONTINUE
  2146. C Traitement des erreurs
  2147. IF (iOK .NE.0) THEN
  2148. CALL ERREUR(iOK)
  2149. RETURN
  2150.  
  2151. ELSE
  2152. CALL ECROBJ('TABLE ',MTABLE)
  2153.  
  2154. ENDIF
  2155. SEGDES,MTABLE
  2156. SEGSUP,MLINOE, MLIELE, MPROP, MSYSTE, MRBE2, MSPC, MTEMP, MMOMEN
  2157.  
  2158. RETURN
  2159. END
  2160.  
  2161.  
  2162.  
  2163.  
  2164.  
  2165.  
  2166.  
  2167.  
  2168.  
  2169.  
  2170.  
  2171.  
  2172.  

© Cast3M 2003 - Tous droits réservés.
Mentions légales