Télécharger modeli.eso

Retour à la liste

Numérotation des lignes :

modeli
  1. C MODELI SOURCE OF166741 24/11/18 21:15:18 12081
  2. C----------------------------------------------------------------------C
  3. C OPERATEUR MODELE C
  4. C C
  5. C Creation d'un objet MODELE C
  6. C C
  7. C Syntaxe : MOD1 = MODL GEO1 TYPE_CAL TYPE_MAT ( TYPE_ELE ) ; C
  8. C C
  9. C GEO1 MAILLAGE de base C
  10. C TYPE_CAL MOT(S) pour definir la FORMULATION C
  11. C TYPE_MAT MOT(S) pour definir le MATERIAU C
  12. C TYPE_ELE MOT(S) pour definir les ELEMENTS FINIS a utiliser C
  13. C MOD1 Resultat de type MODELE C
  14. C----------------------------------------------------------------------C
  15. C PPU : Modif pour les materiaux unidirectionels en plasticite
  16.  
  17. SUBROUTINE MODELI
  18.  
  19. IMPLICIT INTEGER(I-N)
  20. IMPLICIT REAL*8(A-H,O-Z)
  21.  
  22. -INC PPARAM
  23. -INC CCOPTIO
  24. -INC CCHAMP
  25. -INC CCGEOME
  26. C==DEB= FORMULATION HHO == Include specifique ==========================
  27. -INC CCHHOPA
  28. C==FIN= FORMULATION HHO ================================================
  29.  
  30. -INC SMCOORD
  31. -INC SMELEME
  32. -INC SMMODEL
  33. POINTEUR IMODE3.IMODEL,IMODE4.IMODEL,IMODE5.IMODEL
  34. POINTEUR nomid1.NOMID,nomid2.NOMID
  35. -INC SMTABLE
  36. -INC SMLMOTS
  37. POINTEUR OPNLIN.MLMOTS
  38.  
  39. SEGMENT LIMODE(0)
  40. SEGMENT PLICON
  41. integer mlicon(NLCON),tlicon(NLCON)
  42. ENDSEGMENT
  43.  
  44. EXTERNAL LONG
  45. PARAMETER (NBFORM=19,NBCON=13,NBEXT=7,NBDIF=1)
  46. PARAMETER (N1MAX=300,N2MAX=200)
  47. PARAMETER (NLOMAX=5)
  48.  
  49. DIMENSION LESMOD(N1MAX)
  50. CHARACTER*4 MOTEF(N2MAX),LESTEF(N2MAX),MOCON(NBCON),MOEXT(NBEXT),
  51. & MOINCO(NBDIF)
  52. CHARACTER*4 MNLOCA(NLOMAX),MNLVAR(1)
  53. CHARACTER*4 MCTCT(4)
  54. CHARACTER*8 TAPIND,TYPOBJ,CHARIN,CHARRE,CMATE,PHAM
  55. CHARACTER*8 PAR1,MDIINC,MDIDUA
  56. CHARACTER*(LCONMO) CONM
  57. CHARACTER*(LOCOMP) MOPRID
  58. CHARACTER*16 MOFORM(NBFORM),LESFOR(2),MOPROP(N1MAX),LESPRO(N1MAX)
  59. CHARACTER*16 LMENOM,LDINOM,OPTEMP(3)
  60. CHARACTER*(LOCHAI) MOTEMP,LMELIB,LDILIB,LMEFCT,LDIFCT
  61. CHARACTER*4 mgauss(4)
  62. CHARACTER*4 deriv(1)
  63.  
  64. LOGICAL LOGRE,LOGIN,LMEEXT,LMENLX,LMEVIX,LOSTAT,LOMELA,LINOMID
  65. LOGICAL LDIEXT,LDISOR,LOBBAR
  66.  
  67. C=DEB==== FORMULATION HHO ==== Declarations particulieres ==============
  68. PARAMETER (NMHHO=2)
  69. CHARACTER*4 mcHHO(NMHHO)
  70. CHARACTER*(LOCHAI) chaHHO
  71. LOGICAL loHHO
  72. DATA mcHHO / 'HHO_','HHO ' /
  73. C=FIN==== FORMULATION HHO ==============================================
  74.  
  75. DATA MGAUSS /'EPAI' , 'RIGI' , 'MASS' ,'CONT'/
  76. DATA DERIV /'EPSI'/
  77. c DATA MDERIV/'LINEAIRE ','QUADRATIQUE ',
  78. c $ 'TRUESDELL ','JAUMANN ',
  79. c $ 'UTILISATEUR ','FEFP '/
  80. DATA OPTEMP/'PHASE ','ADVECTION ',
  81. $ 'CONDUCTION '/
  82.  
  83. C----------------------------------------------------------------------C
  84. C DEFINITION DES NOMS DE FORMULATIONS C
  85. C Formulation LIAISON : pour operateurs DYNE et COMP C
  86. C----------------------------------------------------------------------C
  87. DATA MOFORM /
  88. & 'THERMIQUE ','MECANIQUE ','LIQUIDE ',
  89. & 'POREUX ','DARCY ','CONTACT ',
  90. & 'MAGNETODYNAMIQUE','NAVIER_STOKES ','MELANGE ',
  91. & 'EULER ','FISSURE ','LIAISON ',
  92. & 'THERMOHYDRIQUE ','ELECTROSTATIQUE ','DIFFUSION ',
  93. & 'CHARGEMENT ','METALLURGIE ','CHANGEMENT_PHASE',
  94. & 'CONTRAINTE ' /
  95.  
  96. C (fdp) Ajout d'un nouveau mot clef 'LIBRE' ou 'LIE' pour les JOI1
  97. DATA MOCON / 'CONS','INTE','DPGE','PHAS','STAT','LCOI','LCOS',
  98. & 'LIBR','LIE ','NON_','LINE','CHPO','GAP7'/
  99. DATA MOEXT / 'NUME','NOM_','PARA','C_MA','C_VA','LIB_','FCT_' /
  100. DATA MOINCO / 'INCO' /
  101. DATA MNLVAR/ 'V_MO' /
  102. DATA MCTCT/'MESC','FAIB','SYME','MORT'/
  103.  
  104. CONM =' '
  105. PHAM =' '
  106. MDIINC=' '
  107. MDIDUA=' '
  108.  
  109. MFR = 0
  110. lucvar = 0
  111. lucmat = 0
  112. lucmaf = 0
  113. luparx = 0
  114. lobbar = .false.
  115. lecont = 0
  116. C=DEB==== FORMULATION HHO ==== Initialisations particulieres ===========
  117. loHHO = .FALSE.
  118. C=FIN==== FORMULATION HHO ==============================================
  119.  
  120. mmode2 = 0
  121.  
  122. IPGEOM = 0
  123. IPTABL = 0
  124. IPTABM = 0
  125.  
  126. C Lecture d'une table STATIONNAIRE
  127. IPTABL = 0
  128. IPTABS = 0
  129. IPTABM = 0
  130. IPGEOM = 0
  131. CALL LIRTAB('STATIONNAIRE',IPTABL,0,IRET)
  132. IF (IERR.NE.0) RETURN
  133. IF (IRET.GT.0) THEN
  134. IPTABS=IPTABL
  135. IVALIN=0
  136. XVALIN=REAL(0.D0)
  137. LOGIN=.TRUE.
  138. IOBIN=0
  139. TAPIND='MOT '
  140. CHARIN='MAILLAGE'
  141. TYPOBJ='TABLE '
  142. CALL ACCTAB(IPTABS,TAPIND,IVALIN,XVALIN,CHARIN,LOGIN,IOBIN,
  143. . TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,IOBRE)
  144. IF (IERR.NE.0) RETURN
  145. IPTABM = IOBRE
  146. IVALIN=1
  147. XVALIN=REAL(0.D0)
  148. LOGIN=.TRUE.
  149. IOBIN=0
  150. TAPIND='ENTIER '
  151. CHARIN=' '
  152. TYPOBJ='MAILLAGE'
  153. CALL ACCTAB(IPTABM,TAPIND,IVALIN,XVALIN,CHARIN,LOGIN,IOBIN,
  154. . TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,IOBRE)
  155. IF (IERR.NE.0) RETURN
  156. IPGEOM = IOBRE
  157. IRET = 0
  158. ENDIF
  159.  
  160. C Lecture d'une TABLE de sous-type MAILLAGE
  161. IF(IPTABM.EQ.0) THEN
  162. CALL LIRTAB('MAILLAGE',IPTABL,0,IRET)
  163. IF (IERR.NE.0) RETURN
  164. IF (IRET.GT.0) THEN
  165. IPTABM = IPTABL
  166. IVALIN=1
  167. XVALIN=REAL(0.D0)
  168. LOGIN=.TRUE.
  169. IOBIN=0
  170. TAPIND='ENTIER '
  171. CHARIN=' '
  172. TYPOBJ='MAILLAGE'
  173. CALL ACCTAB(IPTABM,TAPIND,IVALIN,XVALIN,CHARIN,LOGIN,IOBIN,
  174. . TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,IOBRE)
  175. IF (IERR.NE.0) RETURN
  176. IPGEOM = IOBRE
  177. IRET = 0
  178. ENDIF
  179. ENDIF
  180.  
  181. C Lecture d'un MAILLAGE ou d'une TABLE de sous-type DOMAINE
  182. IPTABL = 0
  183. IPGEO2 = 0
  184. IReMOD = 0
  185. CALL LIRTAB('DOMAINE',IPTABL,0,IRET)
  186. IF (IERR.NE.0) RETURN
  187. IF (IPTABL.GT.0) THEN
  188. IVALIN=0
  189. XVALIN=REAL(0.D0)
  190. LOGIN=.TRUE.
  191. IOBIN=0
  192. TAPIND='MOT '
  193. CHARIN='MAILLAGE'
  194. TYPOBJ='MAILLAGE'
  195. CALL ACCTAB(IPTABL,TAPIND,IVALIN,XVALIN,CHARIN,LOGIN,IOBIN,
  196. & TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,IOBRE)
  197. IF (IERR.NE.0) RETURN
  198. IPGEOM = IOBRE
  199. ENDIF
  200.  
  201. C Lecture d'un MAILLAGE (cas general) :
  202. IF (IPGEOM.LE.0) THEN
  203. CALL LIROBJ('MAILLAGE',IPGEOM,1,IRET)
  204. IF (IERR.NE.0) RETURN
  205. ENDIF
  206.  
  207. C Verification de l'unicite des elements
  208. c On ne tient pas compte de l'ordre des noeuds dans l'element
  209. IPT1 = IPGEOM
  210. iordre=0
  211. CALL UNIQMA(IPT1,NBDI1,iordre)
  212. IF (NBDI1 .NE. 0) THEN
  213. MOTERR(1:8)='MAILLAGE'
  214. CALL ERREUR(1019)
  215. RETURN
  216. ENDIF
  217.  
  218. C Lecture d'une FORMULATION
  219. NFOR =0
  220. NMAT =0
  221. CALL MESLIR(-182)
  222. ICOND=1
  223. CALL MESLIR(-182)
  224.  
  225. 51 CONTINUE
  226. CALL LIRMOT(MOFORM,NBFORM,IPFORM,ICOND)
  227. IF (IERR.NE.0) RETURN
  228. IF (IPFORM .EQ. 0) GOTO 52
  229.  
  230. NFOR=NFOR+1
  231. IF (NFOR.GT.2) THEN
  232. CALL ERREUR(251)
  233. RETURN
  234. ENDIF
  235. LESFOR(NFOR)=MOFORM(IPFORM)
  236. ICOND=0
  237. CALL MESLIR(-181)
  238. GOTO 51
  239.  
  240. 52 CONTINUE
  241. C Cas d'une FORMULATION simple (NFOR=1)
  242. IF (NFOR.EQ.1) THEN
  243. c jderiv=mepsil
  244. cbp,2020-12-10 : abandon de MEPSIL (CCOPTIO) et IDERIV (MMODEL)
  245. IF (LESFOR(1).EQ.'THERMIQUE') THEN
  246. CALL MODEL1(MOPROP,NPROP,MOTEF,NBTEF,N1MAX,N2MAX)
  247. ELSE IF(LESFOR(1).EQ.'MECANIQUE') THEN
  248. CALL MODEL2(MOPROP,NPROP,MOTEF,NBTEF,N1MAX,N2MAX)
  249. ELSE IF(LESFOR(1).EQ.'LIQUIDE') THEN
  250. CALL MODEL3(MOPROP,NPROP,MOTEF,NBTEF,N1MAX,N2MAX)
  251. ELSE IF(LESFOR(1).EQ.'POREUX') THEN
  252. CALL MODEL6(MOPROP,NPROP,MOTEF,NBTEF,N1MAX,N2MAX)
  253. ELSE IF(LESFOR(1).EQ.'DARCY') THEN
  254. CALL MODEL7(MOPROP,NPROP,MOTEF,NBTEF,N1MAX,N2MAX)
  255. ELSE IF(LESFOR(1).EQ.'CONTACT') THEN
  256. CALL MODEL8(MOPROP,NPROP,MOTEF,NBTEF,N1MAX,N2MAX)
  257. ELSE IF(LESFOR(1).EQ.'MAGNETODYNAMIQUE') THEN
  258. CALL MODE10(MOPROP,NPROP,MOTEF,NBTEF,N1MAX,N2MAX)
  259. ELSE IF(LESFOR(1).EQ.'NAVIER_STOKES') THEN
  260. CALL MODE11(MOPROP,NPROP,MOTEF,NBTEF,N1MAX,N2MAX)
  261. ELSE IF (LESFOR(1).EQ.'MELANGE') THEN
  262. CALL MODE12(MOPROP,NPROP,MOTEF,NBTEF,N1MAX,N2MAX)
  263. DO i=1,N1MAX
  264. LESMOD(i)=0
  265. ENDDO
  266. ELSE IF(LESFOR(1).EQ.'EULER') THEN
  267. CALL MODE13(MOPROP,NPROP,NBTEF,N1MAX)
  268. ELSE IF(LESFOR(1).EQ.'FISSURE') THEN
  269. CALL MODE14(MOPROP,NPROP,MOTEF,NBTEF,N1MAX,N2MAX)
  270. ELSE IF(LESFOR(1).EQ.'LIAISON') THEN
  271. CALL MODE15(MOPROP,NPROP,MOTEF,NBTEF,N1MAX,N2MAX)
  272. ELSE IF(LESFOR(1).EQ.'THERMOHYDRIQUE') THEN
  273. CALL MODE16(MOPROP,NPROP,MOTEF,NBTEF,N1MAX,N2MAX)
  274. ELSE IF(LESFOR(1).EQ.'ELECTROSTATIQUE ') THEN
  275. CALL MODE17(MOPROP,NPROP,MOTEF,NBTEF,N1MAX,N2MAX)
  276. ELSE IF(LESFOR(1).EQ.'DIFFUSION ') THEN
  277. CALL MODE18(MOPROP,NPROP,MOTEF,NBTEF,N1MAX,N2MAX)
  278. ELSE IF(LESFOR(1).EQ.'CHARGEMENT ') THEN
  279. CALL MODE19(MOPROP,NPROP,MOTEF,NBTEF,N1MAX,N2MAX)
  280. ELSE IF(LESFOR(1).EQ.'METALLURGIE ') THEN
  281. cjk148537 : ce n'est pas l exemple a suivre
  282. CALL MODE21(MOPROP,NPROP,MOTEF,NBTEF,N1MAX,N2MAX)
  283. ELSE IF(LESFOR(1).EQ.'CHANGEMENT_PHASE') THEN
  284. CALL MODE22(MOPROP,NPROP,MOTEF,NBTEF,N1MAX,N2MAX)
  285. ELSE IF(LESFOR(1).EQ.'CONTRAINTE') THEN
  286. CALL MODE24(MOPROP,NPROP,MOTEF,NBTEF,N1MAX,N2MAX)
  287. ELSE
  288. CALL ERREUR (251)
  289. ENDIF
  290. IF (IERR.NE.0) RETURN
  291.  
  292. ELSE
  293. C Cas d'une FORMULATION couplee (NFOR=2)
  294. c jderiv=mepsil
  295. cbp,2020-12-10 : abandon de MEPSIL (CCOPTIO) et IDERIV (MMODEL)
  296. IF ((LESFOR(1).EQ.'LIQUIDE'.AND.LESFOR(2).EQ.'MECANIQUE').OR.
  297. & (LESFOR(2).EQ.'LIQUIDE'.AND.LESFOR(1).EQ.'MECANIQUE')) THEN
  298. CALL MODEL5(NPROP,MOTEF,NBTEF,N2MAX)
  299. ELSE
  300. CALL ERREUR(251)
  301. ENDIF
  302. IF (IERR.NE.0) RETURN
  303. ENDIF
  304.  
  305. C Lecture eventuelle des proprietes du MODELE de MATERIAU
  306. ifrtt = 0
  307. IFROCA = 0
  308. ifacaf = 0
  309. isyme = 0
  310. nbga = 10
  311. nbdang = 3
  312. icavit = 0
  313. kjh = 0
  314. ISRCE = 0
  315. IRAYE = 0
  316. ICONV = 0
  317. NMAT = 0
  318. iprop = 0
  319. ipgeo2 = 0
  320. if (iptabm.gt.0.and.iptabs.eq.0) goto 674
  321. IF (NPROP.EQ.0) GOTO 43
  322. CALL MESLIR(-180)
  323. 41 CONTINUE
  324. IF (NMAT .NE.0) CALL MESLIR(-179)
  325. CALL LIRMOT(MOPROP,NPROP,LAPROP,0)
  326. IF (IERR.NE.0) RETURN
  327.  
  328. C ---------- Cas d'un MODELE de CONTACT
  329. IF(LESFOR(1).EQ.'CONTACT') then
  330. * si FROTTANT lecont=3
  331. if(laprop.eq.3) lecont=laprop
  332. if(laprop.eq.5) then
  333. ifrtt=0
  334. ifroca=1
  335. C call lirobj('MMODEL',IFROCA,1,iOK)
  336. C IF(ierr.NE.0) return
  337. Call lirobj('MAILLAGE',IBETON,1,IOK)
  338. IF(ierr.NE.0) return
  339. endif
  340. if(laprop.eq.4) then
  341. ifrtt=1
  342. endif
  343. ENDIF
  344.  
  345. C ---------- Cas d'un MODELE de CONTRAINTE
  346. IF(LESFOR(1).EQ.'CONTRAINTE') then
  347. if(laprop.ne.0) then
  348. lactr=laprop
  349. NMAT=NMAT+1
  350. LESPRO(NMAT)=MOPROP(LAPROP)
  351. endif
  352. if (lactr.ne.0) goto 42
  353. ENDIF
  354.  
  355. C ---------- Cas d'un MODELE de METALLURGIE
  356. C modele cree par T.L. en mai 2018
  357. IF (lesfor(1).eq.'METALLURGIE' .AND. NMAT.le.4 ) THEN
  358. NMAT=NMAT+1
  359. IF( laprop .eq. 1 ) THEN
  360. C On vas lire le LISTMOTS qui suit le mot-clef MOPROP(1)='PHASES'
  361. CALL LIROBJ('LISTMOTS', lucvar, 1, IRETOU)
  362. MLMOTS = lucvar
  363. segact MLMOTS
  364. NB_PHA = MLMOTS.MOTS(/2)
  365. C On remplira ensuite MATMOD() avec lespro()
  366. cjk148537 lespro(laprop) = MOPROP(laprop)
  367.  
  368. ELSEIF( laprop .eq. 2 ) THEN
  369. C On vas lire le LISTMOTS qui suit le mot-clef MOPROP(2)='REACTIFS'
  370. CALL LIROBJ('LISTMOTS', ireact, 1, IRETOU)
  371. MLMOT1 = ireact
  372. segact MLMOT1
  373. NB_REA = MLMOT1.MOTS(/2)
  374. C On remplira ensuite MATMOD() avec lespro()
  375. cjk148537 lespro(laprop) = MOPROP(laprop)
  376.  
  377. ELSEIF( laprop .eq. 3 ) THEN
  378. C On vas lire le LISTMOTS qui suit le mot-clef MOPROP(3)='PRODUITS'
  379. CALL LIROBJ('LISTMOTS', iprodu, 1, IRETOU)
  380. MLMOT2 = iprodu
  381. segact MLMOT2
  382. NB_PRO = MLMOT2.MOTS(/2)
  383. C On remplira ensuite MATMOD() avec lespro()
  384. cjk148537 lespro(laprop) = MOPROP(laprop)
  385.  
  386. ELSEIF( laprop .eq. 4 ) THEN
  387. C On vas lire le LISTMOTS qui suit le mot-clef MOPROP(4)='TYPE'
  388. CALL LIROBJ('LISTMOTS', lucmat, 1, IRETOU)
  389. MLMOT3 = lucmat
  390. segact MLMOT3
  391. NB_TYP = MLMOT3.MOTS(/2)
  392. C On remplira ensuite MATMOD() avec lespro()
  393. do jj = 1,nb_typ
  394. lespro(jj) = mlmot3.mots(jj)
  395. enddo
  396.  
  397. ELSE
  398. CALL ERREUR(5)
  399. RETURN
  400. ENDIF
  401.  
  402. C Les pointeurs lucvar et lucmat sont ensuite transmis a
  403. C inomid pour remplir les NOMID de l'objet MMODEL
  404. C Les pointeurs lucvar, ireact, iprodu, lucmat seront mis
  405. C dans le tableau IVAMOD de l'objet IMODEL
  406.  
  407. IF(NMAT .lt. 4) THEN
  408. C On n'a pas encore recuperer toutes les donnees
  409. go to 41
  410.  
  411. ELSE IF(NMAT .eq. 4) THEN
  412.  
  413. C On emet une erreur si les MLMOTS 'REACTIFS', 'PRODUITS' et
  414. C 'TYPES' n'ont pas ete luts
  415. if(ireact .le. 0 .OR. iprodu .le. 0 .OR. lucmat .le. 0) then
  416. CALL ERREUR(21)
  417. RETURN
  418. endif
  419.  
  420. C Autant de produits que de reactifs
  421. if( NB_PRO .ne. NB_REA ) then
  422. CALL ERREUR(1078)
  423. RETURN
  424. endif
  425.  
  426. C On initialise le MLMOTS des PHASES si celui ci n'a pas ete lu
  427. icompt = 0
  428. if( lucvar .le. 0) then
  429. icompt = 1
  430. NB_PHA = NB_REA + NB_PRO
  431. JGN = LOCOMP
  432. JGM = NB_PHA
  433. SEGINI, MLMOTS
  434. lucvar = MLMOTS
  435. C On remplira ensuite MATMOD() avec lespro()
  436. lespro(1) = MOPROP(1)
  437. endif
  438.  
  439. C On a recuperer toutes les donnees, on effectue quelques tests
  440. do ipha = 1, NB_PRO
  441.  
  442. C Produits differents du reactif pour chaque reaction
  443. if( MLMOT1.MOTS(ipha) .eq. MLMOT2.MOTS(ipha) ) then
  444. MOTERR(1:4)=MLMOT1.MOTS(ipha)
  445. MOTERR(5:8)=MLMOT2.MOTS(ipha)
  446. CALL ERREUR(1075)
  447. RETURN
  448. endif
  449.  
  450. irphas = 0
  451. ipphas = 0
  452. CALL PLACE(MLMOTS.MOTS, NB_PHA, irphas, MLMOT1.MOTS(ipha))
  453. CALL PLACE(MLMOTS.MOTS, NB_PHA, ipphas, MLMOT2.MOTS(ipha))
  454. C Si le nom du produit ou du reactif n'a pas ete lu dans le
  455. C MLMOTS des PHASES :
  456. C On le rajoute si lucvar n'avait pas ete lu
  457. C On emet une erreur sinon
  458. if(irphas .eq. 0) then
  459. if( icompt .ge. 1 ) then
  460. MLMOTS.MOTS(icompt) = MLMOT1.MOTS(ipha)
  461. icompt = icompt + 1
  462. else
  463. MOTERR(1:4)=MLMOT1.MOTS(ipha)
  464. CALL ERREUR(1080)
  465. RETURN
  466. endif
  467. endif
  468. if(ipphas .eq. 0) then
  469. if( icompt .ge. 1 ) then
  470. MLMOTS.MOTS(icompt) = MLMOT2.MOTS(ipha)
  471. icompt = icompt + 1
  472. else
  473. MOTERR(1:4)=MLMOT2.MOTS(ipha)
  474. CALL ERREUR(1080)
  475. RETURN
  476. endif
  477. endif
  478.  
  479. enddo
  480. C On corrige la taille de MLMOTS :
  481. if( icompt .ge. 1 ) then
  482. JGM = icompt - 1
  483. JGN = MLMOTS.MOTS(/1)
  484. SEGADJ, MLMOTS
  485. endif
  486.  
  487. C Un type de reaction definit pour chaque reaction
  488. if( NB_TYP .ne. NB_PRO ) then
  489. CALL ERREUR(1077)
  490. RETURN
  491. endif
  492.  
  493. LAPROP = 0
  494.  
  495. segact,MLMOTS*NOMOD, MLMOT1*NOMOD, MLMOT2*NOMOD, MLMOT3*NOMOD
  496. ENDIF
  497. ENDIF
  498.  
  499. C ---------- Cas d'un MODELE de THERMIQUE CONVECTION ou RAYONNEMENT
  500. IF (lesfor(1).eq.'THERMIQUE' .AND. kjh.eq.0) then
  501. IF (moprop(laprop).eq.'CONVECTION') then
  502. ICONV=1
  503. nmat=nmat+1
  504. kjh=1
  505. lespro(nmat)=moprop(laprop)
  506. call model4(MOPROP,NPROP,MOTEF,NBTEF,N1MAX,N2MAX)
  507. go to 41
  508. ELSE IF (moprop(laprop).eq.'RAYONNEMENT') then
  509. IRAYE=1
  510. kjh=1
  511. nmat=nmat+1
  512. lespro(nmat)=moprop(laprop)
  513. call model9(MOPROP,NPROP,MOTEF,NBTEF,N1MAX,N2MAX)
  514. go to 41
  515. ELSE IF (moprop(laprop).eq.'SOURCE') then
  516. ISRCE=1
  517. kjh=1
  518. nmat=nmat+1
  519. lespro(nmat)=moprop(laprop)
  520. call mode23(MOPROP,NPROP,MOTEF,NBTEF,N1MAX,N2MAX)
  521. go to 41
  522. ENDIF
  523. ENDIF
  524.  
  525. C ---------- Cas d'un MODELE de RAYONNEMENT
  526. IF (IRAYE.EQ.1) then
  527. if(laprop.eq.1) icavit=1
  528. if(laprop.eq.9) then
  529. call lirent( nbdang,1,iretou)
  530. if(ierr.ne.0) return
  531. endif
  532. if(laprop.eq.8) then
  533. call lirent( nbga,1,iretou)
  534. if(ierr.ne.0) return
  535. endif
  536. if(laprop.eq.7)then
  537. isyme=1
  538. call lirobj('POINT',ipp1,1,iretou)
  539. if(ierr.ne.0) return
  540. call lirobj('POINT',ipp2,1,iretou)
  541. if(idim.eq.3)call lirobj('POINT',ipp3,1,iretou)
  542. if(ierr.ne.0) return
  543. endif
  544. if(laprop.eq.2) then
  545. ifacaf=1
  546. call lirobj('MAILLAGE',ipfac1,1,iretou)
  547. if(ierr.ne.0) return
  548. call lirobj('MAILLAGE',ipfac2,1,iretou)
  549. if(ierr.ne.0) return
  550. call lirobj('MAILLAGE',ipfac3,1,iretou)
  551. if(ierr.ne.0) return
  552. call lirobj('MMODEL' ,imoco ,1,iretou)
  553. if(ierr.ne.0) return
  554. call actobj('MAILLAGE',ipfac1,1)
  555. call actobj('MAILLAGE',ipfac2,1)
  556. call actobj('MAILLAGE',ipfac3,1)
  557. call actobj('MMODEL' ,imoco,1)
  558. endif
  559. if (ierr.ne.0) return
  560. ENDIF
  561.  
  562. C ---------- MODELE de SOURCE
  563. IF (ISRCE.EQ.1) then
  564. C Par DEFAUT, formulation generale (initialement "UNIFORME")
  565. C IF (laprop.eq.0) THEN
  566. C nmat=nmat+1
  567. C lespro(nmat)=moprop(1)
  568. C ENDIF
  569. ISRCE=ISRCE+1
  570. ELSEIF (ISRCE.EQ.2) THEN
  571. IF (lespro(nmat).EQ.'GAUSSIENNE') THEN
  572. IF (IDIM.EQ.1) THEN
  573. INTERR(1) = IDIM
  574. CALL ERREUR(1104)
  575. RETURN
  576. ENDIF
  577. C Source Gaussienne : par DEFAUT, SPHERIQUE
  578. IF (laprop.eq.0) THEN
  579. nmat=nmat+1
  580. lespro(nmat)=moprop(2)
  581. ELSE IF (laprop.eq.4) THEN
  582. IF (IDIM.LT.3) THEN
  583. INTERR(1)=IDIM
  584. CALL ERREUR(709)
  585. RETURN
  586. ENDIF
  587. ENDIF
  588. ENDIF
  589. ISRCE=ISRCE+1
  590. ENDIF
  591.  
  592. C ---------- Cas d'un MODELE de MELANGE
  593. IF (LESFOR(1).EQ.'MELANGE') THEN
  594. CALL LIROBJ('MMODEL',ipmod,0,iOK)
  595. IF (IERR.NE.0) RETURN
  596. C ----- le melange par defaut est 'PARALLELE'
  597. IF (iOK.EQ.1) THEN
  598. CALL ACTOBJ('MMODEL',ipmod,1)
  599. IF (IERR.NE.0) RETURN
  600. IF (LAPROP.EQ.0) LAPROP=3
  601. LESMOD(1)=ipmod
  602. ENDIF
  603. ENDIF
  604. C
  605. IF (LAPROP .EQ. 0) GOTO 42
  606. NMAT=NMAT+1
  607. LESPRO(NMAT)=MOPROP(LAPROP)
  608. GOTO 41
  609.  
  610. 42 CONTINUE
  611.  
  612. IF (NMAT .NE. 0) THEN
  613. C on teste tout de suite l'existence de la donnee de la derivee
  614. C il ne faut pas de modele de materiau commencant par deri
  615. nmit=nmat
  616. do i=1,nmit
  617. if( lespro(i)(1:4).eq.'EPSI') then
  618. call erreur(19)
  619. return
  620. endif
  621. enddo
  622.  
  623. C on cherche le mot 'EPSI'
  624. CALL LIRMOT(deriv,1,itrou,0)
  625. IF(itrou.ne.0) THEN
  626. c call lirmot(mderiv,5,iret,1)
  627. c if(ierr.ne.0) return
  628. c Jderiv=iret
  629. cbp,2020-12-10 : abandon de MEPSIL (CCOPTIO) et IDERIV (MMODEL)
  630. MOTERR(1:40)='MODE ... EPSI ... ;'
  631. CALL ERREUR(1056)
  632. RETURN
  633. ENDIF
  634.  
  635. IF (LESFOR(1).EQ.'THERMIQUE'.AND.ISRCE.EQ.0) THEN
  636. C +---------------------------------------------------------+
  637. C | FORMULATION THERMIQUE : 'ISOTROPE' |
  638. C +---------------------------------------------------------+
  639. IPROP = 3
  640. IF (IDIM.EQ.1) IPROP = 1
  641. CALL PLACE(MOPROP,IPROP,IPLAC,LESPRO(1))
  642. IF (IPLAC.EQ.0) THEN
  643. DO i=NMAT,1,-1
  644. LESPRO(i+1)=LESPRO(i)
  645. ENDDO
  646. LESPRO(1)='ISOTROPE'
  647. NMAT=NMAT+1
  648. ELSEif(NMAT.EQ.1)THEN
  649. NMAT=NMAT+1
  650. LESPRO(2)='CONDUCTION'
  651. ENDIF
  652.  
  653. C Ajout du mot 'CONDUCTION' si besoin avec phase et advection
  654. idoico=0
  655. idejco=0
  656. DO i=1,nmat
  657. CALL PLACE (OPTEMP,3,iplac,LESPRO(i))
  658. if(iplac.eq.1.or.iplac.eq.2) idoico=1
  659. if(iplac.eq.3) idejco=1
  660. enddo
  661.  
  662. if( idoico.ne.0.and.idejco.eq.0) then
  663. nmat=nmat+1
  664. lespro(nmat)='CONDUCTION'
  665. endif
  666.  
  667. ELSEIF (LESFOR(1).EQ.'MECANIQUE'.OR. LESFOR(1).EQ.'POREUX') THEN
  668. C +----------------------------------------------------------+
  669. C | FORMULATION MECANIQUE / POREUX : 'ELASTIQUE' 'ISOTROPE' |
  670. C +----------------------------------------------------------+
  671. IF (NMAT.GE.2)THEN
  672. CALL MODELA(MOPROP,NMOD)
  673. CALL PLACE(MOPROP,NMOD,IPLAC,LESPRO(2))
  674. IF (IPLAC.EQ.0) THEN
  675. DO i=NMAT,2,-1
  676. LESPRO(i+1)=LESPRO(i)
  677. ENDDO
  678. LESPRO(2)='ISOTROPE'
  679. NMAT=NMAT+1
  680. ENDIF
  681. ELSE IF (NMAT.EQ.1) THEN
  682. LESPRO(2)='ISOTROPE'
  683. NMAT=2
  684. ENDIF
  685. C MECANIQUE / POREUX : modele par defaut en comportement non lineaire
  686. CALL MODNLI(MOPROP,NMOD)
  687. CALL PLACE(MOPROP,NMOD,IPLAC,LESPRO(NMAT))
  688. C Par defaut : PLASTIQUE ISOTROPE
  689. IF (IPLAC.EQ.1) THEN
  690. NMAT=NMAT+1
  691. LESPRO(NMAT)='ISOTROPE'
  692. C Par defaut : FLUAGE NORTON
  693. ELSE IF (IPLAC.EQ.2) THEN
  694. NMAT=NMAT+1
  695. LESPRO(NMAT)='NORTON'
  696. C Par defaut : VISCOPLASTIQUE ONERA
  697. ELSE IF (IPLAC.EQ.3) THEN
  698. NMAT=NMAT+1
  699. LESPRO(NMAT)='ONERA'
  700. C Par defaut : ENDOMMAGEMENT MAZARS
  701. ELSE IF (IPLAC.EQ.4) THEN
  702. NMAT=NMAT+1
  703. LESPRO(NMAT)='MAZARS'
  704. C Par defaut : ENDOMMAGEMENT PLASTIQUE P/Y
  705. ELSE IF (IPLAC.EQ.5) THEN
  706. NMAT=NMAT+1
  707. LESPRO(NMAT)='PSURY'
  708. ELSE IF (IPLAC.EQ.6) THEN
  709. C Si 'MECANIQUE' OU 'POREUX' : pas de comportement par defaut
  710. C pour 'NON_LINEAIRE'
  711. CALL ERREUR(945)
  712. RETURN
  713. ELSE IF (IPLAC.EQ.7) THEN
  714. C Si 'MECANIQUE' : pas de comportement par defaut pour 'VISCO_EXTERNE'
  715. IF (LESFOR(1).EQ.'MECANIQUE') THEN
  716. CALL ERREUR(946)
  717. C Si 'POREUX' : option non implementee
  718. ELSE IF (LESFOR(1).EQ.'POREUX') THEN
  719. CALL ERREUR(251)
  720. ENDIF
  721. RETURN
  722. ENDIF
  723.  
  724. ELSEIF (LESFOR(1).EQ.'MAGNETODYNAMIQUE') THEN
  725. C +---------------------------------------------------------------+
  726. C | FORMULATION MAGNETODYNAMIQUE : 'POTENTIEL_VECTEUR' 'ISOTROPE' |
  727. C +---------------------------------------------------------------+
  728. IF (NMAT.EQ.1) THEN
  729. IF (LESPRO(1).NE.'POTENTIEL_VECTEU') THEN
  730. LESPRO(2)=LESPRO(1)
  731. LESPRO(1)='POTENTIEL_VECTEU'
  732. ELSE
  733. LESPRO(2)='ISOTROPE'
  734. ENDIF
  735. NMAT=2
  736. ENDIF
  737.  
  738. ELSEIF (LESFOR(1).EQ.'MELANGE' ) THEN
  739. C +-------------------------------+
  740. C | FORMULATION MELANGE : 'CEREM' |
  741. C +-------------------------------+
  742. NMAT1=NMAT
  743. IF (NMAT.EQ.0) THEN
  744. LESPRO(1)='CEREM'
  745. NMAT=1
  746. ENDIF
  747.  
  748. ELSEIF (LESFOR(1).EQ.'LIAISON' ) THEN
  749. C +-------------------------------------------------+
  750. C | FORMULATION LIAISON : pas d''option par defaut |
  751. C +-------------------------------------------------+
  752.  
  753. ELSEIF (LESFOR(1).EQ.'ELECTROSTATIQUE' ) THEN
  754. C +-------------------------------------------+
  755. C | FORMULATION ELECTROSTATIQUE : 'ISOTROPE' |
  756. C +-------------------------------------------+
  757. IPROP = 3
  758. IF (IDIM.EQ.1) IPROP = 1
  759. CALL PLACE(MOPROP(1),IPROP,IPLAC,LESPRO(1))
  760. IF (IPLAC.EQ.0) THEN
  761. DO i=NMAT,1,-1
  762. LESPRO(i+1)=LESPRO(i)
  763. ENDDO
  764. LESPRO(1)='ISOTROPE'
  765. NMAT=NMAT+1
  766. ENDIF
  767.  
  768. ELSEIF (LESFOR(1).EQ.'DIFFUSION' ) THEN
  769. C +-------------------------------------------+
  770. C | FORMULATION DIFFUSION : 'ISOTROPE' 'FICK' |
  771. C +-------------------------------------------+
  772. IPROP = 3
  773. IF (IDIM.EQ.1) IPROP = 1
  774. CALL PLACE(MOPROP(1),IPROP,IPLAC,LESPRO(1))
  775. IF (IPLAC.EQ.0) THEN
  776. DO i=NMAT,1,-1
  777. LESPRO(i+1)=LESPRO(i)
  778. ENDDO
  779. LESPRO(1)='ISOTROPE'
  780. NMAT=NMAT+1
  781. ENDIF
  782. CALL MODDIF(MOPROP,NMOD)
  783. CALL PLACE(MOPROP,NMOD,IPLAC,LESPRO(NMAT))
  784. IF (IPLAC.EQ.0) THEN
  785. NMAT=NMAT+1
  786. LESPRO(NMAT)='FICK'
  787. ENDIF
  788.  
  789. C Ajout du mot 'FICK' si besoin avec 'ADVECTION'
  790. CALL PLACE(LESPRO,nmat,iplac,'ADVECTION')
  791. if(iplac .gt. 0) then
  792. NMAT=NMAT+1
  793. LESPRO(NMAT)='FICK'
  794. endif
  795.  
  796. ELSEIF (LESFOR(1).EQ.'CONTACT' ) THEN
  797. C +----------------------------------+
  798. C | FORMULATION CONTACT : UNILATERAL |
  799. C +----------------------------------+
  800. call place ( moprop,2,iplac,lespro(1))
  801. if( iplac.eq.0) then
  802. do iur=1,nmat
  803. lespro(nmat+2-iur)=lespro (nmat +1-iur)
  804. enddo
  805. lespro(1)='UNILATERAL'
  806. nmat=nmat+1
  807. endif
  808.  
  809. ELSEIF (LESFOR(1).EQ.'CONTRAINTE' ) THEN
  810. C +----------------------------------+
  811. C | FORMULATION CONTRAINTE |
  812. C +----------------------------------+
  813. call place ( moprop,3,iplac,lespro(1))
  814. if (iplac.eq.0) then
  815. do iur=1,nmat
  816. lespro(nmat+2-iur)=lespro (nmat +1-iur)
  817. enddo
  818. lespro(1)='CINEMATIQUE'
  819. nmat=nmat+1
  820. endif
  821. ENDIF
  822.  
  823. ELSE
  824. C si NMAT=0 on met le premier mot autorise
  825. NMAT = 1
  826. LESPRO(1)= MOPROP(1)
  827.  
  828. IF (LESFOR(1).EQ.'CHARGEMENT') THEN
  829. C +------------------------------------------------------------------+
  830. C | Defaut pour une FORMULATION CHARGEMENT : PAS DE CHOIX PAR DEFAUT |
  831. C +------------------------------------------------------------------+
  832. C L'UTILISATEUR DOIT SPECIFIER D'AUTRES MOT CLES APRES 'CHARGEMENT'
  833. CALL ERREUR(251)
  834. RETURN
  835.  
  836. ELSEIF(LESFOR(1).EQ.'THERMIQUE') THEN
  837. C +----------------------------------------------------+
  838. C | Defaut pour une FORMULATION THERMIQUE : CONDUCTION |
  839. C +----------------------------------------------------+
  840. NMAT = NMAT+1
  841. LESPRO(NMAT)='CONDUCTION'
  842.  
  843. ELSEIF (LESFOR(1).EQ.'MECANIQUE'.OR.
  844. & LESFOR(1).EQ.'POREUX' .OR.
  845. & LESFOR(1).EQ.'MAGNETODYNAMIQUE') THEN
  846. C +------------------------------------------------------------------------------+
  847. C | Defaut pour une FORMULATION MECANIQUE, POREUX ou MAGNETODYNAMIQUE : ISOTROPE |
  848. C +------------------------------------------------------------------------------+
  849. NMAT=NMAT+1
  850. LESPRO(NMAT)='ISOTROPE'
  851.  
  852. ELSEIF (LESFOR(1).EQ.'DIFFUSION') THEN
  853. C +----------------------------------------------+
  854. C | Defaut pour une FORMULATION DIFFUSION : FICK |
  855. C +----------------------------------------------+
  856. NMAT = NMAT+1
  857. LESPRO(NMAT)='FICK'
  858.  
  859. ELSEIF (LESFOR(1).EQ.'NAVIER_STOKES'.OR.
  860. & LESFOR(1).EQ.'EULER') THEN
  861. C +----------------------------------------------------------------+
  862. C | Defaut pour une FORMULATION NAVIER_STOKES OU EULER : NEWTONIEN |
  863. C +----------------------------------------------------------------+
  864. NMAT = 1
  865. LESPRO(NMAT)='NEWTONIEN'
  866.  
  867. ELSEIF (LESFOR(1).EQ.'FISSURE') THEN
  868. C +-------------------------------------+
  869. C | Defaut pour une FORMULATION FISSURE |
  870. C +-------------------------------------+
  871. NMAT = 3
  872. LESPRO(1)='MASS'
  873. LESPRO(2)='PARF'
  874. LESPRO(3)='POISEU_BLASIUS'
  875.  
  876. ELSEIF(LESFOR(1).EQ.'CONTACT') THEN
  877. C +---------------------------------------------------+
  878. C | Defaut pour une FORMULATION CONTACT : UNILATERAL |
  879. C +---------------------------------------------------+
  880. NMAT=1
  881. LESPRO(1)='UNILATERAL'
  882.  
  883. ELSEIF(LESFOR(1).EQ.'CONTRAINTE') THEN
  884. C +---------------------------------------------------+
  885. C | Defaut pour une FORMULATION CONTRAINTE |
  886. C +---------------------------------------------------+
  887. NMAT=1
  888. LESPRO(1)='CINEMATIQUE'
  889. ENDIF
  890. ENDIF
  891.  
  892. IF(LESFOR(1).EQ.'CHANGEMENT_PHASE' ) THEN
  893. C +------------------------------------------------------------------------+
  894. C | FORMULATION CHANGEMENT_PHASE : LECTURE DES INCONNUES PRIMALES & DUALES |
  895. C +------------------------------------------------------------------------+
  896. CALL LIRMOT(MOINCO,NBDIF,IPLAC,0)
  897. IF (IPLAC.EQ.0) THEN
  898. CALL ERREUR(1093)
  899. RETURN
  900.  
  901. ELSE
  902. IF (LESPRO(1)(1:10).EQ.'PARFAIT ') THEN
  903. JGM=2
  904. ELSEIF (LESPRO(1)(1:10).EQ.'SOLUBILITE') THEN
  905. JGM=4
  906. ELSE
  907. CALL ERREUR(5)
  908. ENDIF
  909. JGN =LOCOMP
  910. SEGINI,MLMOT1
  911. IPRIDU=MLMOT1
  912. DO IMOT=1,JGM
  913. CALL LIRCHA(MOPRID,1,ILONG)
  914. IF (IERR.NE.0) RETURN
  915. MLMOT1.MOTS(IMOT) = MOPRID
  916. ENDDO
  917. ENDIF
  918. ENDIF
  919.  
  920. 43 CONTINUE
  921. C Lecture eventuelle des types d'ELEMENTS FINIS a utiliser
  922. ITEF=0
  923. C=DEB==== FORMULATION HHO ==== Cas particulier =========================
  924. CALL LIRMOT(mcHHO,NMHHO,iHHO,0)
  925. IF (IERR.NE.0) RETURN
  926. IF (iHHO.NE.0) THEN
  927. CALL REFUS
  928. CALL LIRCHA(chaHHO,1,IRETI)
  929. IF (IERR.NE.0) RETURN
  930. loHHO = .TRUE.
  931. END IF
  932. C=FIN==== FORMULATION HHO ==============================================
  933. IF (NBTEF.EQ.0) GOTO 2
  934. C WRITE(*,*) 'MODELI:',(MOTEF(i),':',i=1,NBTEF)
  935. CALL MESLIR(-178)
  936. 1 CONTINUE
  937. CALL LIRMOT(MOTEF,NBTEF,LETEF,0)
  938. IF (IERR.NE.0) RETURN
  939. IF (LETEF.EQ.0) GOTO 2
  940. ITEF=ITEF+1
  941. LESTEF(ITEF)=MOTEF(LETEF)
  942. if (ITEF.eq.1.and.lesfor(1).eq.'NAVIER_STOKES') goto 2
  943. CALL MESLIR(-177)
  944. GOTO 1
  945.  
  946. 2 CONTINUE
  947. c Lecture eventuelle de listmots
  948. jlmot1 = 0
  949. jlmot2 = 0
  950. CALL LIROBJ('LISTMOTS',jlmot1,0,iret)
  951. if (ierr.ne.0) return
  952. if (jlmot1.gt.0) then
  953. call lirobj('LISTMOTS',jlmot2,1,iret)
  954. if (ierr.ne.0) return
  955. mlmot5 = jlmot1
  956. mlmot6 = jlmot2
  957. segact,mlmot5,mlmot6
  958. if (mlmot5.mots(/2).ne.mlmot6.mots(/2)) then
  959. call erreur(26)
  960. return
  961. endif
  962. endif
  963.  
  964. C lecture pour mecanique aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
  965. C En formulations 'MECANIQUE' et 'POREUX' : detection d'une loi non
  966. C lineaire externe, le cas echeant saisie de donnees complementaires.
  967. C Caracterisation : loi non lineaire externe si
  968. C - famille 'VISCO_EXTERNE' ou
  969. C - famille 'NON_LINEAIRE', materiau 'UTILISATEUR'.
  970. C si pas loi externe lecture eventuelle des parametres externes
  971. LMEEXT=.FALSE.
  972. LMEVIX=.FALSE.
  973. LMENLX=.FALSE.
  974. LMENUM = 0
  975. LMENOM = ' '
  976. LMELIB = ' '
  977. LMEFCT = ' '
  978. LMELGB = 0
  979. LMELGT = 0
  980. LMELOI = 0
  981. LMEPTR = 0
  982.  
  983. IF ( (NFOR.EQ.1).AND.
  984. & (LESFOR(1).EQ.'MECANIQUE'.OR.LESFOR(1).EQ.'POREUX') ) THEN
  985. DO i=1,NMAT
  986. IF (LESPRO(i).EQ.'VISCO_EXTERNE') THEN
  987. LMEVIX=.TRUE.
  988. GOTO 203
  989. ENDIF
  990. ENDDO
  991.  
  992. IF (.NOT.LMEVIX) THEN
  993. DO i=1,NMAT
  994. IF (LESPRO(i).EQ.'UTILISATEUR') THEN
  995. LMENLX = .TRUE.
  996. GOTO 203
  997. ENDIF
  998. ENDDO
  999. ENDIF
  1000. C........N.B. LMEEXT exprime la condition (NFOR.EQ.1) ET
  1001. C (LESFOR(1).EQ.'MECANIQUE') ET (loi non lineaire externe)
  1002. 203 LMEEXT = LMEVIX.OR.LMENLX
  1003. IF ( LMEEXT ) THEN
  1004. C lecture et verif des noms des materiaux, des
  1005. C noms des variables internes, des noms des parametre externe pour
  1006. C loi externes
  1007. 210 CALL LIRMOT(MOEXT,NBEXT,LEXT,0)
  1008. C Si on ne trouve plus l'un des mots cles attendus, on sort
  1009. IF (LEXT.EQ.0) GOTO 211
  1010. C Lecture d'un entier sous 'NUME_LOI'
  1011. IF (LEXT.EQ.1) THEN
  1012. CALL LIRENT(LMENUM,1,IRET)
  1013. IF (IERR.NE.0) RETURN
  1014. C Valeur illicite du numero de la loi (superieur ou egal a 1)
  1015. IF (LMENUM.LT.1 .OR. LMENUM.GE.1000000) THEN
  1016. INTERR(1) = LMENUM
  1017. CALL ERREUR(36)
  1018. CALL ERREUR(947)
  1019. RETURN
  1020. ENDIF
  1021. C Lecture du nom de la loi sous 'NOM_LOI'
  1022. ELSE IF (LEXT.EQ.2) THEN
  1023. MOTEMP = ' '
  1024. CALL LIRCHA(MOTEMP,1,IRET)
  1025. IF (IERR.NE.0) RETURN
  1026. IRET = LONG(MOTEMP(1:IRET))
  1027. IF (IRET.GT.16) THEN
  1028. INTERR(1) = IRET
  1029. MOTERR = MOTEMP(1:IRET)
  1030. CALL ERREUR(-2)
  1031. CALL ERREUR(21)
  1032. RETURN
  1033. ELSE IF (IRET.LE.0) THEN
  1034. INTERR(1) = 0
  1035. MOTERR = 'NOM_LOI'
  1036. CALL ERREUR(-2)
  1037. CALL ERREUR(6)
  1038. RETURN
  1039. ENDIF
  1040. LMENOM = ' '
  1041. LMENOM(1:IRET) = MOTEMP(1:IRET)
  1042. C Lecture d'un objet LISTMOTS sous 'PARA_LOI'
  1043. ELSE IF (LEXT.EQ.3) THEN
  1044. CALL LIROBJ('LISTMOTS',LUPARX,1,IRET)
  1045. IF (IERR.NE.0) RETURN
  1046. C Lecture d'un objet LISTMOTS sous 'C_MATERIAU'
  1047. ELSE IF (LEXT.EQ.4) THEN
  1048. CALL LIROBJ('LISTMOTS',LUCMAT,1,IRET)
  1049. IF (IERR.NE.0) RETURN
  1050. C Lecture d'un objet LISTMOTS sous 'C_VARINTER'
  1051. ELSE IF (LEXT.EQ.5) THEN
  1052. CALL LIROBJ('LISTMOTS',LUCVAR,1,IRET)
  1053. IF (IERR.NE.0) RETURN
  1054. C Lecture du nom (du fichier) de la bibliotheque de la loi
  1055. ELSE IF (LEXT.EQ.6) THEN
  1056. MOTEMP = ' '
  1057. CALL LIRCHA(MOTEMP,1,IRET)
  1058. IF (IERR.NE.0) RETURN
  1059. IF (IRET.GT.LOCHAI) THEN
  1060. CALL ERREUR(1110)
  1061. RETURN
  1062. ENDIF
  1063. IRET = LONG(MOTEMP(1:IRET))
  1064. IF (IRET.LE.0) THEN
  1065. INTERR(1) = 0
  1066. MOTERR = 'LIB_LOI'
  1067. CALL ERREUR(-2)
  1068. CALL ERREUR(6)
  1069. RETURN
  1070. END IF
  1071. LMELIB = ' '
  1072. LMELIB(1:IRET) = MOTEMP(1:IRET)
  1073. LMELGB = IRET
  1074. LMEPTR = IRET
  1075. C Lecture du nom de la fonction de la loi
  1076. ELSE IF (LEXT.EQ.7) THEN
  1077. MOTEMP = ' '
  1078. CALL LIRCHA(MOTEMP,1,IRET)
  1079. IF (IERR.NE.0) RETURN
  1080. IF (IRET.GT.LOCHAI) THEN
  1081. CALL ERREUR(1110)
  1082. RETURN
  1083. ENDIF
  1084. IRET = LONG(MOTEMP(1:IRET))
  1085. IF (IRET.LE.0) THEN
  1086. INTERR(1) = 0
  1087. MOTERR = 'FCT_LOI'
  1088. CALL ERREUR(-2)
  1089. CALL ERREUR(6)
  1090. RETURN
  1091. ENDIF
  1092. LMEFCT = ' '
  1093. LMEFCT(1:IRET) = MOTEMP(1:IRET)
  1094. LMELGT = IRET
  1095. ENDIF
  1096. C On repete jusqu'a ce qu'on ne trouve plus aucun des
  1097. C mots cles attendus, regle de surcharge le cas echeant
  1098. GOTO 210
  1099. 211 CONTINUE
  1100. C...........Verifications sur les donnees
  1101. C Il manque 'NUME_LOI' ou 'NOM_LOI' (toujours obligatoire)
  1102. IF (LMENUM.EQ.0 .AND. LMENOM.EQ.' ') THEN
  1103. IF (LMELGT.EQ.0) THEN
  1104. CALL ERREUR(641)
  1105. RETURN
  1106. ENDIF
  1107. ENDIF
  1108. IF (LMENUM.NE.0 .AND. LMENOM.NE.' ') THEN
  1109. MOTERR(1:16) = 'NUME_LOINOM_LOI '
  1110. CALL ERREUR(135)
  1111. RETURN
  1112. ENDIF
  1113. C Les liste des composantes ne doivent pas etre vides.
  1114. DO i = 1, 3
  1115. IF (i.EQ.1) mlmots = LUPARX
  1116. IF (i.EQ.2) mlmots = LUCMAT
  1117. IF (i.EQ.3) mlmots = LUCVAR
  1118. IF (mlmots.NE.0) THEN
  1119. SEGACT,mlmots
  1120. NBCOMP = mlmots.mots(/2)
  1121. IF (NBCOMP.EQ.0) THEN
  1122. CALL ERREUR(964)
  1123. RETURN
  1124. ENDIF
  1125. ENDIF
  1126. ENDDO
  1127. C Dans le cas d'un modele NON_LINEAIRE UTILISATEUR, on rajoute en fin de
  1128. C liste des proprietes du modele, le numero ou le nom de la loi attribue
  1129. C par l'utilisateur.
  1130. NMAT = NMAT + 1
  1131. LESPRO(NMAT) = ' '
  1132. IF (LMENUM.EQ.0) THEN
  1133. LESPRO(NMAT) = LMENOM
  1134. IF (LMELGT.GT.0 .AND. LMENOM.EQ.' ') THEN
  1135. c* On espere mettre un numero "unique" dans le nom !
  1136. SEGINI,limode
  1137. WRITE(LESPRO(NMAT)(1:16),'(I16)') limode
  1138. SEGSUP,limode
  1139. ENDIF
  1140. ELSE
  1141. WRITE(LESPRO(NMAT)(1:16),'(I16)') LMENUM
  1142. ENDIF
  1143. C Verifications pour une loi 'NON_LINEAIRE' 'UTILISATEUR'
  1144. IF ( LMENLX ) THEN
  1145. C Il manque les composantes materielles sous 'C_MATERIAU'
  1146. IF (LUCMAT.EQ.0) THEN
  1147. CALL ERREUR(641)
  1148. RETURN
  1149. ENDIF
  1150. C La liste des composantes materielles saisie sous
  1151. C 'C_MATERIAU' ne doit pas etre vide
  1152. MLMOTS=LUCMAT
  1153. SEGACT,MLMOTS
  1154. NBCOMP = MOTS(/2)
  1155. IF (NBCOMP.EQ.0) THEN
  1156. CALL ERREUR(964)
  1157. RETURN
  1158. ENDIF
  1159. ENDIF
  1160. C Dans le cas d'une libraire externe, quelques verifications puis
  1161. C recherche du pointeur de la fonction externe
  1162. IF (LMEPTR.GT.0) THEN
  1163. C Si le nom de la fonction n'a pas ete fourni avec le mot-cle 'FCT_LOI',
  1164. C on le construit a partir de 'NOM_LOI' ou 'NUME_LOI'.
  1165. IF (LMELGT.EQ.0) THEN
  1166. LMEFCT = ' '
  1167. IF (LMENUM.EQ.0) THEN
  1168. IRET = LONG(LMENOM)
  1169. LMEFCT(1:IRET) = LMENOM(1:IRET)
  1170. LMELGT = IRET
  1171. ELSE
  1172. IRET = 0
  1173. DO i = 1, 16
  1174. IRET = IRET + 1
  1175. IF (LESPRO(NMAT)(i:i).NE.' ') GOTO 220
  1176. ENDDO
  1177. 220 continue
  1178. LMEFCT = 'umat_'//LESPRO(NMAT)(IRET:16)
  1179. LMELGT = 22-IRET
  1180. ENDIF
  1181. ENDIF
  1182. ip = -1
  1183. CALL LEXTOP(LMELIB,LMEFCT,ip,LMELOI,LMEPTR)
  1184. *** IF (IERR.NE.0) RETURN
  1185. *si pas d'erreur LMELOI > 0 et LMEPTR >0 pointe sur une fonction
  1186. *dbg IF (LMELOI.LE.0) CALL ERREUR(5)
  1187. *dbg IF (LMEPTR.LE.0) CALL ERREUR(5)
  1188. LMELGB = LONG(LMELIB)
  1189. LMELGT = LONG(LMEFCT)
  1190. *dbg write(ioimp,*) 'LMELOI =',LMELOI,LMEPTR,LMELGB,LMELGT,
  1191. *dbg & LMELIB(1:LMELGB),'=',LMEFCT(1:LMELGT)
  1192. ENDIF
  1193. ELSE
  1194. C si pas lois externes lecture des noms des parametres externes
  1195. CALL LIRMOT(MOEXT(2),1,LEXT,0)
  1196. IF (LEXT.NE.0) THEN
  1197. CALL LIROBJ('LISTMOTS',luparx,1,iret)
  1198. IF (IERR.NE.0) RETURN
  1199. ENDIF
  1200. ENDIF
  1201. C Verifications sur les parametres, si declares
  1202. IF (luparx.GT.0) THEN
  1203. C Si la temperature 'T ' fait partie des parametres de
  1204. C la loi, elle doit etre declaree en tete
  1205. mlmots=luparx
  1206. SEGACT,MLMOTS
  1207. NBPARA=MOTS(/2)
  1208. IF (NBPARA.GT.0) THEN
  1209. DO IP = 1, NBPARA
  1210. IF (MOTS(IP).EQ.'T ') THEN
  1211. IF (IP.GT.1) THEN
  1212. CALL ERREUR(948)
  1213. RETURN
  1214. ENDIF
  1215. GOTO 221
  1216. ENDIF
  1217. ENDDO
  1218. 221 CONTINUE
  1219. ENDIF
  1220. C Pas de parametres redondants
  1221. IF (NBPARA.GT.1) THEN
  1222. DO 230 IP1 = 1, NBPARA-1
  1223. PAR1 = MOTS(IP1)
  1224. DO 231 IP2 = IP1+1, NBPARA
  1225. IF (MOTS(IP2).EQ.PAR1) THEN
  1226. CALL ERREUR(949)
  1227. RETURN
  1228. ENDIF
  1229. 231 CONTINUE
  1230. 230 CONTINUE
  1231. ENDIF
  1232. ENDIF
  1233. ENDIF
  1234. C fin lecture mecanique aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
  1235.  
  1236. C Formulation 'DIFFUSION' : oooooooooooooooooooooooooooooooooooooooooooo
  1237. C - Detection d'une loi non lineaire externe (mot-cle 'UTILISATEUR')
  1238. C - Detection de la quantite de l'effet Soret (mot-cle 'SORET')
  1239. C - Lecture de l'inconnue "diffusant" (mot-cle 'INCO')
  1240. C 3 CONTINUE
  1241. LDIEXT = .FALSE.
  1242. LDISOR = .FALSE.
  1243. LDINUM = 0
  1244. LDINOM = ' '
  1245. LDILIB = ' '
  1246. LDIFCT = ' '
  1247. LDILGB = 0
  1248. LDILGT = 0
  1249. LDILOI = 0
  1250. LDIPTR = 0
  1251. IF (NFOR.EQ.1 .AND. LESFOR(1).EQ.'DIFFUSION') THEN
  1252. C -- Recherche des informations sur la presence d'une loi externe --
  1253. DO i=1,NMAT
  1254. LDIEXT = LESPRO(i).EQ.'UTILISATEUR'
  1255. LDISOR = LESPRO(i).EQ.'SORET'
  1256. ENDDO
  1257. C - Lecture des informations pour la loi externe
  1258. IF (LDIEXT) THEN
  1259. 310 CONTINUE
  1260. CALL LIRMOT(MOEXT,NBEXT,LEXT,0)
  1261. IF (LEXT.EQ.0) GOTO 311
  1262. C Lecture d'un entier sous 'NUME_LOI'
  1263. IF (LEXT.EQ.1) THEN
  1264. CALL LIRENT(LDINUM,1,IRET)
  1265. IF (IERR.NE.0) RETURN
  1266. IF (LDINUM.LT.1 .OR. LDINUM.GE.1000000) THEN
  1267. INTERR(1) = LDINUM
  1268. CALL ERREUR(36)
  1269. CALL ERREUR(947)
  1270. RETURN
  1271. ENDIF
  1272. C Lecture du nom de la loi sous 'NOM_LOI'
  1273. ELSE IF (LEXT.EQ.2) THEN
  1274. MOTEMP = ' '
  1275. CALL LIRCHA(MOTEMP,1,IRET)
  1276. IF (IERR.NE.0) RETURN
  1277. IRET = LONG(MOTEMP(1:IRET))
  1278. IF (IRET.GT.16) THEN
  1279. INTERR(1) = IRET
  1280. MOTERR = MOTEMP(1:IRET)
  1281. CALL ERREUR(-2)
  1282. CALL ERREUR(21)
  1283. RETURN
  1284. ELSE IF (IRET.LE.0) THEN
  1285. INTERR(1) = IRET
  1286. MOTERR = 'NOM_LOI'
  1287. CALL ERREUR(-2)
  1288. CALL ERREUR(6)
  1289. RETURN
  1290. ENDIF
  1291. LDINOM = ' '
  1292. LDINOM(1:IRET) = MOTEMP(1:IRET)
  1293. C Lecture d'un objet LISTMOTS sous 'PARA_LOI'
  1294. ELSE IF (LEXT.EQ.3) THEN
  1295. CALL LIROBJ('LISTMOTS',luparx,1,IRET)
  1296. IF (IERR.NE.0) RETURN
  1297. C Lecture d'un objet LISTMOTS sous 'C_MATERIAU'
  1298. ELSE IF (LEXT.EQ.4) THEN
  1299. CALL LIROBJ('LISTMOTS',lucmat,1,IRET)
  1300. IF (IERR.NE.0) RETURN
  1301. C Lecture d'un objet LISTMOTS sous 'C_VARINTER'
  1302. ELSE IF (LEXT.EQ.5) THEN
  1303. CALL LIROBJ('LISTMOTS',lucvar,1,IRET)
  1304. IF (IERR.NE.0) RETURN
  1305. C Lecture du nom (du fichier) de la bibliotheque de la loi
  1306. ELSE IF (LEXT.EQ.6) THEN
  1307. MOTEMP = ' '
  1308. CALL LIRCHA(MOTEMP,1,IRET)
  1309. IF (IERR.NE.0) RETURN
  1310. IF (IRET.GT.LOCHAI) THEN
  1311. CALL ERREUR(1110)
  1312. RETURN
  1313. ENDIF
  1314. IRET = LONG(MOTEMP(1:IRET))
  1315. IF (IRET.LE.0) THEN
  1316. INTERR(1) = IRET
  1317. MOTERR = MOTEMP
  1318. CALL ERREUR(-2)
  1319. CALL ERREUR(6)
  1320. RETURN
  1321. ENDIF
  1322. LDILIB = ' '
  1323. LDILIB(1:IRET) = MOTEMP(1:IRET)
  1324. LDILGB = IRET
  1325. LDIPTR = IRET
  1326. C Lecture du nom de la fonction de la loi
  1327. ELSE IF (LEXT.EQ.7) THEN
  1328. MOTEMP = ' '
  1329. CALL LIRCHA(MOTEMP,1,IRET)
  1330. IF (IERR.NE.0) RETURN
  1331. IF (IRET.GT.LOCHAI) THEN
  1332. CALL ERREUR(1110)
  1333. RETURN
  1334. ENDIF
  1335. IRET = LONG(MOTEMP(1:IRET))
  1336. IF (IRET.LE.0) THEN
  1337. INTERR(1) = IRET
  1338. MOTERR = MOTEMP
  1339. CALL ERREUR(-2)
  1340. CALL ERREUR(6)
  1341. RETURN
  1342. ENDIF
  1343. LDIFCT(1:IRET) = MOTEMP(1:IRET)
  1344. LDILGT = IRET
  1345. ENDIF
  1346. GOTO 310
  1347. 311 CONTINUE
  1348. C Verifications des informations obligatoires de la loi externe
  1349. C Il manque 'NUME_LOI' ou 'NOM_LOI' (toujours obligatoire)
  1350. IF (LDINUM.EQ.0 .AND. LDINOM.EQ.' ') THEN
  1351. if (LDILGT.eq.0) then
  1352. CALL ERREUR(641)
  1353. RETURN
  1354. endif
  1355. ENDIF
  1356. IF (LDINUM.NE.0 .AND. LDINOM.NE.' ') THEN
  1357. MOTERR(1:16) = 'NUME_LOINOM_LOI '
  1358. CALL ERREUR(135)
  1359. RETURN
  1360. ENDIF
  1361. C Il manque la liste 'C_MATERIAU'
  1362. IF (lucmat.EQ.0) THEN
  1363. CALL ERREUR(641)
  1364. RETURN
  1365. ENDIF
  1366. C Les liste des composantes ne doivent pas etre vides.
  1367. DO i = 1, 3
  1368. IF (i.EQ.1) MLMOTS = luparx
  1369. IF (i.EQ.2) MLMOTS = lucmat
  1370. IF (i.EQ.3) MLMOTS = lucvar
  1371. IF (MLMOTS.NE.0) THEN
  1372. SEGACT,MLMOTS
  1373. NBCOMP = MOTS(/2)
  1374. IF (NBCOMP.EQ.0) THEN
  1375. CALL ERREUR(964)
  1376. RETURN
  1377. ENDIF
  1378. ENDIF
  1379. ENDDO
  1380. C Dans le cas d'un modele UTILISATEUR, on rajoute en fin de
  1381. C liste des proprietes du modele, le numero attribue par l'utilisateur.
  1382. NMAT = NMAT + 1
  1383. LESPRO(NMAT) = ' '
  1384. IF (LDINUM.EQ.0) THEN
  1385. LESPRO(NMAT) = LDINOM
  1386. if (LDILGT.gt.0.and.LDINOM.eq.' ') then
  1387. c* On espere mettre un numero "unique" dans le nom !
  1388. segini,limode
  1389. write(LESPRO(NMAT)(1:16),'(I16)') limode
  1390. segsup,limode
  1391. endif
  1392. ELSE
  1393. WRITE(LESPRO(NMAT)(1:16),'(I16)') LDINUM
  1394. ENDIF
  1395. C Dans le cas d'une libraire externe, quelques verifications puis
  1396. C recherche du pointeur de la fonction externe
  1397. IF (LDIPTR.GT.0) THEN
  1398. C Si le nom de la fonction n'a pas ete fourni avec le mot-cle 'FCT_LOI',
  1399. C on le construit a partir de 'NOM_LOI' ou 'NUME_LOI'.
  1400. IF (LDILGT.EQ.0) THEN
  1401. LDIFCT = ' '
  1402. IF (LDINUM.EQ.0) THEN
  1403. IRET = LONG(LDINOM)
  1404. LDIFCT(1:IRET) = LDINOM(1:IRET)
  1405. LDILGT = IRET
  1406. ELSE
  1407. IRET = 0
  1408. DO i = 1, 16
  1409. IRET = IRET + 1
  1410. IF (LESPRO(NMAT)(i:i).NE.' ') GOTO 320
  1411. ENDDO
  1412. 320 CONTINUE
  1413. LDIFCT = 'umat_'//LESPRO(NMAT)(IRET:16)
  1414. LDILGT = 22-IRET
  1415. ENDIF
  1416. ENDIF
  1417. ip = -1
  1418. CALL LEXTOP(LDILIB,LDIFCT,ip,LDILOI,LDIPTR)
  1419. IF (IERR.NE.0) RETURN
  1420. *si pas d'erreur LDILOI > 0 et LDIPTR >0 pointe sur une fonction
  1421. *dbg IF (LDILOI.LE.0) CALL ERREUR(5)
  1422. *dbg IF (LDIPTR.LE.0) CALL ERREUR(5)
  1423. LDILGB = LONG(LDILIB)
  1424. LDILGT = LONG(LDIFCT)
  1425. ENDIF
  1426. ENDIF
  1427. C - Lecture des informations pour la loi Soret :
  1428. C - quantite dont le gradient est l'origine de l'effet ('T' par defaut)
  1429. IF (LDISOR) THEN
  1430. mlmots = 0
  1431. CHARIN = 'T '
  1432. C Lecture du mot-cle 'PARA_LOI' et donnees associees
  1433. CALL LIRMOT(MOEXT(2),1,LEXT,0)
  1434. IF (IERR.NE.0) RETURN
  1435. IF (LEXT.EQ.1) THEN
  1436. CALL LIROBJ('LISTMOTS',mlmots,0,IRET)
  1437. IF (IERR.NE.0) RETURN
  1438. IF (IRET.EQ.0) THEN
  1439. CALL LIRCHA(CHARIN,1,IRETI)
  1440. IF (IERR.NE.0) RETURN
  1441. IRETI=LONG(CHARIN)
  1442. IF (IRETI.EQ.0) CALL ERREUR(643)
  1443. ELSE
  1444. SEGACT,mlmots
  1445. NBCOMP = mots(/2)
  1446. IF (NBCOMP.EQ.0) THEN
  1447. CALL ERREUR(964)
  1448. ELSE
  1449. CHARIN = MOTS(1)
  1450. IRETI = LONG(CHARIN)
  1451. IF (IRETI.EQ.0) CALL ERREUR(643)
  1452. ENDIF
  1453. ENDIF
  1454. IF (IERR.NE.0) RETURN
  1455. IRETMA = 2
  1456. C*8 IRETMA = 6
  1457. IF (IRETI.GT.IRETMA) THEN
  1458. INTERR(1) = IRETMA
  1459. MOTERR(1:8) = CHARIN(1:IRETI)
  1460. CALL ERREUR(-353)
  1461. ENDIF
  1462. IRETI = MIN(IRETI,IRETMA)
  1463. CHARIN(IRETI+1:8) = ' '
  1464. ENDIF
  1465. JGM = 1
  1466. JGN = LOCOMP
  1467. SEGINI,mlmots
  1468. mots(1) = CHARIN
  1469. luparx = mlmots
  1470. ENDIF
  1471.  
  1472. C -- Pour la formulation DIFFUSION : lecture quantite (ddl) diffusant --
  1473. C -- On cherche a lire le mot 'INCO' suivi du nom de l'INCOnnue donne --
  1474. C -- soit par un LISTMOTS, soit par un MOT puis eventuellement du nom --
  1475. C -- de la grandeur DUALe donne par un objet de meme type que pour le --
  1476. C -- nom de l'inconnue. --
  1477. CALL LIRMOT(MOINCO,NBDIF,LEXT,0)
  1478. IF (LEXT.EQ.0) THEN
  1479. C*8 MDIINC='CONC '
  1480. C*8 MDIDUA='QCONC '
  1481. MDIINC='CO '
  1482. MDIDUA='QCO '
  1483. ELSE
  1484. MDIINC=' '
  1485. MDIDUA='Q '
  1486. CHARIN=' '
  1487. CHARRE=' '
  1488. CALL LIROBJ('LISTMOTS',mlmots,0,IRET)
  1489. IF (IERR.NE.0) RETURN
  1490. IF (mlmots.NE.0) THEN
  1491. SEGACT,mlmots
  1492. NBCOMP = MOTS(/2)
  1493. IF (NBCOMP.EQ.0) THEN
  1494. CALL ERREUR(643)
  1495. ELSE
  1496. CHARIN=MOTS(1)
  1497. IRETI=LONG(CHARIN)
  1498. IF (IRETI.EQ.0) CALL ERREUR(643)
  1499. ENDIF
  1500. IF (IERR.NE.0) RETURN
  1501. CALL LIROBJ('LISTMOTS',mlmots,0,IRETE)
  1502. IF (IERR.NE.0) RETURN
  1503. IF (mlmots.NE.0) THEN
  1504. SEGACT,mlmots
  1505. NBCOMP = MOTS(/2)
  1506. IF (NBCOMP.EQ.0) THEN
  1507. CALL ERREUR(643)
  1508. ELSE
  1509. CHARRE=MOTS(1)
  1510. IRETE=LONG(CHARRE)
  1511. IF (IRETE.EQ.0) CALL ERREUR(643)
  1512. ENDIF
  1513. IF (IERR.NE.0) RETURN
  1514. ENDIF
  1515.  
  1516. ELSE
  1517. CALL LIRCHA(CHARIN,1,IRETI)
  1518. IF (IERR.NE.0) RETURN
  1519. IRETI = LONG(CHARIN(1:IRETI))
  1520. IF (IRETI.EQ.0) THEN
  1521. CALL ERREUR(643)
  1522. RETURN
  1523. ENDIF
  1524. CALL LIRCHA(CHARRE,0,IRETE)
  1525. IF (IERR.NE.0) RETURN
  1526. IF (IRETE.GT.0) THEN
  1527. IRETE = LONG(CHARRE(1:IRETE))
  1528. IF (IRETE.EQ.0) THEN
  1529. CALL ERREUR(643)
  1530. RETURN
  1531. ENDIF
  1532. ENDIF
  1533. ENDIF
  1534.  
  1535. IRETMA = 2
  1536. C*8 IRETMA = 6
  1537. IF (IRETI.GT.IRETMA) THEN
  1538. INTERR(1) = IRETMA
  1539. MOTERR(1:8) = CHARIN(1:IRETI)
  1540. CALL ERREUR(-353)
  1541. ENDIF
  1542. IRETI = MIN(IRETI,IRETMA)
  1543. MDIINC(1:IRETI)=CHARIN(1:IRETI)
  1544. IF (IRETE.EQ.0) THEN
  1545. MDIDUA(2:1+IRETI)=MDIINC(1:IRETI)
  1546.  
  1547. ELSE
  1548. IRETMA = IRETMA + 2
  1549. IF (IRETE.GT.IRETMA) THEN
  1550. INTERR(1) = IRETMA
  1551. MOTERR(1:8) = CHARRE(1:IRETE)
  1552. CALL ERREUR(-353)
  1553. ENDIF
  1554. IRETE=MIN(IRETE,IRETMA)
  1555. MDIDUA(1:IRETE)=CHARRE(1:IRETE)
  1556. ENDIF
  1557. ENDIF
  1558.  
  1559. c* Verification des noms de primale et duale lues
  1560. CALL VERMDI(MDIINC,MDIDUA)
  1561. IF (IERR.NE.0) RETURN
  1562.  
  1563. C On les place dans un LISTMOTS pour TYMODE et IVAMODE
  1564. JGN = LOCOMP
  1565. JGM = 2
  1566. SEGINI,MLMOT1
  1567. iplrdi=MLMOT1
  1568. MLMOT1.MOTS(1) = MDIINC
  1569. MLMOT1.MOTS(2) = MDIDUA
  1570. ENDIF
  1571. C Fin Formulation 'DIFFUSION' oooooooooooooooooooooooooooooooooooooooooo
  1572.  
  1573. C Lecture eventuelle du NOM de CONSTITUANT, du nombre de POINTs
  1574. C d'INTEGRATION, du point support pour les modes en DEFOrmations
  1575. C PLANEs GENEralisees, du nom de la phase, de la formulation non_locale
  1576. C fin des lecture en 22
  1577. 674 CONTINUE
  1578. kcons = 0
  1579. NGINT = 0
  1580. NGRIG = 0
  1581. NGMAS = 0
  1582. NGCON = 0
  1583. IPTGEN = 0
  1584. IPMOD1 = 0
  1585. klcon = 0
  1586. plicon = 0
  1587. ILIE = 0
  1588. INLOC = 0
  1589. INLVIA = 0
  1590. LULVIA = 0
  1591. kbnlin = 0
  1592.  
  1593. 675 CONTINUE
  1594. CALL LIRMOT(MOCON,NBCON,LECON,0)
  1595. IF (LECON.EQ.0) GOTO 22
  1596. IF (LECON.EQ.1) THEN
  1597. CALL LIRCHA(CONM,1,kcons)
  1598. IF (IERR.NE.0) RETURN
  1599. ELSE IF (LECON.EQ.2) THEN
  1600. i1foi = 1
  1601. 677 continue
  1602. legaus=0
  1603. CALL LIRMOT(MGAUSS,4,legaus,0)
  1604. if (ierr.ne.0) return
  1605. if (i1foi.ne.1.and.legaus.eq.0) goto 675
  1606. CALL LIRENT(itt,1,iret)
  1607. if (ierr.ne.0) return
  1608. if (itt.lt.1) then
  1609. interr(1) = itt
  1610. call erreur(36)
  1611. return
  1612. endif
  1613. if (legaus.eq.0 .or. legaus.eq.1) then
  1614. c itt doit etre impair (> 0)
  1615. IF (MOD(itt,2).EQ.0) THEN
  1616. call erreur(607)
  1617. return
  1618. ENDIF
  1619. NGINT = itt
  1620. endif
  1621. if (legaus.eq.2) NGRIG = itt
  1622. if (legaus.eq.3) NGMAS = itt
  1623. if (legaus.eq.4) NGCON = itt
  1624. if (i1foi.eq.1.and.legaus.eq.0) goto 675
  1625. i1foi = 0
  1626. c INTE itt <=> INTE EPAI itt ; autres mots a ecrire
  1627. c Syntaxe de modeli non decrite :
  1628. c Si plusieurs mots de MGAUSS
  1629. c INTE MOT1 itt1 MOT2 itt2 ... ; (couples MOTi iiti obligatoires)
  1630. goto 677
  1631. ELSE IF (LECON.EQ.3) THEN
  1632. CALL LIROBJ('POINT',IPTGEN,1,IRET)
  1633. IF (IERR.NE.0) RETURN
  1634. C On transforme le point en maillage de POI1 (avec un seul element)
  1635. CALL CRELEM(IPTGEN)
  1636. C On verifie s'il n'a pas deja ete preconditionne.
  1637. CALL CRECH1(IPTGEN,1)
  1638. ELSE IF (LECON.EQ.4) THEN
  1639. CALL LIRCHA(PHAM,1,IRET)
  1640. IF (IERR.NE.0) RETURN
  1641. ELSE IF (LECON.EQ.5) THEN
  1642. NMAT = NMAT + 1
  1643. LESPRO(NMAT) = 'STATIONNAIRE'
  1644. if (iptabs.gt.0) then
  1645. else
  1646. CALL LIROBJ('MMODEL',IPMOD1,1,IRET)
  1647. IF (IERR.NE.0) RETURN
  1648. endif
  1649. C LCOI et LCOS : options non documentees pour le modele LIAISON !
  1650. C Lecture obligatoire du modele associe (sinon options sans interet)
  1651. ELSE IF (LECON.EQ.6.OR.LECON.EQ.7) THEN
  1652. IF (LESFOR(1).NE.'LIAISON') THEN
  1653. CALL ERREUR(251)
  1654. RETURN
  1655. ENDIF
  1656. CALL LIROBJ('MMODEL ',ipmod2,1,iret)
  1657. IF (IERR.NE.0) RETURN
  1658. CALL ACTOBJ('MMODEL ',ipmod2,1)
  1659. IF (IERR.NE.0) RETURN
  1660. mmode2 = ipmod2
  1661. n2 = mmode2.kmodel(/1)
  1662. if (n2.ne.1) then
  1663. write(ioimp,*) 'Liaison conditionnelle mal specifiee (1)'
  1664. call erreur(5)
  1665. return
  1666. endif
  1667. imode2 = mmode2.kmodel(1)
  1668. if (imode2.formod(1).ne.'LIAISON') THEN
  1669. write(ioimp,*) 'Liaison conditionnelle mal specifiee (2)'
  1670. call erreur(5)
  1671. return
  1672. endif
  1673. if (klcon.eq.0) then
  1674. nlcon = 10
  1675. segini plicon
  1676. endif
  1677. klcon = klcon + 1
  1678. if (klcon.gt.nlcon) then
  1679. nlcon = nlcon + 10
  1680. segadj plicon
  1681. endif
  1682. mlicon(klcon) = ipmod2
  1683. tlicon(klcon) = lecon
  1684. C (fdp) option 'LIE' pour les JOI1
  1685. ELSE IF (LECON.EQ.9) THEN
  1686. ILIE = 1
  1687. ELSE IF (LECON.EQ.10) THEN
  1688. IF (LESFOR(1).NE.'MECANIQUE'.AND.LESFOR(1).NE.'POREUX') THEN
  1689. CALL ERREUR(251)
  1690. RETURN
  1691. ENDIF
  1692. CALL MODNLO(MNLOCA,NLODIM)
  1693. IF (NLODIM.GT.NLOMAX) THEN
  1694. CALL ERREUR(6)
  1695. RETURN
  1696. ENDIF
  1697. CALL LIRMOT(MNLOCA,NLODIM,INLOC,1)
  1698. IF (IERR.NE.0) RETURN
  1699. CALL LIRMOT(MNLVAR,1,INLVIA,1)
  1700. IF (IERR.NE.0) RETURN
  1701. CALL LIROBJ('LISTMOTS',LULVIA,1,IRET)
  1702. IF (IERR.NE.0) RETURN
  1703. ELSE IF (LECON.GE.11.and.LECON.LE.13) THEN
  1704. if (kbnlin.eq.0) then
  1705. jgn = 4
  1706. JGM = 3
  1707. segini opnlin
  1708. endif
  1709. kbnlin = kbnlin + 1
  1710. opnlin.mots(kbnlin) = mocon(lecon)
  1711. ENDIF
  1712. GOTO 675
  1713.  
  1714. 22 CONTINUE
  1715. if (iptabm.gt.0.and.iptabs.eq.0.and.ipmod1.gt.0) goto 91
  1716.  
  1717. C========== ACTIVATION DU MAILLAGE POUR CONSTRUIRE MMODEL ==============
  1718. C Recuperation des caracteristiques du MAILLAGE dans MELEME
  1719. IF (IPGEOM .EQ. 0) THEN
  1720. MOTERR='MAILLAGE'
  1721. CALL ERREUR(471)
  1722. RETURN
  1723. ENDIF
  1724.  
  1725. CALL ACTOBJ('MAILLAGE',IPGEOM,1)
  1726. MELEME = IPGEOM
  1727. NSOU = MELEME.LISOUS(/1)
  1728. NSOU1 = MAX(1,NSOU)
  1729.  
  1730. C=DEB==== FORMULATION HHO ==== Premieres verifications =================
  1731. IPLHHO = 0
  1732. IF (loHHO) THEN
  1733. C= Pour l'instant, HHO en formulation MECANIQUE !
  1734. IF ( (NFOR.EQ.1 .AND. LESFOR(1).NE.'MECANIQUE') .OR.
  1735. & (NFOR.NE.1) ) THEN
  1736. write(ioimp,*) 'Formulation HHO --> MECANIQUE uniquement'
  1737. CALL ERREUR(251)
  1738. RETURN
  1739. END IF
  1740. IF ( .NOT. ( IFOMOD.EQ.-1 .AND. IFOUR.NE.-3) ) THEN
  1741. write(ioimp,*) 'Formulation HHO --> 2D PLAN DEFO/CONT'
  1742. c-dbg IF ( .NOT. ( (IFOMOD.EQ.2) .OR.
  1743. c-dbg & (IFOMOD.EQ.-1 .AND. IFOUR.NE.-3) ) ) THEN
  1744. c-dbg write(ioimp,*) 'Formulation HHO --> 2D PLAN DEFO/CONT or 3D'
  1745. CALL ERREUR(251)
  1746. RETURN
  1747. END IF
  1748. C=
  1749. CALL HHOPRE(CHAHHO,IPGEOM,IPLHHO,iret)
  1750. IF (iret.NE.0) THEN
  1751. CALL ERREUR(iret)
  1752. RETURN
  1753. ENDIF
  1754. END IF
  1755. C=FIN==== FORMULATION HHO ==============================================
  1756.  
  1757. C= PARTIE 2 ============================================================
  1758. C Initialisations et remplissage du segment MMODEL = IPMODE
  1759. C=======================================================================
  1760. c-dbg write(ioimp,*)
  1761. c-dbg write(ioimp,*) ' INITIALISATION MMODEL A ',NSOU1,' ZONE(S)'
  1762.  
  1763. N1 = NSOU1
  1764. * mmode2 sert a ranger la deuxieme partie du contact symetrique
  1765. SEGINI,MMODEL,mmode2
  1766. IPMODE = MMODEL
  1767.  
  1768. C Nom du constituant par defaut si non donne en entree
  1769. IF (kcons.EQ.0) WRITE(CONM,FMT='(I16)') IPMODE
  1770.  
  1771. C Determination de MN3 selon la formulation :
  1772. C Par defaut MN3 est fixe a 1.
  1773. MN3 = 1
  1774. IF (LESFOR(1).EQ.'NAVIER_STOKES ') THEN
  1775. MN3=2
  1776. C* NAVIER_STOKES + NLIN idem que MECANIQUE
  1777. IF (LESPRO(1).EQ.'NLIN ') MN3=12
  1778. ENDIF
  1779. IF (LESFOR(1).EQ.'EULER ') MN3=2
  1780. IF (LESFOR(1).EQ.'DARCY ') MN3=2
  1781. IF (LESFOR(1).EQ.'CHANGEMENT_PHASE') MN3=12
  1782. IF (LESFOR(1).EQ.'THERMOHYDRIQUE ') MN3=12
  1783. IF (LESFOR(1).EQ.'METALLURGIE ') MN3=2
  1784. IF (LESFOR(1).EQ.'FISSURE ') MN3=2
  1785. IF (LESFOR(1).EQ.'MECANIQUE ' .OR.
  1786. & LESFOR(1).EQ.'POREUX ' .OR.
  1787. & LESFOR(1).EQ.'CHARGEMENT ' .OR.
  1788. & nfor.EQ.2 ) THEN
  1789. IF (INLOC.NE.0) THEN
  1790. MN3=14
  1791. ELSE
  1792. MN3=12
  1793. ENDIF
  1794. ENDIF
  1795. IF (LESFOR(1).EQ.'LIQUIDE ') MN3=12
  1796. IF (LESFOR(1).EQ.'LIAISON ') MN3=12
  1797. IF (LESFOR(1).EQ.'ELECTROSTATIQUE ') MN3=12
  1798. IF (LESFOR(1).EQ.'DIFFUSION ') MN3=12
  1799. IF (LESFOR(1).EQ.'MAGNETODYNAMIQUE') MN3=12
  1800. IF (LESFOR(1).EQ.'MELANGE ') MN3= 7
  1801. c-dbg write(ioimp,*) 'MN3 =',MN3,LESFOR(1),nfor
  1802.  
  1803. C- Determination de NOBMOD selon la formulation :
  1804. NOBMOD = 0
  1805. NOBMEC = 0
  1806. NOBDIF = 0
  1807. IF (LESFOR(1).EQ.'CONTACT ') THEN
  1808. c* IF (IFROCA.NE.0) NOBMOD = 2
  1809. c* IF (ifrtt .ne.0) NOBMOD = 1
  1810. NOBMOD = 3
  1811.  
  1812. ELSEIF (LESFOR(1).EQ.'CONTRAINTE') THEN
  1813. if (lactr.eq.1 .and. idim.ne.3) nobmod=3
  1814. if (lactr.eq.1 .and. idim.eq.3) nobmod=4
  1815. if (lactr.eq.2) nobmod=3
  1816.  
  1817. ELSEIF (LESFOR(1).EQ.'DIFFUSION ') THEN
  1818. NOBDIF = NOBMOD
  1819. NOBMOD = NOBMOD + 1
  1820. IF (LDILOI.GT.0) NOBMOD = NOBMOD + 4
  1821.  
  1822. C* Modeles UTILISATEUR en MECANIQUE :
  1823. ELSEIF (LMEEXT) THEN
  1824. NOBMEC = NOBMOD
  1825. IF (LMELOI.GT.0) NOBMOD = NOBMOD + 4
  1826. IF (LMEVIX ) NOBMOD = NOBMOD + 2
  1827.  
  1828. ELSEIF (LESFOR(1).eq.'METALLURGIE ') THEN
  1829. C On rangera les pointeurs sur les ListMots Phases,
  1830. C Reactifs, Produits et Types de Reactions dans IVAMOD
  1831. NOBMOD = 4
  1832.  
  1833. ELSEIF (LESFOR(1).eq.'CHANGEMENT_PHASE') THEN
  1834.  
  1835. IF (LESPRO(1)(1:10).EQ.'PARFAIT ') THEN
  1836. C On rangera : -le LISTMOTS des inconnues primales et duales dedans
  1837. C -le MAILLAGE des MULTIPLICATEURS 'LX'
  1838. NOBMOD = 2
  1839. ELSEIF (LESPRO(1)(1:10).EQ.'SOLUBILITE') THEN
  1840. C On rangera : -le LISTMOTS des inconnues primales et duales dedans
  1841. C -le 1er MAILLAGE des MULTIPLICATEURS 'LX'
  1842. C -le 2eme MAILLAGE des MULTIPLICATEURS 'LX'
  1843. NOBMOD = 3
  1844. ELSE
  1845. CALL ERREUR(5)
  1846. ENDIF
  1847.  
  1848. ELSE IF (lesfor(1).eq.'NAVIER_STOKES ') THEN
  1849. IF (LESPRO(1).EQ.'NLIN ') NOBMOD = 1
  1850.  
  1851. ELSE IF (lesfor(1).eq.'THERMIQUE ') THEN
  1852. IF (IRAYE.eq.1) NOBMOD = 2*icavit+isyme*idim+ifacaf*4
  1853.  
  1854. C LIAISON conditionnelle
  1855. ELSE IF (LESFOR(1).EQ.'LIAISON ') THEN
  1856. c* if (klcon.gt.0) THEN
  1857. noblia = NOBMOD
  1858. NOBMOD = NOBMOD + klcon
  1859. c* endif
  1860. ENDIF
  1861.  
  1862. C=DEB==== FORMULATION HHO ==== Donnees supplementaires =================
  1863. IF (loHHO) THEN
  1864. nobHHO = NOBMOD
  1865. NOBMOD = NOBMOD + MTYHHO
  1866. END IF
  1867. C=FIN==== FORMULATION HHO ==============================================
  1868.  
  1869. IF (jlmot1.gt.0) THEN
  1870. if (nobmod.ne.0) then
  1871. write(ioimp,*) 'NOBMOD !=0 et jlmot1,jlmmot2 > 0'
  1872. call erreur(5)
  1873. return
  1874. endif
  1875. NOBMOD = 2
  1876. ENDIF
  1877.  
  1878. NOBMOD0 = NOBMOD
  1879. NOBMEC0 = NOBMEC
  1880. NOBDIF0 = NOBDIF
  1881. nobHHO0 = nobHHO
  1882. noblia0 = noblia
  1883.  
  1884. C***********************************************************************
  1885. C Boucle (10) sur les maillages elementaires de IPGEOM
  1886. C***********************************************************************
  1887. MELEME = IPGEOM
  1888. IPT1 = MELEME
  1889.  
  1890. DO 10 IM = 1, NSOU1
  1891.  
  1892. IF (NSOU.NE.0) IPT1 = MELEME.LISOUS(IM)
  1893. ITYP1 = IPT1.ITYPEL
  1894. NBNN = IPT1.NUM(/1)
  1895. NBEL = IPT1.NUM(/2)
  1896.  
  1897. C +--------------------------------------------------------------------+
  1898. C | Creation du modele elementaire IMODEL |
  1899. C +--------------------------------------------------------------------+
  1900. NOBMOD = NOBMOD0
  1901. NOBMEC = NOBMEC0
  1902. NOBDIF = NOBDIF0
  1903. nobHHO = nobHHO0
  1904. noblia = noblia0
  1905.  
  1906. SEGINI,IMODEL
  1907. mmodel.KMODEL(IM) = IMODEL
  1908.  
  1909. C +--------------------------------------------------------------------+
  1910. C | Remplissage du IMODEL |
  1911. C +--------------------------------------------------------------------+
  1912. imodel.IMAMOD = IPT1
  1913.  
  1914. imodel.CONMOD(1:16) = CONM
  1915. imodel.conmod(17:24) = PHAM
  1916.  
  1917. DO i = 1, NFOR
  1918. imodel.FORMOD(i) = LESFOR(i)
  1919. ENDDO
  1920. IF (NMAT.NE.0) THEN
  1921. DO i = 1, NMAT
  1922. imodel.MATMOD(i) = LESPRO(i)
  1923. ENDDO
  1924. ENDIF
  1925.  
  1926. C Informations liees au MATERIAU/COMPORTEMENT
  1927. CMATE = ' '
  1928. IMATE = 0
  1929. INATU = 0
  1930. CALL NOMATE(FORMOD,NFOR,MATMOD,NMAT,CMATE,IMATE,INATU)
  1931. c-dbg write(6,*)'NOMATE : ',cmate,imate,inatu
  1932. c-dbg write(6,*)' MATMOD =',(matmod(i),i=1,nmat)
  1933. IF (IERR.NE.0) then
  1934. write(ioimp,*) ' Probleme apres NOMATE'
  1935. CALL ERREUR(251)
  1936. GOTO 990
  1937. ENDIF
  1938. C* Petit cas particulier en cas de modele VISCO_EXTERNE :
  1939. C* On recupere IVIEX stocke dans INATU (cf. NOMATE)
  1940. IF (INATU .LE. -2) THEN
  1941. IF (.NOT. LMEVIX) THEN
  1942. write(ioimp,*)' VISCO_EXTERNE : INATU & LMEVIX incompatibles'
  1943. call erreur(5)
  1944. return
  1945. ENDIF
  1946. IVIEX = -2 - INATU
  1947. INATU = -2
  1948. ENDIF
  1949. imodel.CMATEE = CMATE
  1950. imodel.IMATEE = IMATE
  1951. imodel.INATUU = INATU
  1952.  
  1953. c imodel.ideriv = jderiv
  1954. cbp,2020-12-10 : abandon de MEPSIL (CCOPTIO) et IDERIV (MMODEL)
  1955. imodel.IDERIV = 0
  1956.  
  1957. ipmmel = 0
  1958. IF (LESFOR(1).EQ.'MELANGE ') THEN
  1959. IF (CMATE.EQ.'PARALLEL' .OR. CMATE.EQ.'SERIE') THEN
  1960. ipmmel = LESMOD(1)
  1961. if (ipmmel.le.0) then
  1962. call erreur(21)
  1963. GOTO 990
  1964. endif
  1965. ENDIF
  1966. ENDIF
  1967.  
  1968. C +--------------------------------------------------------------------+
  1969. C | Remplissage des couples TYMODE/IVAMOD |
  1970. C +--------------------------------------------------------------------+
  1971. IF (LESFOR(1).EQ.'CONTACT ') THEN
  1972. IF (IFROCA.EQ.0) THEN
  1973. * lecture du mot-cle
  1974. call lirmot(MCTCT,4,iret,0)
  1975. ictct=iret
  1976. if(iret.eq.0) ictct=1
  1977. ictr=2
  1978. if(ictct.ne.2) ictr=1
  1979. * cas mortar : uniquement disponible en 2D
  1980. if (iret.eq.4) then
  1981. if (idim.ne.2) then
  1982. INTERR(1) = IDIM
  1983. CALL ERREUR(1104)
  1984. GOTO 990
  1985. endif
  1986. ictr=4
  1987. endif
  1988. * lecture du deuxieme maillage
  1989. call lirobj('MAILLAGE',ipgeo2,1,iretou)
  1990. if (ierr.ne.0) return
  1991. ipgeox=ipgeo2
  1992. call mocon1(ipgeox,lecont,ictr)
  1993. if(ierr.ne.0) return
  1994. tymode(1)='MAILLAGE'
  1995. ivamod(1)=ipgeom
  1996. tymode(2)='MAILLAGE'
  1997. ivamod(2)=ipgeo2
  1998. tymode(3)='ENTIER'
  1999. ivamod(3)=ictr
  2000. imamod=ipgeox
  2001. if(ictct.eq.3) then
  2002. segini,imode1
  2003. mmode2.kmodel(im)=imode1
  2004. ipgeox=ipgeom
  2005. call mocon1(ipgeox,lecont,ictr)
  2006. if(ierr.ne.0) return
  2007. imode1.tymode(1)='MAILLAGE'
  2008. imode1.ivamod(1)=ipgeo2
  2009. imode1.tymode(2)='MAILLAGE'
  2010. imode1.ivamod(2)=ipgeom
  2011. imode1.tymode(3)='ENTIER'
  2012. imode1.ivamod(3)=1
  2013. imode1.imamod=ipgeox
  2014. endif
  2015. ENDIF
  2016.  
  2017. IF (IFROCA.EQ.1) THEN
  2018. * deuxieme maillage deja lu
  2019. ipgeo2 = ipgeom
  2020. ictr=0
  2021. call mocon1(ipgeo2,lecont,ictr)
  2022. if(ierr.ne.0) return
  2023. imamod=ipgeo2
  2024. ipt3=ipgeo2
  2025. segact ipt3
  2026. ityp1=ipt3.itypel
  2027. TYMODE(1)='MAILLAGE'
  2028. IVAMOD(1)=IPGEOM
  2029. TYMODE(2)='MAILLAGE'
  2030. IVAMOD(2)=IBETON
  2031. ENDIF
  2032. ** IF (ifrtt.eq.1) then
  2033. ** ivamod(1)=ipgeo2
  2034. ** tymode(1)='MAILLAGE'
  2035. ** if (ipgeo2.eq.0) then
  2036. ** call erreur(641)
  2037. ** return
  2038. ** endif
  2039. ** ENDIF
  2040.  
  2041. ELSEIF (lesfor(1).eq.'CONTRAINTE ') then
  2042. if (lactr.eq.1.or.lactr.eq.2) then
  2043. call mocon2(ipgeom,ipt7)
  2044. endif
  2045. if (lactr.eq.3) call mocon3(ipgeom,ipt7)
  2046. tymode(1)='ENTIER'
  2047. ivamod(1)=lactr
  2048. tymode(2)='MAILLAGE'
  2049. ivamod(2)=ipgeom
  2050. imamod=ipt7
  2051. * cas rotation idim-1 pts
  2052. if (lactr.eq.1) then
  2053. call meslir(0)
  2054. call lirobj('POINT',ip1,1,iok)
  2055. if (idim.eq.3) call lirobj('POINT',ip2,1,iok)
  2056. if (ierr.ne.0) return
  2057. tymode(3)='POINT'
  2058. ivamod(3)=ip1
  2059. if (idim.eq.3) then
  2060. tymode(4)='POINT'
  2061. ivamod(4)=ip2
  2062. endif
  2063. * cas deplacement 1 pt
  2064. elseif (lactr.eq.2) then
  2065. call lirobj('POINT',ip1,1,iok)
  2066. if (ierr.ne.0) return
  2067. tymode(3)='POINT'
  2068. ivamod(3)=ip1
  2069. endif
  2070.  
  2071. ELSEIF (lesfor(1).eq.'NAVIER_STOKES ') THEN
  2072. IF (nobmod.gt.0) THEN
  2073. tymode(1) = 'LISTMOTS'
  2074. ivamod(1) = opnlin
  2075. ENDIF
  2076.  
  2077. ELSEIF (lesfor(1).eq.'METALLURGIE ') then
  2078. C lucvar : les noms des phases
  2079. IVAMOD(1) = lucvar
  2080. TYMODE(1) = 'LISTMOTS'
  2081. C reacti : les noms des reactifs
  2082. IVAMOD(2) = ireact
  2083. TYMODE(2) = 'LISTMOTS'
  2084. C produi : les noms des produits
  2085. IVAMOD(3) = iprodu
  2086. TYMODE(3) = 'LISTMOTS'
  2087. C lucmat : les noms des types de reactions
  2088. IVAMOD(4) = lucmat
  2089. TYMODE(4) = 'LISTMOTS'
  2090.  
  2091. ELSEIF (lesfor(1).eq.'CHANGEMENT_PHASE') then
  2092. C ipridu : les noms des variables primales et duales
  2093. IVAMOD(1) = ipridu
  2094. TYMODE(1) ='LISTMOTS'
  2095. CALL IMPP1(IPT1,ipgeo2,ipgeo3,LESPRO(1))
  2096. C ipgeo2 & ipgeo3 : MAILLAGE support des Multiplicateurs de Lagrange ('MULT')
  2097. IF (LESPRO(1)(1:10).EQ.'PARFAIT ') THEN
  2098. IVAMOD(2) = ipgeo2
  2099. TYMODE(2) ='MAILLAGE'
  2100. ELSEIF (LESPRO(1)(1:10).EQ.'SOLUBILITE') THEN
  2101. IVAMOD(2) = ipgeo2
  2102. TYMODE(2) ='MAILLAGE'
  2103. IVAMOD(3) = ipgeo3
  2104. TYMODE(3) ='MAILLAGE'
  2105. ELSE
  2106. CALL ERREUR(5)
  2107. ENDIF
  2108.  
  2109. ELSEIF (LESFOR(1).EQ.'THERMIQUE')THEN
  2110. if(IRAYE.ne.0) then
  2111. if(icavit.ne.0) then
  2112. tymode(1)='ENTIER'
  2113. ivamod(1)=nbga
  2114. tymode(2)='ENTIER'
  2115. ivamod(2)=nbdang
  2116. if(isyme.eq.1) then
  2117. tymode(3)='POINT'
  2118. tymode(4)='POINT'
  2119. if(idim.eq.3)tymode(5)='POINT'
  2120. ivamod(3)=ipp1
  2121. ivamod(4)=ipp2
  2122. if(idim.eq.3)ivamod(5)=ipp3
  2123. endif
  2124. endif
  2125. if(ifacaf.ne.0) then
  2126. tymode(1)='MAILLAGE'
  2127. tymode(2)='MAILLAGE'
  2128. tymode(3)='MAILLAGE'
  2129. tymode(4)='MMODEL'
  2130. ivamod(1)= ipfac1
  2131. ivamod(2)= ipfac2
  2132. ivamod(3)= ipfac3
  2133. ivamod(4)= imoco
  2134. endif
  2135. endif
  2136.  
  2137. ELSEIF (LESFOR(1).EQ.'DIFFUSION') THEN
  2138. JGN = LOCOMP
  2139. JGM = 2
  2140. SEGINI,MLMOT1
  2141. TYMODE(NOBDIF+1)='LISTMOTS'
  2142. IVAMOD(NOBDIF+1)=iplrdi
  2143. NOBDIF = NOBDIF+1
  2144. IF (LDILOI.GT.0) THEN
  2145. C Indicateur 'LDIEXT' pour retrouver ses petits
  2146. CALL POSCHA('LDIEXT ',I_POS)
  2147. TYMODE(NOBDIF+1)='MOT '
  2148. IVAMOD(NOBDIF+1)= I_POS
  2149.  
  2150. C Pointeur vers la loi (donne par PTRLOI)
  2151. TYMODE(NOBDIF+2)='ENTIER '
  2152. IVAMOD(NOBDIF+2)= LDIPTR
  2153.  
  2154. C LMELIB : Nom de la bibliotheque (sans chemin et extension)
  2155. CALL POSCHA(LDILIB(1:LDILGB),I_POS)
  2156. TYMODE(NOBDIF+3)='MOT '
  2157. IVAMOD(NOBDIF+3)= I_POS
  2158.  
  2159. C LMEFCT : Nom de la fonction (dans la bibliotheque)
  2160. CALL POSCHA(LDIFCT(1:LDILGT),I_POS)
  2161. TYMODE(NOBDIF+4)='MOT '
  2162. IVAMOD(NOBDIF+4)= I_POS
  2163. NOBDIF = NOBDIF + 4
  2164. ENDIF
  2165.  
  2166. ELSEIF (LMEEXT) THEN
  2167. C Modeles utilisateur en MECANIQUE :
  2168. IF (LMELOI.GT.0) THEN
  2169. C Indicateur 'LMEEXT' pour retrouver ses petits
  2170. CALL POSCHA('LMEEXT ',I_POS)
  2171. TYMODE(NOBMEC+1)='MOT '
  2172. IVAMOD(NOBMEC+1)= I_POS
  2173.  
  2174. C Pointeur vers la loi (donne par PTRLOI)
  2175. TYMODE(NOBMEC+2)='ENTIER '
  2176. IVAMOD(NOBMEC+2)= LMEPTR
  2177.  
  2178. C LMELIB : Nom de la bibliotheque (sans chemin et extension)
  2179. CALL POSCHA(LMELIB(1:LMELGB),I_POS)
  2180. TYMODE(NOBMEC+3)='MOT '
  2181. IVAMOD(NOBMEC+3)= I_POS
  2182.  
  2183. C LMEFCT : Nom de la fonction (dans la bibliotheque)
  2184. CALL POSCHA(LMEFCT(1:LMELGT),I_POS)
  2185. TYMODE(NOBMEC+4)='MOT '
  2186. IVAMOD(NOBMEC+4)= I_POS
  2187. NOBMEC = NOBMEC + 4
  2188. ENDIF
  2189.  
  2190. IF (LMEVIX) THEN
  2191. c* IF (INATU .EQ. -2) THEN
  2192. NOBMEC = NOBMEC + 1
  2193. imodel.TYMODE(NOBMEC) = 'IVIEX '
  2194. imodel.IVAMOD(NOBMEC) = IVIEX
  2195. NOBMEC = NOBMEC + 1
  2196. imodel.TYMODE(NOBMEC) = ' '
  2197. imodel.IVAMOD(NOBMEC) = 0
  2198. ENDIF
  2199.  
  2200. ELSE IF (LESFOR(1).EQ.'LIAISON ') THEN
  2201. if (klcon.gt.0) THEN
  2202. do i = 1, klcon
  2203. if (tlicon(i).eq.6) TYMODE(noblia+i) = 'CONDINFE'
  2204. if (tlicon(i).eq.7) TYMODE(noblia+i) = 'CONDSUPE'
  2205. IVAMOD(noblia+i) = mlicon(i)
  2206. enddo
  2207. ENDIF
  2208.  
  2209. ENDIF
  2210. if (jlmot1.gt.0) then
  2211. ivamod(1) = jlmot1
  2212. ivamod(2) = jlmot2
  2213. tymode(1) = 'LISTMOTS'
  2214. tymode(2) = 'LISTMOTS'
  2215. lucvar = jlmot1
  2216. lucmat = jlmot2
  2217. endif
  2218.  
  2219. C=DEB==== FORMULATION HHO ==== Remplissage de donnees ==================
  2220. IF (loHHO) THEN
  2221. modHHO = imodel
  2222. CALL HHOPRM(chaHHO,modHHO,nobHHO,iplHHO,iret)
  2223. IF (iret.NE.0) THEN
  2224. CALL ERREUR(iret)
  2225. GOTO 990
  2226. END IF
  2227. END IF
  2228. C=FIN==== FORMULATION HHO ==============================================
  2229.  
  2230. c* IF (FORMOD(1).EQ.'MELANGE ') THEN
  2231. IF (ipmmel.GT.0) THEN
  2232. mmode1 = ipmmel
  2233. n1mel = mmode1.kmodel(/1)
  2234. NOBMOI = ivamod(/1)
  2235. NOBMOD = NOBMOI + n1mel
  2236. SEGADJ,IMODEL
  2237. kbmod = 0
  2238. DO i = 1, n1mel
  2239. imode1 = mmode1.kmodel(i)
  2240. if (imode1.imamod.eq.imamod) then
  2241. if (kbmod.eq.0) then
  2242. imode2 = imode1
  2243. else
  2244. if (imode1.formod(1).ne.imode2.formod(1).or.
  2245. & imode1.imatee.ne.imode2.imatee) goto 117
  2246. endif
  2247. kbmod = kbmod + 1
  2248. tymode(NOBMOI+kbmod) = 'IMODEL'
  2249. ivamod(NOBMOI+kbmod) = imode1
  2250. endif
  2251. 117 continue
  2252. ENDDO
  2253. if (kbmod.eq.0) then
  2254. call erreur(21)
  2255. return
  2256. endif
  2257. if (kbmod.ne.n1mel) then
  2258. NOBMOD = NOBMOI + kbmod
  2259. SEGADJ,imodel
  2260. endif
  2261. ENDIF
  2262. c* ENDIF
  2263. c-dbg write(ioimp,*) 'Fin remplissage IVAMOD/TYMODE'
  2264.  
  2265. C +--------------------------------------------------------------------+
  2266. C | Determination de la valeur de NEFMOD pour IMODEL |
  2267. C +--------------------------------------------------------------------+
  2268. C Affectation du type d'ELEMENTS FINIS si donnes par utilisateur
  2269.  
  2270. C Cas des SURE (relation de conformite) :
  2271. C NEPAPA = si EF specifique demande -> on utilise ses inconnues
  2272. NEPAPA = 0
  2273. IF (ITYP1.EQ.48) THEN
  2274. imodel.NEFMOD = 259
  2275. IF (ITEF.GT.0) THEN
  2276. DO i=1,ITEF
  2277. CALL PLACE(NOMTP,LNOMTP,MELE,LESTEF(i))
  2278. IF (MELE.NE.0) NEPAPA = MELE
  2279. ENDDO
  2280. ENDIF
  2281. IF (NEPAPA.EQ.0) THEN
  2282. c 2D -> on choisit les inconnues du QUA4 pour toute formulation
  2283. IF (IDIM.EQ.2) THEN
  2284. NEPAPA=8
  2285. c 3D -> on choisit les inconnues du CUB8 pour toute formulation
  2286. ELSEIF (IDIM.EQ.3) THEN
  2287. NEPAPA=14
  2288. ELSE
  2289. CALL ERREUR(610)
  2290. RETURN
  2291. ENDIF
  2292. ENDIF
  2293. MELE = NEPAPA
  2294. GOTO 101
  2295. ENDIF
  2296.  
  2297. C=DEB==== FORMULATION HHO ==== NEFMOD = HHO_NUM_ELEMENT pour tous les elements =====
  2298. IF (loHHO) THEN
  2299. imodel.NEFMOD = HHO_NUM_ELEMENT
  2300. MELE = imodel.NEFMOD
  2301. GOTO 101
  2302. END IF
  2303. C=FIN==== FORMULATION HHO ==============================================
  2304.  
  2305. NEFMOD = 0
  2306. IF (ITEF.NE.0) THEN
  2307. C Cas de la FORMULATION 'NAVIER_STOKES'
  2308. IF (LESFOR(1).EQ.'NAVIER_STOKES') THEN
  2309. IF (LESTEF(1).EQ.'LINE')THEN
  2310. IF (ITYP1.EQ. 3) NEFMOD=129
  2311. IF (ITYP1.EQ. 7) NEFMOD=130
  2312. IF (ITYP1.EQ.11) NEFMOD=131
  2313. IF (ITYP1.EQ.33) NEFMOD=132
  2314. IF (ITYP1.EQ.34) NEFMOD=133
  2315. IF (ITYP1.EQ.35) NEFMOD=134
  2316. IF (ITYP1.EQ.36) NEFMOD=135
  2317. ELSE IF(LESTEF(1).EQ.'MACR')THEN
  2318. IF (ITYP1.EQ. 3) NEFMOD=136
  2319. IF (ITYP1.EQ. 7) NEFMOD=137
  2320. IF (ITYP1.EQ.11) NEFMOD=138
  2321. IF (ITYP1.EQ.33) NEFMOD=139
  2322. IF (ITYP1.EQ.34) NEFMOD=140
  2323. IF (ITYP1.EQ.35) NEFMOD=141
  2324. IF (ITYP1.EQ.36) NEFMOD=142
  2325. C Il nous manque la pyramide
  2326. ELSE IF (LESTEF(1).EQ.'QUAF') THEN
  2327. IF (ITYP1.EQ. 3) NEFMOD=143
  2328. IF (ITYP1.EQ. 7) NEFMOD=144
  2329. IF (ITYP1.EQ.11) NEFMOD=145
  2330. IF (ITYP1.EQ.33) NEFMOD=146
  2331. IF (ITYP1.EQ.34) NEFMOD=147
  2332. IF (ITYP1.EQ.35) NEFMOD=148
  2333. IF (ITYP1.EQ.36) NEFMOD=149
  2334. C Il nous manque la pyramide
  2335. ELSE IF (LESTEF(1).EQ.'LINB') THEN
  2336. IF (ITYP1.EQ. 3) NEFMOD=158
  2337. IF (ITYP1.EQ. 7) NEFMOD=159
  2338. IF (ITYP1.EQ.11) NEFMOD=160
  2339. IF (ITYP1.EQ.33) NEFMOD=161
  2340. IF (ITYP1.EQ.34) NEFMOD=162
  2341. C IF (ITYP1.EQ.35) NEFMOD=163
  2342. C IF (ITYP1.EQ.36) NEFMOD=164
  2343. C Il nous manque la pyramide et le tetrahedre
  2344. ELSE
  2345. DO i=1,ITEF
  2346. CALL PLACE(NOMTP,LNOMTP,MELE,LESTEF(i))
  2347. IF (MELE.EQ.0) GOTO 99
  2348. MEGE=NUMGEO(MELE)
  2349. IF (MEGE.EQ.0) GOTO 99
  2350. IF (MEGE.EQ.ITYP1) GOTO 610
  2351. ENDDO
  2352. GOTO 99
  2353. 610 NEFMOD=MELE
  2354. ENDIF
  2355. C Cas de la FORMULATION 'EULER'
  2356. ELSE IF (LESFOR(1).EQ.'EULER') THEN
  2357. IF (ITYP1.EQ. 2) NEFMOD=ITYP1
  2358. IF (ITYP1.EQ. 4) NEFMOD=ITYP1
  2359. IF (ITYP1.EQ. 8) NEFMOD=ITYP1
  2360. IF (ITYP1.EQ.14) NEFMOD=ITYP1
  2361. IF (ITYP1.EQ.16) NEFMOD=ITYP1
  2362. IF (ITYP1.EQ.23) NEFMOD=ITYP1
  2363. IF (ITYP1.EQ.25) NEFMOD=ITYP1
  2364. C Cas des autres FORMULATIONs
  2365. ELSE
  2366. DO i=1,ITEF
  2367. if(lestef(i)(1:4).eq.'BBAR') lobbar = .true.
  2368. if (lobbar) CALL MODE20(ITYP1,LESTEF(I))
  2369. CALL PLACE(NOMTP,LNOMTP,MELE,LESTEF(i))
  2370. IF (MELE.EQ.0) GOTO 99
  2371. MEGE=NUMGEO(MELE)
  2372. IF (MEGE.EQ.0) GOTO 99
  2373. IF (MEGE.EQ.ITYP1) GOTO 6
  2374. c kich cas du POI1
  2375. if (ityp1.eq.1) goto 6
  2376. ENDDO
  2377. GOTO 99
  2378. C Cas particulier pour les elements polygonaux
  2379. 6 IF (ITYP1.EQ.32) THEN
  2380. MELE=MELE+NBNN-3
  2381. IF (NBNN.GT.14) GOTO 99
  2382. ENDIF
  2383. NEFMOD=MELE
  2384. ENDIF
  2385. C Affectation des elements finis de maniere automatique
  2386. ELSE
  2387. C Cas des milieux POREUX
  2388. IF (LESFOR(1).EQ.'POREUX') THEN
  2389. IF (ITYP1.EQ. 6) NEFMOD=79
  2390. IF (ITYP1.EQ.10) NEFMOD=80
  2391. IF (ITYP1.EQ.15) NEFMOD=81
  2392. IF (ITYP1.EQ.24) NEFMOD=82
  2393. IF (ITYP1.EQ.17) NEFMOD=83
  2394. IF (ITYP1.EQ.29) NEFMOD=108
  2395. IF (ITYP1.EQ.30) NEFMOD=109
  2396. IF (ITYP1.EQ.31) NEFMOD=110
  2397. C Cas des elements de frottement (formulation FROTTEMENT)
  2398. ELSE IF (LESFOR(1).EQ.'CONTACT') THEN
  2399. NEFMOD=22
  2400. if(ifrtt.eq.1) then
  2401. IF (ITYP1.EQ.22.AND.IDIM.EQ.2) NEFMOD=107
  2402. IF (ITYP1.EQ.22.AND.IDIM.EQ.3) NEFMOD=165
  2403. elseif(ifroca.ne.0) then
  2404. IF (ITYP1.EQ.22.AND.IDIM.EQ.2) NEFMOD=261
  2405. IF (ITYP1.EQ.22.AND.IDIM.EQ.3) NEFMOD=262
  2406. endif
  2407. C Cas des elements de contrainte (formulation CONTRAINTE)
  2408. ELSE IF (LESFOR(1).EQ.'CONTRAINTE') THEN
  2409. NEFMOD=22
  2410. C Cas des elements hybrides (imposes en DARCY)
  2411. ELSE IF (LESFOR(1).EQ.'DARCY') THEN
  2412. IF (ITYP1.EQ. 3) NEFMOD=143
  2413. C IF (ITYP1.EQ. 4) NEFMOD=99
  2414. C IF (ITYP1.EQ. 8) NEFMOD=100
  2415. C IF (ITYP1.EQ.23) NEFMOD=101
  2416. C IF (ITYP1.EQ.16) NEFMOD=102
  2417. C IF (ITYP1.EQ.14) NEFMOD=103
  2418. IF (ITYP1.EQ. 7) NEFMOD=99
  2419. IF (ITYP1.EQ.11) NEFMOD=100
  2420. IF (ITYP1.EQ.35) NEFMOD=101
  2421. IF (ITYP1.EQ.34) NEFMOD=102
  2422. IF (ITYP1.EQ.33) NEFMOD=103
  2423. C Cas de la formulation MAGNETODYNAMIQUE
  2424. ELSE IF (LESFOR(1).EQ.'MAGNETODYNAMIQUE') THEN
  2425. IF (ITYP1.EQ. 4) NEFMOD=128
  2426. C Cas de la formulation 'NAVIER_STOKES'
  2427. ELSE IF (LESFOR(1).EQ.'NAVIER_STOKES') THEN
  2428. IF (ILNAVI.EQ.0) THEN
  2429. CALL MESLIR(-341)
  2430. GOTO 990
  2431. ELSEIF (ILNAVI.EQ.1) THEN
  2432. C LICE
  2433. IF (ITYP1.EQ. 3) NEFMOD=195
  2434. IF (ITYP1.EQ. 7) NEFMOD=196
  2435. IF (ITYP1.EQ.11) NEFMOD=197
  2436. IF (ITYP1.EQ.33) NEFMOD=198
  2437. IF (ITYP1.EQ.34) NEFMOD=199
  2438. IF (ITYP1.EQ.35) NEFMOD=200
  2439. IF (ITYP1.EQ.36) NEFMOD=201
  2440. ELSEIF (ILNAVI.EQ.2) THEN
  2441. C LIMS
  2442. IF (ITYP1.EQ. 3) NEFMOD=202
  2443. IF (ITYP1.EQ. 7) NEFMOD=203
  2444. IF (ITYP1.EQ.11) NEFMOD=204
  2445. IF (ITYP1.EQ.33) NEFMOD=205
  2446. IF (ITYP1.EQ.34) NEFMOD=206
  2447. IF (ITYP1.EQ.35) NEFMOD=207
  2448. IF (ITYP1.EQ.36) NEFMOD=208
  2449. ELSEIF (ILNAVI.EQ.3) THEN
  2450. C LBMS
  2451. IF (ITYP1.EQ. 3) NEFMOD=209
  2452. IF (ITYP1.EQ. 7) NEFMOD=210
  2453. IF (ITYP1.EQ.11) NEFMOD=211
  2454. IF (ITYP1.EQ.33) NEFMOD=212
  2455. IF (ITYP1.EQ.34) NEFMOD=213
  2456. IF (ITYP1.EQ.35) NEFMOD=214
  2457. IF (ITYP1.EQ.36) NEFMOD=215
  2458. ELSEIF (ILNAVI.EQ.4) THEN
  2459. C MCCE
  2460. IF (ITYP1.EQ. 3) NEFMOD=216
  2461. IF (ITYP1.EQ. 7) NEFMOD=217
  2462. IF (ITYP1.EQ.11) NEFMOD=218
  2463. IF (ITYP1.EQ.33) NEFMOD=219
  2464. IF (ITYP1.EQ.34) NEFMOD=220
  2465. IF (ITYP1.EQ.35) NEFMOD=221
  2466. IF (ITYP1.EQ.36) NEFMOD=222
  2467. ELSEIF (ILNAVI.EQ.5) THEN
  2468. C MCP1
  2469. IF (ITYP1.EQ. 3) NEFMOD=223
  2470. IF (ITYP1.EQ. 7) NEFMOD=224
  2471. IF (ITYP1.EQ.11) NEFMOD=225
  2472. IF (ITYP1.EQ.33) NEFMOD=226
  2473. IF (ITYP1.EQ.34) NEFMOD=227
  2474. IF (ITYP1.EQ.35) NEFMOD=228
  2475. IF (ITYP1.EQ.36) NEFMOD=229
  2476. ELSEIF (ILNAVI.EQ.6) THEN
  2477. C MCMS
  2478. IF (ITYP1.EQ. 3) NEFMOD=230
  2479. IF (ITYP1.EQ. 7) NEFMOD=231
  2480. IF (ITYP1.EQ.11) NEFMOD=232
  2481. IF (ITYP1.EQ.33) NEFMOD=233
  2482. IF (ITYP1.EQ.34) NEFMOD=234
  2483. IF (ITYP1.EQ.35) NEFMOD=235
  2484. IF (ITYP1.EQ.36) NEFMOD=236
  2485. ELSEIF (ILNAVI.EQ.7) THEN
  2486. C QFCE
  2487. IF (ITYP1.EQ. 3) NEFMOD=237
  2488. IF (ITYP1.EQ. 7) NEFMOD=238
  2489. IF (ITYP1.EQ.11) NEFMOD=239
  2490. IF (ITYP1.EQ.33) NEFMOD=240
  2491. IF (ITYP1.EQ.34) NEFMOD=241
  2492. IF (ITYP1.EQ.35) NEFMOD=242
  2493. IF (ITYP1.EQ.36) NEFMOD=243
  2494. ELSEIF (ILNAVI.EQ.8) THEN
  2495. C QFP1
  2496. IF (ITYP1.EQ. 3) NEFMOD=244
  2497. IF (ITYP1.EQ. 7) NEFMOD=245
  2498. IF (ITYP1.EQ.11) NEFMOD=246
  2499. IF (ITYP1.EQ.33) NEFMOD=247
  2500. IF (ITYP1.EQ.34) NEFMOD=248
  2501. IF (ITYP1.EQ.35) NEFMOD=249
  2502. IF (ITYP1.EQ.36) NEFMOD=250
  2503. ELSEIF (ILNAVI.EQ.9) THEN
  2504. C QFMS
  2505. IF (ITYP1.EQ. 3) NEFMOD=251
  2506. IF (ITYP1.EQ. 7) NEFMOD=252
  2507. IF (ITYP1.EQ.11) NEFMOD=253
  2508. IF (ITYP1.EQ.33) NEFMOD=254
  2509. IF (ITYP1.EQ.34) NEFMOD=255
  2510. IF (ITYP1.EQ.35) NEFMOD=256
  2511. IF (ITYP1.EQ.36) NEFMOD=257
  2512. ENDIF
  2513. C Cas de la formulation 'EULER'
  2514. ELSE IF (LESFOR(1).EQ.'EULER') THEN
  2515. IF (ITYP1.EQ. 2) NEFMOD=ITYP1
  2516. IF (ITYP1.EQ. 4) NEFMOD=ITYP1
  2517. IF (ITYP1.EQ. 8) NEFMOD=ITYP1
  2518. IF (ITYP1.EQ.14) NEFMOD=ITYP1
  2519. IF (ITYP1.EQ.16) NEFMOD=ITYP1
  2520. IF (ITYP1.EQ.23) NEFMOD=ITYP1
  2521. IF (ITYP1.EQ.25) NEFMOD=ITYP1
  2522. C Cas des autres formulations
  2523. ELSE
  2524. NEFMOD=ITYP1
  2525. c kich cas du POI1
  2526. if (ityp1.eq.1) nefmod = 45
  2527. C Cas particuliers des elements polygonaux
  2528. IF (NEFMOD.EQ.32) NEFMOD=111+NBNN-3
  2529. c gounand cas des 'CU27','PR21','TE15','PY19'
  2530. if (NEFMOD.GE.33.AND.NEFMOD.LE.36) then
  2531. nefmod = nefmod-33 +275
  2532. endif
  2533. C Cas particuliers des elements finis pour IDIM=1
  2534. IF (IDIM.EQ.1) THEN
  2535. NEFMOD = 0
  2536. IF (LESFOR(1).EQ.'THERMIQUE') THEN
  2537. IF (ICONV.NE.0 .OR. IRAYE.NE.0) THEN
  2538. IF (ITYP1.EQ.1) NEFMOD=45
  2539. IF (ITYP1.EQ.2) NEFMOD=ITYP1
  2540. ELSE
  2541. IF (ITYP1.EQ.2) NEFMOD=191
  2542. IF (ITYP1.EQ.3) NEFMOD=192
  2543. ENDIF
  2544. ELSE IF (LESFOR(1).EQ.'MECANIQUE') THEN
  2545. IF (ITYP1.EQ.2) NEFMOD=193
  2546. IF (ITYP1.EQ.3) NEFMOD=194
  2547. ELSE IF (LESFOR(1).EQ.'FISSURE') THEN
  2548. IF (ITYP1.EQ.2) NEFMOD=ITYP1
  2549. ELSE IF (LESFOR(1).EQ.'ELECTROSTATIQUE') THEN
  2550. IF (ITYP1.EQ.2) NEFMOD=193
  2551. IF (ITYP1.EQ.3) NEFMOD=194
  2552. ELSE IF (LESFOR(1).EQ.'DIFFUSION') THEN
  2553. * En attendant le retour a la normale pour la diffusion, on ajoute une
  2554. * enieme rustine en mettant les memes elements qu'en thermique.
  2555. ** IF (ITYP1.EQ.2) NEFMOD=193
  2556. ** IF (ITYP1.EQ.3) NEFMOD=194
  2557. IF (ITYP1.EQ.2) NEFMOD=191
  2558. IF (ITYP1.EQ.3) NEFMOD=192
  2559. ENDIF
  2560. ENDIF
  2561. ENDIF
  2562. ENDIF
  2563. IF (NEFMOD.EQ.0) GOTO 99
  2564. MELE = NEFMOD
  2565. 101 CONTINUE
  2566. C +--------------------------------------------------------------------+
  2567. C | Fin de la valeur de NEFMOD pour IMODEL |
  2568. C +--------------------------------------------------------------------+
  2569. MFR = NUMMFR(NEFMOD)
  2570. mfr2 = NUMMFR(MELE)
  2571. c-dbg write(6,*)' ITYP1 =',ityp1,nefmod,mele,MFR,mfr2
  2572.  
  2573. C +--------------------------------------------------------------------+
  2574. C Quelques tests supplementaires en attendant mieux
  2575. IF (LESFOR(1).EQ.'THERMIQUE') THEN
  2576. C nnz = MATMOD(/2)
  2577. iplaz = 0
  2578. call place(MATMOD,MATMOD(/2),iplaz,'PHASE')
  2579. IF (iplaz.ne.0 ) THEN
  2580. c test que les elements sont lineaires
  2581. c* on a aussi : ipt4 = ipt1 = imodel.imamod
  2582. ipt4 = imodel.imamod
  2583. itt = ipt4.itypel
  2584. if (kdegre(itt) .gt. 2) then
  2585. call erreur(982)
  2586. goto 990
  2587. endif
  2588. ENDIF
  2589. ENDIF
  2590.  
  2591. IF (LESFOR(1).EQ.'MECANIQUE') THEN
  2592. C Cas du materiau unidirectionnel
  2593. IF (IMATE.EQ.4) THEN
  2594. C Cas des cerces : sans interet !
  2595. IF (MFR.EQ.27) THEN
  2596. CALL ERREUR(251)
  2597. GOTO 990
  2598. ENDIF
  2599. C Cas de la plasticite
  2600. IF (INATU.NE.0) THEN
  2601. C OK si massif bidim ou si coque tridim dans le cas acier_uni
  2602. IF (INATU.EQ.40)THEN
  2603. IF ((MFR.NE.1.OR.IFOUR.GT.0).AND.
  2604. & ((MFR.NE.3.AND.MFR.NE.9).OR.IFOUR.NE.2)) THEN
  2605. CALL ERREUR(251)
  2606. GOTO 990
  2607. ENDIF
  2608. C Dans les autres cas, on n'autorise pour le moment que COQ2 et massif
  2609. ELSE IF (MELE.NE.44.AND.MFR.NE.1) THEN
  2610. CALL ERREUR(251)
  2611. GOTO 990
  2612. ENDIF
  2613. ENDIF
  2614. ENDIF
  2615. C
  2616. C Cas du materiau 'ZONE_COHESIVE'
  2617. IF (IMATE.EQ.12) THEN
  2618. IF (MFR.NE.77) THEN
  2619. CALL ERREUR(251)
  2620. GOTO 990
  2621. ENDIF
  2622. ENDIF
  2623.  
  2624. C Cas du modele section : on n'autorise pour le moment que TIMO
  2625. IF (CMATE.EQ.'SECTION'.AND.MELE.NE.84) THEN
  2626. CALL ERREUR(251)
  2627. GOTO 990
  2628. ENDIF
  2629. ENDIF
  2630. C Le modele de GURSON n'est possible qu'en 3D, axisymetrique ou
  2631. C deformations planes
  2632. IF (INATU.EQ.38) THEN
  2633. IF ( IFOUR.NE.0 .AND. IFOUR.NE.2 .AND. IFOUR.NE.-1 ) THEN
  2634. MOTERR(1:8)='GURSON'
  2635. MOTERR(9:16)='MECANIQU'
  2636. INTERR(1) = IFOUR
  2637. CALL ERREUR (81)
  2638. GOTO 990
  2639. ENDIF
  2640. ENDIF
  2641.  
  2642. C Le modele ISS_GRANGE n'est utilisable qu'en 3D
  2643. IF (INATU.EQ.151 .AND. IFOUR.NE.2) THEN
  2644. INTERR(1) = IFOUR
  2645. CALL ERREUR (709)
  2646. GOTO 990
  2647. ENDIF
  2648. C Le modele RUP_THER n'est utilisable qu'en 3D
  2649. IF (INATU.EQ.152 .AND. IFOUR.NE.2) THEN
  2650. INTERR(1) = IFOUR
  2651. CALL ERREUR (709)
  2652. GOTO 990
  2653. ENDIF
  2654. C Le modele COULOMB n'est utilisable qu'en 3D avec les éléments JOI1
  2655. IF (INATU.EQ.34 .AND. IFOUR.NE.2 .AND. MFR.EQ.75) THEN
  2656. INTERR(1) = IFOUR
  2657. CALL ERREUR (709)
  2658. GOTO 990
  2659. ENDIF
  2660. C.. Restrictions en formulation 'MECANIQUE' avec une loi de
  2661. C comportement non lineaire externe
  2662. C Rappel : LMEEXT exprime la condition (NFOR.EQ.1) ET
  2663. C (LESFOR(1).EQ.'MECANIQUE') ET (loi non lineaire externe)
  2664. IF ( LMEEXT ) THEN
  2665. C En formulation 'MECANIQUE', les lois non lineaires externes
  2666. C n'autorisent qu'une seule composante de temperature
  2667. C => incompatibilite avec des modeles de coques n'ayant pas
  2668. C de points d'integration dans l'epaisseur (trois composantes
  2669. C dans ce cas, 'TINF', 'T ' et 'TSUP')
  2670. C Le test ci-dessous est coherent avec celui de IDTEMP.
  2671. IF ( (MFR.EQ.3.OR.MFR.EQ.5.OR.MFR.EQ.9).AND.
  2672. & (NGINT.EQ.0) ) THEN
  2673. CALL ERREUR(951)
  2674. GOTO 990
  2675. ENDIF
  2676. C Les lois de la famille 'VISCO_EXTERNE' ne s'appliquent pour
  2677. C l'instant qu'aux elements massifs, avec option de calcul 3D
  2678. C Et restriction pour l'instant a 'VISCO_EXTERNE' 'GENERAL'
  2679. IF ( LMEVIX ) THEN
  2680. IF ((MFR.NE.1.AND.MFR.NE.31) .OR. IFOUR.NE.2) THEN
  2681. KERRE = 950
  2682. ELSE IF ( IVIEX.NE.1 ) THEN
  2683. KERRE = 958
  2684. ELSE
  2685. KERRE = 0
  2686. ENDIF
  2687. IF (KERRE.NE.0) THEN
  2688. CALL ERREUR(KERRE)
  2689. GOTO 990
  2690. ENDIF
  2691. ENDIF
  2692. ENDIF
  2693.  
  2694. C Formulation 'THERMIQUE' 'CONVECTION'
  2695. C Adequation EF de type COQue et mot 'INFERIEURE' / 'SUPERIEURE'
  2696. IF (ICONV.EQ.1) THEN
  2697. CALL PLACE(LESPRO,NMAT,ISUP,'SUPERIEURE')
  2698. CALL PLACE(LESPRO,NMAT,IINF,'INFERIEURE')
  2699. ITOT = ISUP+IINF
  2700. LOGRE = MELE.EQ.27 .OR. MELE.EQ.41 .OR. MELE.EQ.44 .OR.
  2701. & MELE.EQ.49 .OR. MELE.EQ.56
  2702. IF ( ITOT.NE.0.AND.(.NOT. LOGRE) ) THEN
  2703. CALL ERREUR(16)
  2704. GOTO 990
  2705. ENDIF
  2706. IF ( ITOT.EQ.0 .AND. LOGRE) THEN
  2707. CALL ERREUR(513)
  2708. GOTO 990
  2709. ENDIF
  2710. ENDIF
  2711.  
  2712. C Formulation 'DIFFUSION' :
  2713. IF (LESFOR(1) .EQ. 'DIFFUSION') THEN
  2714. C - Verification sur les types de FORMULATION et/ou d'elements
  2715. IF (IFOUR.EQ.2 .AND. MELE.GE.4 .AND. MELE.LT.11) THEN
  2716. CALL ERREUR(16)
  2717. GOTO 99
  2718. ENDIF
  2719. IF (MFR.NE.1 .AND. MFR.NE.3 .AND. MFR.NE.5 .AND.
  2720. & MFR.NE.7 .AND. MFR.NE.9 .AND. MFR.NE.73 .AND.
  2721. & MFR.NE.27 .AND. MFR.NE.75 .AND. MFR.NE.79 ) THEN
  2722. CALL ERREUR(16)
  2723. GOTO 99
  2724. ENDIF
  2725. ENDIF
  2726.  
  2727. C Formulation 'ELECTROSTATIQUE' :
  2728. C Petite verification (a priori sans probleme)
  2729. IF (LESFOR(1) .EQ. 'ELECTROSTATIQUE ') THEN
  2730. IF (MFR .NE. 1) THEN
  2731. CALL ERREUR(21)
  2732. GOTO 99
  2733. ENDIF
  2734. ENDIF
  2735.  
  2736. C +--------------------------------------------------------------------+
  2737. C | Remplissage INFMOD et INFELE du IM-eme modele elementaire IMODEL |
  2738. C +--------------------------------------------------------------------+
  2739. IF (NGINT.NE.0.AND.MELE.NE.28) THEN
  2740. CALL ERREUR(608)
  2741. GOTO 990
  2742. ENDIF
  2743. INFMOD(1) = NGINT
  2744.  
  2745. C (fdp) Pour les elements JOI1 seulement, on stocke -1*ILIE dans INFMOD(9)
  2746. IF (ILIE.NE.0) THEN
  2747. IF (MELE.NE.265) THEN
  2748. CALL ERREUR(19)
  2749. GOTO 990
  2750. ENDIF
  2751. INFMOD(9) = -1 * ILIE
  2752. ENDIF
  2753. * AM cas non-local
  2754. IF (INLOC.NE.0) THEN
  2755. INFMOD(13) = -1*INLOC
  2756. INFMOD(14) = LULVIA
  2757. ENDIF
  2758.  
  2759. C Initialisation du infele et des segments d'integration
  2760. infele(2) = NGINT
  2761. infele(3) = NGMAS
  2762. infele(4) = NGCON
  2763. infele(6) = NGRIG
  2764.  
  2765. C Cas particulier des relations de conformite pour les SURE
  2766. IF (ITYP1.EQ.48) THEN
  2767. imodel.infele( 1) = nefmod
  2768. imodel.infele(14) = 48
  2769. imodel.infele(13) = mfr2
  2770. C* Serait-il interessant de stocker mele=nepapa dans infele ?
  2771. c-dbg write(ioimp,*) 'ITYP1 = SURE',ityp1,nefmod,mele,mfr,mfr2
  2772. ENDIF
  2773.  
  2774. CALL prquoi(imodel)
  2775. if (ierr.ne.0) return
  2776.  
  2777. C +--------------------------------------------------------------------+
  2778. C | Initialisation des nomid (NOMS des composantes) |
  2779. C +--------------------------------------------------------------------+
  2780.  
  2781. C cas particulier des relations de conformite pour les SURE
  2782. c on recupere les noms de composantes 'DEPLACEM' et 'FORCES'
  2783. c des elements parents (NEPAPA => QUA4 ou CUB8)
  2784. if (ITYP1.EQ.48) then
  2785. SEGINI,imode5=IMODEL
  2786. imode5.NEFMOD=NEPAPA
  2787. call inomid(imode5,lucvar,lucmat,lucmaf,luparx)
  2788. if (ierr.ne.0) return
  2789. imodel.LNOMID(1) = imode5.LNOMID(1)
  2790. imodel.LNOMID(2) = imode5.LNOMID(2)
  2791. SEGSUP,imode5
  2792. else
  2793. call inomid(imodel,lucvar,lucmat,lucmaf,luparx)
  2794. if (ierr.ne.0) return
  2795. endif
  2796.  
  2797. C Test CLEMENT entre INFELE(16) et la dimension du NOMID des DEFORMATIONS
  2798. C ATTENTION (celui des CONTRAINTES peut contenir une info en plus sur les MODES en fourier...)
  2799. nomid = imodel.LNOMID(5)
  2800. IF (nomid.GT.0) THEN
  2801. imodel.INFELE(16) = nomid.LESOBL(/2) + nomid.LESFAC(/2)
  2802. ELSE
  2803. imodel.INFELE(16) = 0
  2804. ENDIF
  2805.  
  2806. C +--------------------------------------------------------------------+
  2807. C | Quelques verifications supplementaires |
  2808. C +--------------------------------------------------------------------+
  2809.  
  2810. C=DEB==== FORMULATION HHO ==== Verification des noms primales/duales====
  2811. IF (loHHO) THEN
  2812. nomid1 = imodel.LNOMID(1)
  2813. nomid2 = imodel.LNOMID(2)
  2814. c* SEGACT,nomid1,nomid2
  2815. n_z1 = nomid1.LESOBL(/2)
  2816. n_z2 = nomid2.LESOBL(/2)
  2817. IF (n_z1.EQ.0 .OR. n_z1.NE.n_z2) THEN
  2818. write(ioimp,*) 'MODELI HHO: PRIMAL/DUAL number incorrect'
  2819. CALL ERREUR(5)
  2820. RETURN
  2821. END IF
  2822. DO i = 1, n_z1
  2823. CALL VERMDI(nomid1.LESOBL(i),nomid2.LESOBL(i))
  2824. IF (IERR.NE.0) RETURN
  2825. END DO
  2826. n_z1 = nomid1.LESFAC(/2)
  2827. n_z2 = nomid2.LESFAC(/2)
  2828. IF (n_z1.NE.0 .OR. n_z2.NE.0) THEN
  2829. write(ioimp,*) 'MODELI HHO: LESFAC incorrect'
  2830. CALL ERREUR(5)
  2831. RETURN
  2832. END IF
  2833. END IF
  2834. C=FIN==== FORMULATION HHO ==============================================
  2835.  
  2836. C - Modele UTILISATEUR :
  2837. C Verification que les composantes materiaux "obligatoires" sont declarees
  2838. IF (LDIEXT) THEN
  2839. NOMID = IMODEL.LNOMID(6)
  2840. NBROBL = NOMID.LESOBL(/2)
  2841. MLMOT1 = lucmat
  2842. SEGACT,MLMOT1
  2843. NBCOMP = MLMOT1.MOTS(/2)
  2844. ICOMP = 0
  2845. DO i = 1, NBROBL
  2846. CALL PLACE(MLMOT1.MOTS,NBCOMP,IPLAC,NOMID.LESOBL(i))
  2847. IF (IPLAC.EQ.0) THEN
  2848. WRITE(IOIMP,80) MOTS(i)
  2849. 80 FORMAT('La composante obligatoire "',A8,'" est absente')
  2850. ELSE
  2851. ICOMP = ICOMP+1
  2852. ENDIF
  2853. ENDDO
  2854. IF (ICOMP.NE.NBROBL) GOTO 99
  2855. ENDIF
  2856.  
  2857. mfr2 = INFELE(13)
  2858. IF (FORMOD(1).EQ.'CONTRAINTE') mfr2 = 0
  2859. ipmo = imodel
  2860. CALL cotemo(ipmo,mfr2)
  2861. IF (IERR.NE.0) RETURN
  2862.  
  2863. C +--------------------------------------------------------------------+
  2864. C | Point support pour les modes en defo. GENE (IFOUR=-3, 7 a 11, 14)
  2865. C | Ce point n'est pris en compte que si cela est necessaire
  2866. C +--------------------------------------------------------------------+
  2867. mfr3 = mfr2
  2868. CALL INFDPG(mfr3,IFOUR, LOGRE,ndpge)
  2869. IF (LOGRE) THEN
  2870. C Erreur si ce point support n'est pas fourni avec le mot-cle GENE.
  2871. IF (IPTGEN.EQ.0) THEN
  2872. CALL ERREUR(925)
  2873. RETURN
  2874. ENDIF
  2875. imodel.IPDPGE = IPTGEN
  2876. ELSE
  2877. IF (IPTGEN.NE.0) THEN
  2878. write(ioimp,*) 'Mot-cle GENE + Point ignores...'
  2879. ENDIF
  2880. imodel.IPDPGE = 0
  2881. ENDIF
  2882.  
  2883.  
  2884. SEGACT,IMODEL*NOMOD
  2885.  
  2886. 10 CONTINUE
  2887. C ****************************************************************
  2888. C Fin de la boucle (10) sur les maillages elementaires de IPGEOM
  2889. C ****************************************************************
  2890.  
  2891. * En cas de contact symetrique, on met tout dans le meme modele
  2892. n1o = kmodel(/1)
  2893. n1 = n1o
  2894. do i = 1, n1o
  2895. imode1 = mmode2.kmodel(i)
  2896. if (imode1.ne.0) then
  2897. n1 = n1+1
  2898. endif
  2899. enddo
  2900. * On a trouve du contact :
  2901. if (n1.gt.n1o) then
  2902. segadj mmodel
  2903. nsou1 = n1
  2904. do i = 1, n1o
  2905. imode1 = mmode2.kmodel(i)
  2906. if (imode1.ne.0) then
  2907. kmodel(n1)=imode1
  2908. n1=n1-1
  2909. imodel=kmodel(i)
  2910. imode1.nefmod=nefmod
  2911. imode1.conmod=conmod
  2912. do ip=1,infmod(/1)
  2913. imode1.infmod(ip)=infmod(ip)
  2914. enddo
  2915. do ip=1,formod(/2)
  2916. imode1.formod(ip)=formod(ip)
  2917. enddo
  2918. do ip=1,matmod(/2)
  2919. imode1.matmod(ip)=matmod(ip)
  2920. enddo
  2921. imode1.ipdpge=ipdpge
  2922. imode1.cmatee=cmatee
  2923. imode1.imatee=imatee
  2924. imode1.inatuu=inatuu
  2925. imode1.ideriv=ideriv
  2926. do ip=1,lnomid(/1)
  2927. imode1.lnomid(ip)=lnomid(ip)
  2928. enddo
  2929. do ip=1,infele(/1)
  2930. imode1.infele(ip)=infele(ip)
  2931. enddo
  2932. do ip=1,tymode(/2)
  2933. imode1.tymode(ip)=tymode(ip)
  2934. enddo
  2935. endif
  2936. enddo
  2937. n1 = nsou1
  2938. endif
  2939. segsup mmode2
  2940.  
  2941. IPMODE=MMODEL
  2942.  
  2943. C en cas de modele STAT ddddddddddddddddddddddddddddddddddddddddddd
  2944. 91 IF (IPTABS.GT.0.OR.IPMOD1.GT.0) THEN
  2945. c verification formulation
  2946. IF (ipmod1.gt.0) THEN
  2947. CALL ACTOBJ('MMODEL',IPMOD1,1)
  2948. if (ierr.ne.0) return
  2949. mmode1 = ipmod1
  2950. imode1 = mmode1.kmodel(1)
  2951. do jj=1,NFOR
  2952. if (imode1.formod(jj).ne.LESFOR(JJ)) then
  2953. call erreur(21)
  2954. return
  2955. endif
  2956. enddo
  2957. ENDIF
  2958. c duplique le modele cree
  2959. if (ipmod1.le.0) ipmod1 = ipmode
  2960. C modele : pointer le modele elementaire approprie
  2961. IF (iptabm.eq.0) THEN
  2962. MMODE1 = ipmod1
  2963. DO im = 1,kmodel(/1)
  2964. imodel = kmodel(im)
  2965. segact imodel*mod
  2966. nobmod = ivamod(/1)
  2967. nobmod = nobmod + 1
  2968. nfor = formod(/2)
  2969. nmat = matmod(/2)
  2970. mn3 = infmod(/1)
  2971. segadj imodel
  2972. kbmod = 0
  2973. do im1 = 1,MMODE1.KMODEL(/1)
  2974. imode1 = mmode1.kmodel(im1)
  2975. imomo = imode1
  2976. lostat = .true.
  2977.  
  2978. C criteres de verif assez sommaires ...
  2979. if (imode1.nefmod.eq.nefmod.and.
  2980. & imode1.imamod.ne.imamod.and.
  2981. & (imode1.matmod(/2).eq.matmod(/2).or.
  2982. & imode1.matmod(/2).eq.(matmod(/2)-1)).and.
  2983. & imode1.formod(/2).eq.formod(/2)) then
  2984. do lmo = 1,formod(/2)
  2985. if (formod(lmo).ne.imode1.formod(lmo)) lostat = .false.
  2986. enddo
  2987. do lmo = 1,imode1.matmod(/2)
  2988. if (matmod(lmo).ne.imode1.matmod(lmo)) lostat = .false.
  2989. enddo
  2990. else
  2991. lostat = .false.
  2992. endif
  2993. if (lostat.and.formod(1).eq.'MELANGE') then
  2994. C verifs supplementaires : les modeles de ivamod sont ils bien construi
  2995. lomela = .true.
  2996. if ((nobmod - imode1.ivamod(/1)).gt.1) lomela = .false.
  2997. if (imode1.ivamod(/1).gt.0) then
  2998. do ivm3 = 1,imode1.ivamod(/1)
  2999. IF(imode1.tymode(ivm3).eq.'IMODEL') THEN
  3000. imode3 = imode1.ivamod(ivm3)
  3001. segact imode3
  3002. ENDIF
  3003. enddo
  3004. endif
  3005. IF (nobmod.gt.1) THEN
  3006. do ivm1 = 1,(nobmod-1)
  3007. if (tymode(ivm1).eq.'IMODEL ') then
  3008. imode2 = ivamod(ivm1)
  3009. segact imode2
  3010. cc
  3011. if (imode2.ivamod(/1).ge.1) then
  3012. do ivm2 = 1,imode2.ivamod(/1)
  3013. if (imode2.tymode(ivm2).eq.'IMODEL') then
  3014. imode4 = imode2.ivamod(ivm2)
  3015. segact imode4
  3016. if (imode1.ivamod(/1).ge.1) then
  3017. do ivm3 = 1,imode1.ivamod(/1)
  3018. IF(imode1.tymode(ivm3).eq.'IMODEL') THEN
  3019. imode3 = imode1.ivamod(ivm3)
  3020. cc
  3021. lostat = .true.
  3022. C criteres de verif assez faibles ...
  3023. if (imode3.nefmod.eq.imode4.nefmod.and.
  3024. & imode3.imamod.eq.imode4.imamod.and.
  3025. & imode3.matmod(/2).eq.imode4.matmod(/2).and.
  3026. & imode3.conmod(17:24).eq.imode4.conmod(17:24).and.
  3027. & imode3.formod(/2).eq.imode4.formod(/2)) then
  3028. do lmo = 1,imode4.formod(/2)
  3029. if (imode4.formod(lmo).ne.imode3.formod(lmo)) lostat = .false.
  3030. enddo
  3031. do lmo = 1,imode4.matmod(/2)
  3032. if (imode4.matmod(lmo).ne.imode3.matmod(lmo)) lostat = .false.
  3033. enddo
  3034. else
  3035. lostat = .false.
  3036. endif
  3037. if (lostat) then
  3038. goto 75
  3039. endif
  3040. cc
  3041. ENDIF
  3042. enddo
  3043. else
  3044. lostat = .false.
  3045. endif
  3046. endif
  3047. enddo
  3048. C
  3049. else
  3050. lomela = .false.
  3051. endif
  3052.  
  3053. 75 lomela = lomela.and.lostat
  3054. endif
  3055.  
  3056. enddo
  3057. ENDIF
  3058. lostat = lomela
  3059. do ivm3 = 1,imode1.ivamod(/1)
  3060. c imode1 = imomo
  3061. IF(imode1.tymode(ivm3).eq.'IMODEL') THEN
  3062. imode3 = imode1.ivamod(ivm3)
  3063. ENDIF
  3064. enddo
  3065. endif
  3066. if (lostat) then
  3067. kbmod = kbmod + 1
  3068. tymode(nobmod) = 'IMODEL'
  3069. ivamod(nobmod) = imomo
  3070. goto 79
  3071. endif
  3072. enddo
  3073. C *** ca se passe mal
  3074. if (kbmod.ne.1) then
  3075. write(ioimp,*) ' STATIO EN DEFAUT voir notice ',kbmod,im
  3076. call erreur(251)
  3077. goto 990
  3078. endif
  3079. C ***
  3080. 79 CONTINUE
  3081. ENDDO
  3082. ENDIF
  3083.  
  3084. C : table : dupliquer modele elementaire et pointer
  3085. if (iptabm.gt.0) then
  3086. call modsta(ipmode,iptabm,ipmod1)
  3087. endif
  3088.  
  3089. ENDIF
  3090. C fin du modele STAT ddddddddddddddddddddddddddddddddddddddddddddddd
  3091.  
  3092. if (plicon.ne.0) segsup,plicon
  3093.  
  3094. C Ecriture de l'objet MODELE cree
  3095. CALL ACTOBJ('MMODEL ',IPMODE,1)
  3096. CALL ECROBJ('MMODEL ',IPMODE)
  3097. RETURN
  3098.  
  3099. C Traitement des ERREURS
  3100. 99 CONTINUE
  3101. CALL ERREUR(21)
  3102. 990 CONTINUE
  3103. DO im = 1, kmodel(/1)
  3104. imodel = kmodel(im)
  3105. IF (imodel.NE.0) SEGSUP,imodel
  3106. ENDDO
  3107. SEGSUP,MMODEL
  3108.  
  3109. if (plicon.ne.0) segsup,plicon
  3110.  
  3111. c RETURN
  3112. END
  3113.  
  3114.  
  3115.  

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