Télécharger modeli.eso

Retour à la liste

Numérotation des lignes :

modeli
  1. C MODELI SOURCE OF166741 24/12/18 21:15:25 12090
  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. C IF (LMEVIX ) NOBMOD = NOBMOD + 2
  1827. IF (LMEVIX ) NOBMOD = NOBMOD + 1
  1828.  
  1829. ELSEIF (LESFOR(1).eq.'METALLURGIE ') THEN
  1830. C On rangera les pointeurs sur les ListMots Phases,
  1831. C Reactifs, Produits et Types de Reactions dans IVAMOD
  1832. NOBMOD = 4
  1833.  
  1834. ELSEIF (LESFOR(1).eq.'CHANGEMENT_PHASE') THEN
  1835.  
  1836. IF (LESPRO(1)(1:10).EQ.'PARFAIT ') THEN
  1837. C On rangera : -le LISTMOTS des inconnues primales et duales dedans
  1838. C -le MAILLAGE des MULTIPLICATEURS 'LX'
  1839. NOBMOD = 2
  1840. ELSEIF (LESPRO(1)(1:10).EQ.'SOLUBILITE') THEN
  1841. C On rangera : -le LISTMOTS des inconnues primales et duales dedans
  1842. C -le 1er MAILLAGE des MULTIPLICATEURS 'LX'
  1843. C -le 2eme MAILLAGE des MULTIPLICATEURS 'LX'
  1844. NOBMOD = 3
  1845. ELSE
  1846. CALL ERREUR(5)
  1847. ENDIF
  1848.  
  1849. ELSE IF (lesfor(1).eq.'NAVIER_STOKES ') THEN
  1850. IF (LESPRO(1).EQ.'NLIN ') NOBMOD = 1
  1851.  
  1852. ELSE IF (lesfor(1).eq.'THERMIQUE ') THEN
  1853. IF (IRAYE.eq.1) NOBMOD = 2*icavit+isyme*idim+ifacaf*4
  1854.  
  1855. C LIAISON conditionnelle
  1856. ELSE IF (LESFOR(1).EQ.'LIAISON ') THEN
  1857. c* if (klcon.gt.0) THEN
  1858. noblia = NOBMOD
  1859. NOBMOD = NOBMOD + klcon
  1860. c* endif
  1861. ENDIF
  1862.  
  1863. C=DEB==== FORMULATION HHO ==== Donnees supplementaires =================
  1864. IF (loHHO) THEN
  1865. nobHHO = NOBMOD
  1866. NOBMOD = NOBMOD + MTYHHO
  1867. END IF
  1868. C=FIN==== FORMULATION HHO ==============================================
  1869.  
  1870. IF (jlmot1.gt.0) THEN
  1871. if (nobmod.ne.0) then
  1872. write(ioimp,*) 'NOBMOD !=0 et jlmot1,jlmmot2 > 0'
  1873. call erreur(5)
  1874. return
  1875. endif
  1876. NOBMOD = 2
  1877. ENDIF
  1878.  
  1879. NOBMOD0 = NOBMOD
  1880. NOBMEC0 = NOBMEC
  1881. NOBDIF0 = NOBDIF
  1882. nobHHO0 = nobHHO
  1883. noblia0 = noblia
  1884.  
  1885. C***********************************************************************
  1886. C Boucle (10) sur les maillages elementaires de IPGEOM
  1887. C***********************************************************************
  1888. MELEME = IPGEOM
  1889. IPT1 = MELEME
  1890.  
  1891. DO 10 IM = 1, NSOU1
  1892.  
  1893. IF (NSOU.NE.0) IPT1 = MELEME.LISOUS(IM)
  1894. ITYP1 = IPT1.ITYPEL
  1895. NBNN = IPT1.NUM(/1)
  1896. NBEL = IPT1.NUM(/2)
  1897.  
  1898. C +--------------------------------------------------------------------+
  1899. C | Creation du modele elementaire IMODEL |
  1900. C +--------------------------------------------------------------------+
  1901. NOBMOD = NOBMOD0
  1902. NOBMEC = NOBMEC0
  1903. NOBDIF = NOBDIF0
  1904. nobHHO = nobHHO0
  1905. noblia = noblia0
  1906.  
  1907. SEGINI,IMODEL
  1908. mmodel.KMODEL(IM) = IMODEL
  1909.  
  1910. C +--------------------------------------------------------------------+
  1911. C | Remplissage du IMODEL |
  1912. C +--------------------------------------------------------------------+
  1913. imodel.IMAMOD = IPT1
  1914.  
  1915. imodel.CONMOD(1:16) = CONM
  1916. imodel.conmod(17:24) = PHAM
  1917.  
  1918. DO i = 1, NFOR
  1919. imodel.FORMOD(i) = LESFOR(i)
  1920. ENDDO
  1921. IF (NMAT.NE.0) THEN
  1922. DO i = 1, NMAT
  1923. imodel.MATMOD(i) = LESPRO(i)
  1924. ENDDO
  1925. ENDIF
  1926.  
  1927. C Informations liees au MATERIAU/COMPORTEMENT
  1928. CMATE = ' '
  1929. IMATE = 0
  1930. INATU = 0
  1931. CALL NOMATE(FORMOD,NFOR,MATMOD,NMAT,CMATE,IMATE,INATU)
  1932. c-dbg write(6,*)'NOMATE : ',cmate,imate,inatu
  1933. c-dbg write(6,*)' MATMOD =',(matmod(i),i=1,nmat)
  1934. IF (IERR.NE.0) then
  1935. write(ioimp,*) ' Probleme apres NOMATE'
  1936. CALL ERREUR(251)
  1937. GOTO 990
  1938. ENDIF
  1939. C* Petit cas particulier en cas de modele VISCO_EXTERNE :
  1940. C* On recupere IVIEX stocke dans INATU (cf. NOMATE)
  1941. IF (INATU .LE. -2) THEN
  1942. IF (.NOT. LMEVIX) THEN
  1943. write(ioimp,*)' VISCO_EXTERNE : INATU & LMEVIX incompatibles'
  1944. call erreur(5)
  1945. return
  1946. ENDIF
  1947. IVIEX = -2 - INATU
  1948. INATU = -2
  1949. ENDIF
  1950. imodel.CMATEE = CMATE
  1951. imodel.IMATEE = IMATE
  1952. imodel.INATUU = INATU
  1953.  
  1954. c imodel.ideriv = jderiv
  1955. cbp,2020-12-10 : abandon de MEPSIL (CCOPTIO) et IDERIV (MMODEL)
  1956. imodel.IDERIV = 0
  1957.  
  1958. ipmmel = 0
  1959. IF (LESFOR(1).EQ.'MELANGE ') THEN
  1960. IF (CMATE.EQ.'PARALLEL' .OR. CMATE.EQ.'SERIE') THEN
  1961. ipmmel = LESMOD(1)
  1962. if (ipmmel.le.0) then
  1963. call erreur(21)
  1964. GOTO 990
  1965. endif
  1966. ENDIF
  1967. ENDIF
  1968.  
  1969. C +--------------------------------------------------------------------+
  1970. C | Remplissage des couples TYMODE/IVAMOD |
  1971. C +--------------------------------------------------------------------+
  1972. IF (LESFOR(1).EQ.'CONTACT ') THEN
  1973. IF (IFROCA.EQ.0) THEN
  1974. * lecture du mot-cle
  1975. call lirmot(MCTCT,4,iret,0)
  1976. ictct=iret
  1977. if(iret.eq.0) ictct=1
  1978. ictr=2
  1979. if(ictct.ne.2) ictr=1
  1980. * cas mortar : uniquement disponible en 2D
  1981. if (iret.eq.4) then
  1982. if (idim.ne.2) then
  1983. INTERR(1) = IDIM
  1984. CALL ERREUR(1104)
  1985. GOTO 990
  1986. endif
  1987. ictr=4
  1988. endif
  1989. * lecture du deuxieme maillage
  1990. call lirobj('MAILLAGE',ipgeo2,1,iretou)
  1991. if (ierr.ne.0) return
  1992. ipgeox=ipgeo2
  1993. call mocon1(ipgeox,lecont,ictr)
  1994. if(ierr.ne.0) return
  1995. tymode(1)='MAILLAGE'
  1996. ivamod(1)=ipgeom
  1997. tymode(2)='MAILLAGE'
  1998. ivamod(2)=ipgeo2
  1999. tymode(3)='ENTIER'
  2000. ivamod(3)=ictr
  2001. imamod=ipgeox
  2002. if(ictct.eq.2) then
  2003. ip2=ipgeom
  2004. call mocon1(ip2,lecont,ictr)
  2005. if(ierr.ne.0) return
  2006. ip1=imamod
  2007. call fuse(ip1,ip2,iret,.false.)
  2008. if(ierr.ne.0) return
  2009. imamod=iret
  2010. endif
  2011. if(ictct.eq.3) then
  2012. segini,imode1
  2013. mmode2.kmodel(im)=imode1
  2014. ipgeox=ipgeom
  2015. call mocon1(ipgeox,lecont,ictr)
  2016. if(ierr.ne.0) return
  2017. imode1.tymode(1)='MAILLAGE'
  2018. imode1.ivamod(1)=ipgeo2
  2019. imode1.tymode(2)='MAILLAGE'
  2020. imode1.ivamod(2)=ipgeom
  2021. imode1.tymode(3)='ENTIER'
  2022. imode1.ivamod(3)=1
  2023. imode1.imamod=ipgeox
  2024. endif
  2025. ENDIF
  2026.  
  2027. IF (IFROCA.EQ.1) THEN
  2028. * deuxieme maillage deja lu
  2029. ipgeo2 = ipgeom
  2030. ictr=0
  2031. call mocon1(ipgeo2,lecont,ictr)
  2032. if(ierr.ne.0) return
  2033. imamod=ipgeo2
  2034. ipt3=ipgeo2
  2035. segact ipt3
  2036. ityp1=ipt3.itypel
  2037. TYMODE(1)='MAILLAGE'
  2038. IVAMOD(1)=IPGEOM
  2039. TYMODE(2)='MAILLAGE'
  2040. IVAMOD(2)=IBETON
  2041. ENDIF
  2042. ** IF (ifrtt.eq.1) then
  2043. ** ivamod(1)=ipgeo2
  2044. ** tymode(1)='MAILLAGE'
  2045. ** if (ipgeo2.eq.0) then
  2046. ** call erreur(641)
  2047. ** return
  2048. ** endif
  2049. ** ENDIF
  2050.  
  2051. ELSEIF (lesfor(1).eq.'CONTRAINTE ') then
  2052. if (lactr.eq.1.or.lactr.eq.2) then
  2053. call mocon2(ipgeom,ipt7)
  2054. endif
  2055. if (lactr.eq.3) call mocon3(ipgeom,ipt7)
  2056. tymode(1)='ENTIER'
  2057. ivamod(1)=lactr
  2058. tymode(2)='MAILLAGE'
  2059. ivamod(2)=ipgeom
  2060. imamod=ipt7
  2061. * cas rotation idim-1 pts
  2062. if (lactr.eq.1) then
  2063. call meslir(0)
  2064. call lirobj('POINT',ip1,1,iok)
  2065. if (idim.eq.3) call lirobj('POINT',ip2,1,iok)
  2066. if (ierr.ne.0) return
  2067. tymode(3)='POINT'
  2068. ivamod(3)=ip1
  2069. if (idim.eq.3) then
  2070. tymode(4)='POINT'
  2071. ivamod(4)=ip2
  2072. endif
  2073. * cas deplacement 1 pt
  2074. elseif (lactr.eq.2) then
  2075. call lirobj('POINT',ip1,1,iok)
  2076. if (ierr.ne.0) return
  2077. tymode(3)='POINT'
  2078. ivamod(3)=ip1
  2079. endif
  2080.  
  2081. ELSEIF (lesfor(1).eq.'NAVIER_STOKES ') THEN
  2082. IF (nobmod.gt.0) THEN
  2083. tymode(1) = 'LISTMOTS'
  2084. ivamod(1) = opnlin
  2085. ENDIF
  2086.  
  2087. ELSEIF (lesfor(1).eq.'METALLURGIE ') then
  2088. C lucvar : les noms des phases
  2089. IVAMOD(1) = lucvar
  2090. TYMODE(1) = 'LISTMOTS'
  2091. C reacti : les noms des reactifs
  2092. IVAMOD(2) = ireact
  2093. TYMODE(2) = 'LISTMOTS'
  2094. C produi : les noms des produits
  2095. IVAMOD(3) = iprodu
  2096. TYMODE(3) = 'LISTMOTS'
  2097. C lucmat : les noms des types de reactions
  2098. IVAMOD(4) = lucmat
  2099. TYMODE(4) = 'LISTMOTS'
  2100.  
  2101. ELSEIF (lesfor(1).eq.'CHANGEMENT_PHASE') then
  2102. C ipridu : les noms des variables primales et duales
  2103. IVAMOD(1) = ipridu
  2104. TYMODE(1) ='LISTMOTS'
  2105. CALL IMPP1(IPT1,ipgeo2,ipgeo3,LESPRO(1))
  2106. C ipgeo2 & ipgeo3 : MAILLAGE support des Multiplicateurs de Lagrange ('MULT')
  2107. IF (LESPRO(1)(1:10).EQ.'PARFAIT ') THEN
  2108. IVAMOD(2) = ipgeo2
  2109. TYMODE(2) ='MAILLAGE'
  2110. ELSEIF (LESPRO(1)(1:10).EQ.'SOLUBILITE') THEN
  2111. IVAMOD(2) = ipgeo2
  2112. TYMODE(2) ='MAILLAGE'
  2113. IVAMOD(3) = ipgeo3
  2114. TYMODE(3) ='MAILLAGE'
  2115. ELSE
  2116. CALL ERREUR(5)
  2117. ENDIF
  2118.  
  2119. ELSEIF (LESFOR(1).EQ.'THERMIQUE')THEN
  2120. if(IRAYE.ne.0) then
  2121. if(icavit.ne.0) then
  2122. tymode(1)='ENTIER'
  2123. ivamod(1)=nbga
  2124. tymode(2)='ENTIER'
  2125. ivamod(2)=nbdang
  2126. if(isyme.eq.1) then
  2127. tymode(3)='POINT'
  2128. tymode(4)='POINT'
  2129. if(idim.eq.3)tymode(5)='POINT'
  2130. ivamod(3)=ipp1
  2131. ivamod(4)=ipp2
  2132. if(idim.eq.3)ivamod(5)=ipp3
  2133. endif
  2134. endif
  2135. if(ifacaf.ne.0) then
  2136. tymode(1)='MAILLAGE'
  2137. tymode(2)='MAILLAGE'
  2138. tymode(3)='MAILLAGE'
  2139. tymode(4)='MMODEL'
  2140. ivamod(1)= ipfac1
  2141. ivamod(2)= ipfac2
  2142. ivamod(3)= ipfac3
  2143. ivamod(4)= imoco
  2144. endif
  2145. endif
  2146.  
  2147. ELSEIF (LESFOR(1).EQ.'DIFFUSION') THEN
  2148. JGN = LOCOMP
  2149. JGM = 2
  2150. SEGINI,MLMOT1
  2151. TYMODE(NOBDIF+1)='LISTMOTS'
  2152. IVAMOD(NOBDIF+1)=iplrdi
  2153. NOBDIF = NOBDIF+1
  2154. IF (LDILOI.GT.0) THEN
  2155. C Indicateur 'LDIEXT' pour retrouver ses petits
  2156. CALL POSCHA('LDIEXT ',I_POS)
  2157. TYMODE(NOBDIF+1)='MOT '
  2158. IVAMOD(NOBDIF+1)= I_POS
  2159.  
  2160. C Pointeur vers la loi (donne par PTRLOI)
  2161. TYMODE(NOBDIF+2)='ENTIER '
  2162. IVAMOD(NOBDIF+2)= LDIPTR
  2163.  
  2164. C LMELIB : Nom de la bibliotheque (sans chemin et extension)
  2165. CALL POSCHA(LDILIB(1:LDILGB),I_POS)
  2166. TYMODE(NOBDIF+3)='MOT '
  2167. IVAMOD(NOBDIF+3)= I_POS
  2168.  
  2169. C LMEFCT : Nom de la fonction (dans la bibliotheque)
  2170. CALL POSCHA(LDIFCT(1:LDILGT),I_POS)
  2171. TYMODE(NOBDIF+4)='MOT '
  2172. IVAMOD(NOBDIF+4)= I_POS
  2173. NOBDIF = NOBDIF + 4
  2174. ENDIF
  2175.  
  2176. ELSEIF (LMEEXT) THEN
  2177. C Modeles utilisateur en MECANIQUE :
  2178. IF (LMELOI.GT.0) THEN
  2179. C Indicateur 'LMEEXT' pour retrouver ses petits
  2180. CALL POSCHA('LMEEXT ',I_POS)
  2181. TYMODE(NOBMEC+1)='MOT '
  2182. IVAMOD(NOBMEC+1)= I_POS
  2183.  
  2184. C Pointeur vers la loi (donne par PTRLOI)
  2185. TYMODE(NOBMEC+2)='ENTIER '
  2186. IVAMOD(NOBMEC+2)= LMEPTR
  2187.  
  2188. C LMELIB : Nom de la bibliotheque (sans chemin et extension)
  2189. CALL POSCHA(LMELIB(1:LMELGB),I_POS)
  2190. TYMODE(NOBMEC+3)='MOT '
  2191. IVAMOD(NOBMEC+3)= I_POS
  2192.  
  2193. C LMEFCT : Nom de la fonction (dans la bibliotheque)
  2194. CALL POSCHA(LMEFCT(1:LMELGT),I_POS)
  2195. TYMODE(NOBMEC+4)='MOT '
  2196. IVAMOD(NOBMEC+4)= I_POS
  2197. NOBMEC = NOBMEC + 4
  2198. ENDIF
  2199.  
  2200. IF (LMEVIX) THEN
  2201. c* IF (INATU .EQ. -2) THEN
  2202. NOBMEC = NOBMEC + 1
  2203. imodel.TYMODE(NOBMEC) = 'IVIEX '
  2204. imodel.IVAMOD(NOBMEC) = IVIEX
  2205. C NOBMEC = NOBMEC + 1
  2206. C imodel.TYMODE(NOBMEC) = 'ENTIER '
  2207. C imodel.IVAMOD(NOBMEC) = 0
  2208. ENDIF
  2209.  
  2210. ELSE IF (LESFOR(1).EQ.'LIAISON ') THEN
  2211. if (klcon.gt.0) THEN
  2212. do i = 1, klcon
  2213. if (tlicon(i).eq.6) TYMODE(noblia+i) = 'CONDINFE'
  2214. if (tlicon(i).eq.7) TYMODE(noblia+i) = 'CONDSUPE'
  2215. IVAMOD(noblia+i) = mlicon(i)
  2216. enddo
  2217. ENDIF
  2218.  
  2219. ENDIF
  2220. if (jlmot1.gt.0) then
  2221. ivamod(1) = jlmot1
  2222. ivamod(2) = jlmot2
  2223. tymode(1) = 'LISTMOTS'
  2224. tymode(2) = 'LISTMOTS'
  2225. lucvar = jlmot1
  2226. lucmat = jlmot2
  2227. endif
  2228.  
  2229. C=DEB==== FORMULATION HHO ==== Remplissage de donnees ==================
  2230. IF (loHHO) THEN
  2231. modHHO = imodel
  2232. CALL HHOPRM(chaHHO,modHHO,nobHHO,iplHHO,iret)
  2233. IF (iret.NE.0) THEN
  2234. CALL ERREUR(iret)
  2235. GOTO 990
  2236. END IF
  2237. END IF
  2238. C=FIN==== FORMULATION HHO ==============================================
  2239.  
  2240. c* IF (FORMOD(1).EQ.'MELANGE ') THEN
  2241. IF (ipmmel.GT.0) THEN
  2242. mmode1 = ipmmel
  2243. n1mel = mmode1.kmodel(/1)
  2244. NOBMOI = ivamod(/1)
  2245. NOBMOD = NOBMOI + n1mel
  2246. SEGADJ,IMODEL
  2247. kbmod = 0
  2248. DO i = 1, n1mel
  2249. imode1 = mmode1.kmodel(i)
  2250. if (imode1.imamod.eq.imamod) then
  2251. if (kbmod.eq.0) then
  2252. imode2 = imode1
  2253. else
  2254. if (imode1.formod(1).ne.imode2.formod(1).or.
  2255. & imode1.imatee.ne.imode2.imatee) goto 117
  2256. endif
  2257. kbmod = kbmod + 1
  2258. tymode(NOBMOI+kbmod) = 'IMODEL'
  2259. ivamod(NOBMOI+kbmod) = imode1
  2260. endif
  2261. 117 continue
  2262. ENDDO
  2263. if (kbmod.eq.0) then
  2264. call erreur(21)
  2265. return
  2266. endif
  2267. if (kbmod.ne.n1mel) then
  2268. NOBMOD = NOBMOI + kbmod
  2269. SEGADJ,imodel
  2270. endif
  2271. ENDIF
  2272. c* ENDIF
  2273. c-dbg write(ioimp,*) 'Fin remplissage IVAMOD/TYMODE'
  2274.  
  2275. C +--------------------------------------------------------------------+
  2276. C | Determination de la valeur de NEFMOD pour IMODEL |
  2277. C +--------------------------------------------------------------------+
  2278. C Affectation du type d'ELEMENTS FINIS si donnes par utilisateur
  2279.  
  2280. C Cas des SURE (relation de conformite) :
  2281. C NEPAPA = si EF specifique demande -> on utilise ses inconnues
  2282. NEPAPA = 0
  2283. IF (ITYP1.EQ.48) THEN
  2284. imodel.NEFMOD = 259
  2285. IF (ITEF.GT.0) THEN
  2286. DO i=1,ITEF
  2287. CALL PLACE(NOMTP,LNOMTP,MELE,LESTEF(i))
  2288. IF (MELE.NE.0) NEPAPA = MELE
  2289. ENDDO
  2290. ENDIF
  2291. IF (NEPAPA.EQ.0) THEN
  2292. c 2D -> on choisit les inconnues du QUA4 pour toute formulation
  2293. IF (IDIM.EQ.2) THEN
  2294. NEPAPA=8
  2295. c 3D -> on choisit les inconnues du CUB8 pour toute formulation
  2296. ELSEIF (IDIM.EQ.3) THEN
  2297. NEPAPA=14
  2298. ELSE
  2299. CALL ERREUR(610)
  2300. RETURN
  2301. ENDIF
  2302. ENDIF
  2303. MELE = NEPAPA
  2304. GOTO 101
  2305. ENDIF
  2306.  
  2307. C=DEB==== FORMULATION HHO ==== NEFMOD = HHO_NUM_ELEMENT pour tous les elements =====
  2308. IF (loHHO) THEN
  2309. imodel.NEFMOD = HHO_NUM_ELEMENT
  2310. MELE = imodel.NEFMOD
  2311. GOTO 101
  2312. END IF
  2313. C=FIN==== FORMULATION HHO ==============================================
  2314.  
  2315. NEFMOD = 0
  2316. IF (ITEF.NE.0) THEN
  2317. C Cas de la FORMULATION 'NAVIER_STOKES'
  2318. IF (LESFOR(1).EQ.'NAVIER_STOKES') THEN
  2319. IF (LESTEF(1).EQ.'LINE')THEN
  2320. IF (ITYP1.EQ. 3) NEFMOD=129
  2321. IF (ITYP1.EQ. 7) NEFMOD=130
  2322. IF (ITYP1.EQ.11) NEFMOD=131
  2323. IF (ITYP1.EQ.33) NEFMOD=132
  2324. IF (ITYP1.EQ.34) NEFMOD=133
  2325. IF (ITYP1.EQ.35) NEFMOD=134
  2326. IF (ITYP1.EQ.36) NEFMOD=135
  2327. ELSE IF(LESTEF(1).EQ.'MACR')THEN
  2328. IF (ITYP1.EQ. 3) NEFMOD=136
  2329. IF (ITYP1.EQ. 7) NEFMOD=137
  2330. IF (ITYP1.EQ.11) NEFMOD=138
  2331. IF (ITYP1.EQ.33) NEFMOD=139
  2332. IF (ITYP1.EQ.34) NEFMOD=140
  2333. IF (ITYP1.EQ.35) NEFMOD=141
  2334. IF (ITYP1.EQ.36) NEFMOD=142
  2335. C Il nous manque la pyramide
  2336. ELSE IF (LESTEF(1).EQ.'QUAF') THEN
  2337. IF (ITYP1.EQ. 3) NEFMOD=143
  2338. IF (ITYP1.EQ. 7) NEFMOD=144
  2339. IF (ITYP1.EQ.11) NEFMOD=145
  2340. IF (ITYP1.EQ.33) NEFMOD=146
  2341. IF (ITYP1.EQ.34) NEFMOD=147
  2342. IF (ITYP1.EQ.35) NEFMOD=148
  2343. IF (ITYP1.EQ.36) NEFMOD=149
  2344. C Il nous manque la pyramide
  2345. ELSE IF (LESTEF(1).EQ.'LINB') THEN
  2346. IF (ITYP1.EQ. 3) NEFMOD=158
  2347. IF (ITYP1.EQ. 7) NEFMOD=159
  2348. IF (ITYP1.EQ.11) NEFMOD=160
  2349. IF (ITYP1.EQ.33) NEFMOD=161
  2350. IF (ITYP1.EQ.34) NEFMOD=162
  2351. C IF (ITYP1.EQ.35) NEFMOD=163
  2352. C IF (ITYP1.EQ.36) NEFMOD=164
  2353. C Il nous manque la pyramide et le tetrahedre
  2354. ELSE
  2355. DO i=1,ITEF
  2356. CALL PLACE(NOMTP,LNOMTP,MELE,LESTEF(i))
  2357. IF (MELE.EQ.0) GOTO 99
  2358. MEGE=NUMGEO(MELE)
  2359. IF (MEGE.EQ.0) GOTO 99
  2360. IF (MEGE.EQ.ITYP1) GOTO 610
  2361. ENDDO
  2362. GOTO 99
  2363. 610 NEFMOD=MELE
  2364. ENDIF
  2365. C Cas de la FORMULATION 'EULER'
  2366. ELSE IF (LESFOR(1).EQ.'EULER') THEN
  2367. IF (ITYP1.EQ. 2) NEFMOD=ITYP1
  2368. IF (ITYP1.EQ. 4) NEFMOD=ITYP1
  2369. IF (ITYP1.EQ. 8) NEFMOD=ITYP1
  2370. IF (ITYP1.EQ.14) NEFMOD=ITYP1
  2371. IF (ITYP1.EQ.16) NEFMOD=ITYP1
  2372. IF (ITYP1.EQ.23) NEFMOD=ITYP1
  2373. IF (ITYP1.EQ.25) NEFMOD=ITYP1
  2374. C Cas des autres FORMULATIONs
  2375. ELSE
  2376. DO i=1,ITEF
  2377. if(lestef(i)(1:4).eq.'BBAR') lobbar = .true.
  2378. if (lobbar) CALL MODE20(ITYP1,LESTEF(I))
  2379. CALL PLACE(NOMTP,LNOMTP,MELE,LESTEF(i))
  2380. IF (MELE.EQ.0) GOTO 99
  2381. MEGE=NUMGEO(MELE)
  2382. IF (MEGE.EQ.0) GOTO 99
  2383. IF (MEGE.EQ.ITYP1) GOTO 6
  2384. c kich cas du POI1
  2385. if (ityp1.eq.1) goto 6
  2386. ENDDO
  2387. GOTO 99
  2388. C Cas particulier pour les elements polygonaux
  2389. 6 IF (ITYP1.EQ.32) THEN
  2390. MELE=MELE+NBNN-3
  2391. IF (NBNN.GT.14) GOTO 99
  2392. ENDIF
  2393. NEFMOD=MELE
  2394. ENDIF
  2395. C Affectation des elements finis de maniere automatique
  2396. ELSE
  2397. C Cas des milieux POREUX
  2398. IF (LESFOR(1).EQ.'POREUX') THEN
  2399. IF (ITYP1.EQ. 6) NEFMOD=79
  2400. IF (ITYP1.EQ.10) NEFMOD=80
  2401. IF (ITYP1.EQ.15) NEFMOD=81
  2402. IF (ITYP1.EQ.24) NEFMOD=82
  2403. IF (ITYP1.EQ.17) NEFMOD=83
  2404. IF (ITYP1.EQ.29) NEFMOD=108
  2405. IF (ITYP1.EQ.30) NEFMOD=109
  2406. IF (ITYP1.EQ.31) NEFMOD=110
  2407. C Cas des elements de frottement (formulation FROTTEMENT)
  2408. ELSE IF (LESFOR(1).EQ.'CONTACT') THEN
  2409. NEFMOD=22
  2410. if(ifrtt.eq.1) then
  2411. IF (ITYP1.EQ.22.AND.IDIM.EQ.2) NEFMOD=107
  2412. IF (ITYP1.EQ.22.AND.IDIM.EQ.3) NEFMOD=165
  2413. elseif(ifroca.ne.0) then
  2414. IF (ITYP1.EQ.22.AND.IDIM.EQ.2) NEFMOD=261
  2415. IF (ITYP1.EQ.22.AND.IDIM.EQ.3) NEFMOD=262
  2416. endif
  2417. C Cas des elements de contrainte (formulation CONTRAINTE)
  2418. ELSE IF (LESFOR(1).EQ.'CONTRAINTE') THEN
  2419. NEFMOD=22
  2420. C Cas des elements hybrides (imposes en DARCY)
  2421. ELSE IF (LESFOR(1).EQ.'DARCY') THEN
  2422. IF (ITYP1.EQ. 3) NEFMOD=143
  2423. C IF (ITYP1.EQ. 4) NEFMOD=99
  2424. C IF (ITYP1.EQ. 8) NEFMOD=100
  2425. C IF (ITYP1.EQ.23) NEFMOD=101
  2426. C IF (ITYP1.EQ.16) NEFMOD=102
  2427. C IF (ITYP1.EQ.14) NEFMOD=103
  2428. IF (ITYP1.EQ. 7) NEFMOD=99
  2429. IF (ITYP1.EQ.11) NEFMOD=100
  2430. IF (ITYP1.EQ.35) NEFMOD=101
  2431. IF (ITYP1.EQ.34) NEFMOD=102
  2432. IF (ITYP1.EQ.33) NEFMOD=103
  2433. C Cas de la formulation MAGNETODYNAMIQUE
  2434. ELSE IF (LESFOR(1).EQ.'MAGNETODYNAMIQUE') THEN
  2435. IF (ITYP1.EQ. 4) NEFMOD=128
  2436. C Cas de la formulation 'NAVIER_STOKES'
  2437. ELSE IF (LESFOR(1).EQ.'NAVIER_STOKES') THEN
  2438. IF (ILNAVI.EQ.0) THEN
  2439. CALL MESLIR(-341)
  2440. GOTO 990
  2441. ELSEIF (ILNAVI.EQ.1) THEN
  2442. C LICE
  2443. IF (ITYP1.EQ. 3) NEFMOD=195
  2444. IF (ITYP1.EQ. 7) NEFMOD=196
  2445. IF (ITYP1.EQ.11) NEFMOD=197
  2446. IF (ITYP1.EQ.33) NEFMOD=198
  2447. IF (ITYP1.EQ.34) NEFMOD=199
  2448. IF (ITYP1.EQ.35) NEFMOD=200
  2449. IF (ITYP1.EQ.36) NEFMOD=201
  2450. ELSEIF (ILNAVI.EQ.2) THEN
  2451. C LIMS
  2452. IF (ITYP1.EQ. 3) NEFMOD=202
  2453. IF (ITYP1.EQ. 7) NEFMOD=203
  2454. IF (ITYP1.EQ.11) NEFMOD=204
  2455. IF (ITYP1.EQ.33) NEFMOD=205
  2456. IF (ITYP1.EQ.34) NEFMOD=206
  2457. IF (ITYP1.EQ.35) NEFMOD=207
  2458. IF (ITYP1.EQ.36) NEFMOD=208
  2459. ELSEIF (ILNAVI.EQ.3) THEN
  2460. C LBMS
  2461. IF (ITYP1.EQ. 3) NEFMOD=209
  2462. IF (ITYP1.EQ. 7) NEFMOD=210
  2463. IF (ITYP1.EQ.11) NEFMOD=211
  2464. IF (ITYP1.EQ.33) NEFMOD=212
  2465. IF (ITYP1.EQ.34) NEFMOD=213
  2466. IF (ITYP1.EQ.35) NEFMOD=214
  2467. IF (ITYP1.EQ.36) NEFMOD=215
  2468. ELSEIF (ILNAVI.EQ.4) THEN
  2469. C MCCE
  2470. IF (ITYP1.EQ. 3) NEFMOD=216
  2471. IF (ITYP1.EQ. 7) NEFMOD=217
  2472. IF (ITYP1.EQ.11) NEFMOD=218
  2473. IF (ITYP1.EQ.33) NEFMOD=219
  2474. IF (ITYP1.EQ.34) NEFMOD=220
  2475. IF (ITYP1.EQ.35) NEFMOD=221
  2476. IF (ITYP1.EQ.36) NEFMOD=222
  2477. ELSEIF (ILNAVI.EQ.5) THEN
  2478. C MCP1
  2479. IF (ITYP1.EQ. 3) NEFMOD=223
  2480. IF (ITYP1.EQ. 7) NEFMOD=224
  2481. IF (ITYP1.EQ.11) NEFMOD=225
  2482. IF (ITYP1.EQ.33) NEFMOD=226
  2483. IF (ITYP1.EQ.34) NEFMOD=227
  2484. IF (ITYP1.EQ.35) NEFMOD=228
  2485. IF (ITYP1.EQ.36) NEFMOD=229
  2486. ELSEIF (ILNAVI.EQ.6) THEN
  2487. C MCMS
  2488. IF (ITYP1.EQ. 3) NEFMOD=230
  2489. IF (ITYP1.EQ. 7) NEFMOD=231
  2490. IF (ITYP1.EQ.11) NEFMOD=232
  2491. IF (ITYP1.EQ.33) NEFMOD=233
  2492. IF (ITYP1.EQ.34) NEFMOD=234
  2493. IF (ITYP1.EQ.35) NEFMOD=235
  2494. IF (ITYP1.EQ.36) NEFMOD=236
  2495. ELSEIF (ILNAVI.EQ.7) THEN
  2496. C QFCE
  2497. IF (ITYP1.EQ. 3) NEFMOD=237
  2498. IF (ITYP1.EQ. 7) NEFMOD=238
  2499. IF (ITYP1.EQ.11) NEFMOD=239
  2500. IF (ITYP1.EQ.33) NEFMOD=240
  2501. IF (ITYP1.EQ.34) NEFMOD=241
  2502. IF (ITYP1.EQ.35) NEFMOD=242
  2503. IF (ITYP1.EQ.36) NEFMOD=243
  2504. ELSEIF (ILNAVI.EQ.8) THEN
  2505. C QFP1
  2506. IF (ITYP1.EQ. 3) NEFMOD=244
  2507. IF (ITYP1.EQ. 7) NEFMOD=245
  2508. IF (ITYP1.EQ.11) NEFMOD=246
  2509. IF (ITYP1.EQ.33) NEFMOD=247
  2510. IF (ITYP1.EQ.34) NEFMOD=248
  2511. IF (ITYP1.EQ.35) NEFMOD=249
  2512. IF (ITYP1.EQ.36) NEFMOD=250
  2513. ELSEIF (ILNAVI.EQ.9) THEN
  2514. C QFMS
  2515. IF (ITYP1.EQ. 3) NEFMOD=251
  2516. IF (ITYP1.EQ. 7) NEFMOD=252
  2517. IF (ITYP1.EQ.11) NEFMOD=253
  2518. IF (ITYP1.EQ.33) NEFMOD=254
  2519. IF (ITYP1.EQ.34) NEFMOD=255
  2520. IF (ITYP1.EQ.35) NEFMOD=256
  2521. IF (ITYP1.EQ.36) NEFMOD=257
  2522. ENDIF
  2523. C Cas de la formulation 'EULER'
  2524. ELSE IF (LESFOR(1).EQ.'EULER') THEN
  2525. IF (ITYP1.EQ. 2) NEFMOD=ITYP1
  2526. IF (ITYP1.EQ. 4) NEFMOD=ITYP1
  2527. IF (ITYP1.EQ. 8) NEFMOD=ITYP1
  2528. IF (ITYP1.EQ.14) NEFMOD=ITYP1
  2529. IF (ITYP1.EQ.16) NEFMOD=ITYP1
  2530. IF (ITYP1.EQ.23) NEFMOD=ITYP1
  2531. IF (ITYP1.EQ.25) NEFMOD=ITYP1
  2532. C Cas des autres formulations
  2533. ELSE
  2534. NEFMOD=ITYP1
  2535. c kich cas du POI1
  2536. if (ityp1.eq.1) nefmod = 45
  2537. C Cas particuliers des elements polygonaux
  2538. IF (NEFMOD.EQ.32) NEFMOD=111+NBNN-3
  2539. c gounand cas des 'CU27','PR21','TE15','PY19'
  2540. if (NEFMOD.GE.33.AND.NEFMOD.LE.36) then
  2541. nefmod = nefmod-33 +275
  2542. endif
  2543. C Cas particuliers des elements finis pour IDIM=1
  2544. IF (IDIM.EQ.1) THEN
  2545. NEFMOD = 0
  2546. IF (LESFOR(1).EQ.'THERMIQUE') THEN
  2547. IF (ICONV.NE.0 .OR. IRAYE.NE.0) THEN
  2548. IF (ITYP1.EQ.1) NEFMOD=45
  2549. IF (ITYP1.EQ.2) NEFMOD=ITYP1
  2550. ELSE
  2551. IF (ITYP1.EQ.2) NEFMOD=191
  2552. IF (ITYP1.EQ.3) NEFMOD=192
  2553. ENDIF
  2554. ELSE IF (LESFOR(1).EQ.'MECANIQUE') THEN
  2555. IF (ITYP1.EQ.2) NEFMOD=193
  2556. IF (ITYP1.EQ.3) NEFMOD=194
  2557. ELSE IF (LESFOR(1).EQ.'FISSURE') THEN
  2558. IF (ITYP1.EQ.2) NEFMOD=ITYP1
  2559. ELSE IF (LESFOR(1).EQ.'ELECTROSTATIQUE') THEN
  2560. IF (ITYP1.EQ.2) NEFMOD=193
  2561. IF (ITYP1.EQ.3) NEFMOD=194
  2562. ELSE IF (LESFOR(1).EQ.'DIFFUSION') THEN
  2563. * En attendant le retour a la normale pour la diffusion, on ajoute une
  2564. * enieme rustine en mettant les memes elements qu'en thermique.
  2565. ** IF (ITYP1.EQ.2) NEFMOD=193
  2566. ** IF (ITYP1.EQ.3) NEFMOD=194
  2567. IF (ITYP1.EQ.2) NEFMOD=191
  2568. IF (ITYP1.EQ.3) NEFMOD=192
  2569. ENDIF
  2570. ENDIF
  2571. ENDIF
  2572. ENDIF
  2573. IF (NEFMOD.EQ.0) GOTO 99
  2574. MELE = NEFMOD
  2575. 101 CONTINUE
  2576. C +--------------------------------------------------------------------+
  2577. C | Fin de la valeur de NEFMOD pour IMODEL |
  2578. C +--------------------------------------------------------------------+
  2579. MFR = NUMMFR(NEFMOD)
  2580. mfr2 = NUMMFR(MELE)
  2581. c-dbg write(6,*)' ITYP1 =',ityp1,nefmod,mele,MFR,mfr2
  2582.  
  2583. C +--------------------------------------------------------------------+
  2584. C Quelques tests supplementaires en attendant mieux
  2585. IF (LESFOR(1).EQ.'THERMIQUE') THEN
  2586. C nnz = MATMOD(/2)
  2587. iplaz = 0
  2588. call place(MATMOD,MATMOD(/2),iplaz,'PHASE')
  2589. IF (iplaz.ne.0 ) THEN
  2590. c test que les elements sont lineaires
  2591. c* on a aussi : ipt4 = ipt1 = imodel.imamod
  2592. ipt4 = imodel.imamod
  2593. itt = ipt4.itypel
  2594. if (kdegre(itt) .gt. 2) then
  2595. call erreur(982)
  2596. goto 990
  2597. endif
  2598. ENDIF
  2599. ENDIF
  2600.  
  2601. IF (LESFOR(1).EQ.'MECANIQUE') THEN
  2602. C Cas du materiau unidirectionnel
  2603. IF (IMATE.EQ.4) THEN
  2604. C Cas des cerces : sans interet !
  2605. IF (MFR.EQ.27) THEN
  2606. CALL ERREUR(251)
  2607. GOTO 990
  2608. ENDIF
  2609. C Cas de la plasticite
  2610. IF (INATU.NE.0) THEN
  2611. C OK si massif bidim ou si coque tridim dans le cas acier_uni
  2612. IF (INATU.EQ.40)THEN
  2613. IF ((MFR.NE.1.OR.IFOUR.GT.0).AND.
  2614. & ((MFR.NE.3.AND.MFR.NE.9).OR.IFOUR.NE.2)) THEN
  2615. CALL ERREUR(251)
  2616. GOTO 990
  2617. ENDIF
  2618. C Dans les autres cas, on n'autorise pour le moment que COQ2 et massif
  2619. ELSE IF (MELE.NE.44.AND.MFR.NE.1) THEN
  2620. CALL ERREUR(251)
  2621. GOTO 990
  2622. ENDIF
  2623. ENDIF
  2624. ENDIF
  2625. C
  2626. C Cas du materiau 'ZONE_COHESIVE'
  2627. IF (IMATE.EQ.12) THEN
  2628. IF (MFR.NE.77) THEN
  2629. CALL ERREUR(251)
  2630. GOTO 990
  2631. ENDIF
  2632. ENDIF
  2633.  
  2634. C Cas du modele section : on n'autorise pour le moment que TIMO
  2635. IF (CMATE.EQ.'SECTION'.AND.MELE.NE.84) THEN
  2636. CALL ERREUR(251)
  2637. GOTO 990
  2638. ENDIF
  2639. ENDIF
  2640. C Le modele de GURSON n'est possible qu'en 3D, axisymetrique ou
  2641. C deformations planes
  2642. IF (INATU.EQ.38) THEN
  2643. IF ( IFOUR.NE.0 .AND. IFOUR.NE.2 .AND. IFOUR.NE.-1 ) THEN
  2644. MOTERR(1:8)='GURSON'
  2645. MOTERR(9:16)='MECANIQU'
  2646. INTERR(1) = IFOUR
  2647. CALL ERREUR (81)
  2648. GOTO 990
  2649. ENDIF
  2650. ENDIF
  2651.  
  2652. C Le modele ISS_GRANGE n'est utilisable qu'en 3D
  2653. IF (INATU.EQ.151 .AND. IFOUR.NE.2) THEN
  2654. INTERR(1) = IFOUR
  2655. CALL ERREUR (709)
  2656. GOTO 990
  2657. ENDIF
  2658. C Le modele RUP_THER n'est utilisable qu'en 3D
  2659. IF (INATU.EQ.152 .AND. IFOUR.NE.2) THEN
  2660. INTERR(1) = IFOUR
  2661. CALL ERREUR (709)
  2662. GOTO 990
  2663. ENDIF
  2664. C Le modele COULOMB n'est utilisable qu'en 3D avec les éléments JOI1
  2665. IF (INATU.EQ.34 .AND. IFOUR.NE.2 .AND. MFR.EQ.75) THEN
  2666. INTERR(1) = IFOUR
  2667. CALL ERREUR (709)
  2668. GOTO 990
  2669. ENDIF
  2670. C.. Restrictions en formulation 'MECANIQUE' avec une loi de
  2671. C comportement non lineaire externe
  2672. C Rappel : LMEEXT exprime la condition (NFOR.EQ.1) ET
  2673. C (LESFOR(1).EQ.'MECANIQUE') ET (loi non lineaire externe)
  2674. IF ( LMEEXT ) THEN
  2675. C En formulation 'MECANIQUE', les lois non lineaires externes
  2676. C n'autorisent qu'une seule composante de temperature
  2677. C => incompatibilite avec des modeles de coques n'ayant pas
  2678. C de points d'integration dans l'epaisseur (trois composantes
  2679. C dans ce cas, 'TINF', 'T ' et 'TSUP')
  2680. C Le test ci-dessous est coherent avec celui de IDTEMP.
  2681. IF ( (MFR.EQ.3.OR.MFR.EQ.5.OR.MFR.EQ.9).AND.
  2682. & (NGINT.EQ.0) ) THEN
  2683. CALL ERREUR(951)
  2684. GOTO 990
  2685. ENDIF
  2686. C Les lois de la famille 'VISCO_EXTERNE' ne s'appliquent pour
  2687. C l'instant qu'aux elements massifs, avec option de calcul 3D
  2688. C Et restriction pour l'instant a 'VISCO_EXTERNE' 'GENERAL'
  2689. IF ( LMEVIX ) THEN
  2690. IF ((MFR.NE.1.AND.MFR.NE.31) .OR. IFOUR.NE.2) THEN
  2691. KERRE = 950
  2692. ELSE IF ( IVIEX.NE.1 ) THEN
  2693. KERRE = 958
  2694. ELSE
  2695. KERRE = 0
  2696. ENDIF
  2697. IF (KERRE.NE.0) THEN
  2698. CALL ERREUR(KERRE)
  2699. GOTO 990
  2700. ENDIF
  2701. ENDIF
  2702. ENDIF
  2703.  
  2704. C Formulation 'THERMIQUE' 'CONVECTION'
  2705. C Adequation EF de type COQue et mot 'INFERIEURE' / 'SUPERIEURE'
  2706. IF (ICONV.EQ.1) THEN
  2707. CALL PLACE(LESPRO,NMAT,ISUP,'SUPERIEURE')
  2708. CALL PLACE(LESPRO,NMAT,IINF,'INFERIEURE')
  2709. ITOT = ISUP+IINF
  2710. LOGRE = MELE.EQ.27 .OR. MELE.EQ.41 .OR. MELE.EQ.44 .OR.
  2711. & MELE.EQ.49 .OR. MELE.EQ.56
  2712. IF ( ITOT.NE.0.AND.(.NOT. LOGRE) ) THEN
  2713. CALL ERREUR(16)
  2714. GOTO 990
  2715. ENDIF
  2716. IF ( ITOT.EQ.0 .AND. LOGRE) THEN
  2717. CALL ERREUR(513)
  2718. GOTO 990
  2719. ENDIF
  2720. ENDIF
  2721.  
  2722. C Formulation 'DIFFUSION' :
  2723. IF (LESFOR(1) .EQ. 'DIFFUSION') THEN
  2724. C - Verification sur les types de FORMULATION et/ou d'elements
  2725. IF (IFOUR.EQ.2 .AND. MELE.GE.4 .AND. MELE.LT.11) THEN
  2726. CALL ERREUR(16)
  2727. GOTO 99
  2728. ENDIF
  2729. IF (MFR.NE.1 .AND. MFR.NE.3 .AND. MFR.NE.5 .AND.
  2730. & MFR.NE.7 .AND. MFR.NE.9 .AND. MFR.NE.73 .AND.
  2731. & MFR.NE.27 .AND. MFR.NE.75 .AND. MFR.NE.79 ) THEN
  2732. CALL ERREUR(16)
  2733. GOTO 99
  2734. ENDIF
  2735. ENDIF
  2736.  
  2737. C Formulation 'ELECTROSTATIQUE' :
  2738. C Petite verification (a priori sans probleme)
  2739. IF (LESFOR(1) .EQ. 'ELECTROSTATIQUE ') THEN
  2740. IF (MFR .NE. 1) THEN
  2741. CALL ERREUR(21)
  2742. GOTO 99
  2743. ENDIF
  2744. ENDIF
  2745.  
  2746. C +--------------------------------------------------------------------+
  2747. C | Remplissage INFMOD et INFELE du IM-eme modele elementaire IMODEL |
  2748. C +--------------------------------------------------------------------+
  2749. IF (NGINT.NE.0.AND.MELE.NE.28) THEN
  2750. CALL ERREUR(608)
  2751. GOTO 990
  2752. ENDIF
  2753. INFMOD(1) = NGINT
  2754.  
  2755. C (fdp) Pour les elements JOI1 seulement, on stocke -1*ILIE dans INFMOD(9)
  2756. IF (ILIE.NE.0) THEN
  2757. IF (MELE.NE.265) THEN
  2758. CALL ERREUR(19)
  2759. GOTO 990
  2760. ENDIF
  2761. INFMOD(9) = -1 * ILIE
  2762. ENDIF
  2763. * AM cas non-local
  2764. IF (INLOC.NE.0) THEN
  2765. INFMOD(13) = -1*INLOC
  2766. INFMOD(14) = LULVIA
  2767. ENDIF
  2768.  
  2769. C Initialisation du infele et des segments d'integration
  2770. infele(2) = NGINT
  2771. infele(3) = NGMAS
  2772. infele(4) = NGCON
  2773. infele(6) = NGRIG
  2774.  
  2775. C Cas particulier des relations de conformite pour les SURE
  2776. IF (ITYP1.EQ.48) THEN
  2777. imodel.infele( 1) = nefmod
  2778. imodel.infele(14) = 48
  2779. imodel.infele(13) = mfr2
  2780. C* Serait-il interessant de stocker mele=nepapa dans infele ?
  2781. c-dbg write(ioimp,*) 'ITYP1 = SURE',ityp1,nefmod,mele,mfr,mfr2
  2782. ENDIF
  2783.  
  2784. CALL prquoi(imodel)
  2785. if (ierr.ne.0) return
  2786.  
  2787. C +--------------------------------------------------------------------+
  2788. C | Initialisation des nomid (NOMS des composantes) |
  2789. C +--------------------------------------------------------------------+
  2790.  
  2791. C cas particulier des relations de conformite pour les SURE
  2792. c on recupere les noms de composantes 'DEPLACEM' et 'FORCES'
  2793. c des elements parents (NEPAPA => QUA4 ou CUB8)
  2794. if (ITYP1.EQ.48) then
  2795. SEGINI,imode5=IMODEL
  2796. imode5.NEFMOD=NEPAPA
  2797. call inomid(imode5,lucvar,lucmat,lucmaf,luparx)
  2798. if (ierr.ne.0) return
  2799. imodel.LNOMID(1) = imode5.LNOMID(1)
  2800. imodel.LNOMID(2) = imode5.LNOMID(2)
  2801. SEGSUP,imode5
  2802. else
  2803. call inomid(imodel,lucvar,lucmat,lucmaf,luparx)
  2804. if (ierr.ne.0) return
  2805. endif
  2806.  
  2807. C Test CLEMENT entre INFELE(16) et la dimension du NOMID des DEFORMATIONS
  2808. C ATTENTION (celui des CONTRAINTES peut contenir une info en plus sur les MODES en fourier...)
  2809. nomid = imodel.LNOMID(5)
  2810. IF (nomid.GT.0) THEN
  2811. imodel.INFELE(16) = nomid.LESOBL(/2) + nomid.LESFAC(/2)
  2812. ELSE
  2813. imodel.INFELE(16) = 0
  2814. ENDIF
  2815.  
  2816. C +--------------------------------------------------------------------+
  2817. C | Quelques verifications supplementaires |
  2818. C +--------------------------------------------------------------------+
  2819.  
  2820. C=DEB==== FORMULATION HHO ==== Verification des noms primales/duales====
  2821. IF (loHHO) THEN
  2822. nomid1 = imodel.LNOMID(1)
  2823. nomid2 = imodel.LNOMID(2)
  2824. c* SEGACT,nomid1,nomid2
  2825. n_z1 = nomid1.LESOBL(/2)
  2826. n_z2 = nomid2.LESOBL(/2)
  2827. IF (n_z1.EQ.0 .OR. n_z1.NE.n_z2) THEN
  2828. write(ioimp,*) 'MODELI HHO: PRIMAL/DUAL number incorrect'
  2829. CALL ERREUR(5)
  2830. RETURN
  2831. END IF
  2832. DO i = 1, n_z1
  2833. CALL VERMDI(nomid1.LESOBL(i),nomid2.LESOBL(i))
  2834. IF (IERR.NE.0) RETURN
  2835. END DO
  2836. n_z1 = nomid1.LESFAC(/2)
  2837. n_z2 = nomid2.LESFAC(/2)
  2838. IF (n_z1.NE.0 .OR. n_z2.NE.0) THEN
  2839. write(ioimp,*) 'MODELI HHO: LESFAC incorrect'
  2840. CALL ERREUR(5)
  2841. RETURN
  2842. END IF
  2843. END IF
  2844. C=FIN==== FORMULATION HHO ==============================================
  2845.  
  2846. C - Modele UTILISATEUR :
  2847. C Verification que les composantes materiaux "obligatoires" sont declarees
  2848. IF (LDIEXT) THEN
  2849. NOMID = IMODEL.LNOMID(6)
  2850. NBROBL = NOMID.LESOBL(/2)
  2851. MLMOT1 = lucmat
  2852. SEGACT,MLMOT1
  2853. NBCOMP = MLMOT1.MOTS(/2)
  2854. ICOMP = 0
  2855. DO i = 1, NBROBL
  2856. CALL PLACE(MLMOT1.MOTS,NBCOMP,IPLAC,NOMID.LESOBL(i))
  2857. IF (IPLAC.EQ.0) THEN
  2858. WRITE(IOIMP,80) MOTS(i)
  2859. 80 FORMAT('La composante obligatoire "',A8,'" est absente')
  2860. ELSE
  2861. ICOMP = ICOMP+1
  2862. ENDIF
  2863. ENDDO
  2864. IF (ICOMP.NE.NBROBL) GOTO 99
  2865. ENDIF
  2866.  
  2867. mfr2 = INFELE(13)
  2868. IF (FORMOD(1).EQ.'CONTRAINTE') mfr2 = 0
  2869. ipmo = imodel
  2870. CALL cotemo(ipmo,mfr2)
  2871. IF (IERR.NE.0) RETURN
  2872.  
  2873. C +--------------------------------------------------------------------+
  2874. C | Point support pour les modes en defo. GENE (IFOUR=-3, 7 a 11, 14)
  2875. C | Ce point n'est pris en compte que si cela est necessaire
  2876. C +--------------------------------------------------------------------+
  2877. mfr3 = mfr2
  2878. CALL INFDPG(mfr3,IFOUR, LOGRE,ndpge)
  2879. IF (LOGRE) THEN
  2880. C Erreur si ce point support n'est pas fourni avec le mot-cle GENE.
  2881. IF (IPTGEN.EQ.0) THEN
  2882. CALL ERREUR(925)
  2883. RETURN
  2884. ENDIF
  2885. imodel.IPDPGE = IPTGEN
  2886. ELSE
  2887. IF (IPTGEN.NE.0) THEN
  2888. write(ioimp,*) 'Mot-cle GENE + Point ignores...'
  2889. ENDIF
  2890. imodel.IPDPGE = 0
  2891. ENDIF
  2892.  
  2893.  
  2894. SEGACT,IMODEL*NOMOD
  2895.  
  2896. 10 CONTINUE
  2897. C ****************************************************************
  2898. C Fin de la boucle (10) sur les maillages elementaires de IPGEOM
  2899. C ****************************************************************
  2900.  
  2901. * En cas de contact symetrique, on met tout dans le meme modele
  2902. n1o = kmodel(/1)
  2903. n1 = n1o
  2904. do i = 1, n1o
  2905. imode1 = mmode2.kmodel(i)
  2906. if (imode1.ne.0) then
  2907. n1 = n1+1
  2908. endif
  2909. enddo
  2910. * On a trouve du contact :
  2911. if (n1.gt.n1o) then
  2912. segadj mmodel
  2913. nsou1 = n1
  2914. do i = 1, n1o
  2915. imode1 = mmode2.kmodel(i)
  2916. if (imode1.ne.0) then
  2917. kmodel(n1)=imode1
  2918. n1=n1-1
  2919. imodel=kmodel(i)
  2920. imode1.nefmod=nefmod
  2921. imode1.conmod=conmod
  2922. do ip=1,infmod(/1)
  2923. imode1.infmod(ip)=infmod(ip)
  2924. enddo
  2925. do ip=1,formod(/2)
  2926. imode1.formod(ip)=formod(ip)
  2927. enddo
  2928. do ip=1,matmod(/2)
  2929. imode1.matmod(ip)=matmod(ip)
  2930. enddo
  2931. imode1.ipdpge=ipdpge
  2932. imode1.cmatee=cmatee
  2933. imode1.imatee=imatee
  2934. imode1.inatuu=inatuu
  2935. imode1.ideriv=ideriv
  2936. do ip=1,lnomid(/1)
  2937. imode1.lnomid(ip)=lnomid(ip)
  2938. enddo
  2939. do ip=1,infele(/1)
  2940. imode1.infele(ip)=infele(ip)
  2941. enddo
  2942. do ip=1,tymode(/2)
  2943. imode1.tymode(ip)=tymode(ip)
  2944. enddo
  2945. endif
  2946. enddo
  2947. n1 = nsou1
  2948. endif
  2949. segsup mmode2
  2950.  
  2951. IPMODE=MMODEL
  2952.  
  2953. C en cas de modele STAT ddddddddddddddddddddddddddddddddddddddddddd
  2954. 91 IF (IPTABS.GT.0.OR.IPMOD1.GT.0) THEN
  2955. c verification formulation
  2956. IF (ipmod1.gt.0) THEN
  2957. CALL ACTOBJ('MMODEL',IPMOD1,1)
  2958. if (ierr.ne.0) return
  2959. mmode1 = ipmod1
  2960. imode1 = mmode1.kmodel(1)
  2961. do jj=1,NFOR
  2962. if (imode1.formod(jj).ne.LESFOR(JJ)) then
  2963. call erreur(21)
  2964. return
  2965. endif
  2966. enddo
  2967. ENDIF
  2968. c duplique le modele cree
  2969. if (ipmod1.le.0) ipmod1 = ipmode
  2970. C modele : pointer le modele elementaire approprie
  2971. IF (iptabm.eq.0) THEN
  2972. MMODE1 = ipmod1
  2973. DO im = 1,kmodel(/1)
  2974. imodel = kmodel(im)
  2975. segact imodel*mod
  2976. nobmod = ivamod(/1)
  2977. nobmod = nobmod + 1
  2978. nfor = formod(/2)
  2979. nmat = matmod(/2)
  2980. mn3 = infmod(/1)
  2981. segadj imodel
  2982. kbmod = 0
  2983. do im1 = 1,MMODE1.KMODEL(/1)
  2984. imode1 = mmode1.kmodel(im1)
  2985. imomo = imode1
  2986. lostat = .true.
  2987.  
  2988. C criteres de verif assez sommaires ...
  2989. if (imode1.nefmod.eq.nefmod.and.
  2990. & imode1.imamod.ne.imamod.and.
  2991. & (imode1.matmod(/2).eq.matmod(/2).or.
  2992. & imode1.matmod(/2).eq.(matmod(/2)-1)).and.
  2993. & imode1.formod(/2).eq.formod(/2)) then
  2994. do lmo = 1,formod(/2)
  2995. if (formod(lmo).ne.imode1.formod(lmo)) lostat = .false.
  2996. enddo
  2997. do lmo = 1,imode1.matmod(/2)
  2998. if (matmod(lmo).ne.imode1.matmod(lmo)) lostat = .false.
  2999. enddo
  3000. else
  3001. lostat = .false.
  3002. endif
  3003. if (lostat.and.formod(1).eq.'MELANGE') then
  3004. C verifs supplementaires : les modeles de ivamod sont ils bien construi
  3005. lomela = .true.
  3006. if ((nobmod - imode1.ivamod(/1)).gt.1) lomela = .false.
  3007. if (imode1.ivamod(/1).gt.0) then
  3008. do ivm3 = 1,imode1.ivamod(/1)
  3009. IF(imode1.tymode(ivm3).eq.'IMODEL') THEN
  3010. imode3 = imode1.ivamod(ivm3)
  3011. segact imode3
  3012. ENDIF
  3013. enddo
  3014. endif
  3015. IF (nobmod.gt.1) THEN
  3016. do ivm1 = 1,(nobmod-1)
  3017. if (tymode(ivm1).eq.'IMODEL ') then
  3018. imode2 = ivamod(ivm1)
  3019. segact imode2
  3020. cc
  3021. if (imode2.ivamod(/1).ge.1) then
  3022. do ivm2 = 1,imode2.ivamod(/1)
  3023. if (imode2.tymode(ivm2).eq.'IMODEL') then
  3024. imode4 = imode2.ivamod(ivm2)
  3025. segact imode4
  3026. if (imode1.ivamod(/1).ge.1) then
  3027. do ivm3 = 1,imode1.ivamod(/1)
  3028. IF(imode1.tymode(ivm3).eq.'IMODEL') THEN
  3029. imode3 = imode1.ivamod(ivm3)
  3030. cc
  3031. lostat = .true.
  3032. C criteres de verif assez faibles ...
  3033. if (imode3.nefmod.eq.imode4.nefmod.and.
  3034. & imode3.imamod.eq.imode4.imamod.and.
  3035. & imode3.matmod(/2).eq.imode4.matmod(/2).and.
  3036. & imode3.conmod(17:24).eq.imode4.conmod(17:24).and.
  3037. & imode3.formod(/2).eq.imode4.formod(/2)) then
  3038. do lmo = 1,imode4.formod(/2)
  3039. if (imode4.formod(lmo).ne.imode3.formod(lmo)) lostat = .false.
  3040. enddo
  3041. do lmo = 1,imode4.matmod(/2)
  3042. if (imode4.matmod(lmo).ne.imode3.matmod(lmo)) lostat = .false.
  3043. enddo
  3044. else
  3045. lostat = .false.
  3046. endif
  3047. if (lostat) then
  3048. goto 75
  3049. endif
  3050. cc
  3051. ENDIF
  3052. enddo
  3053. else
  3054. lostat = .false.
  3055. endif
  3056. endif
  3057. enddo
  3058. C
  3059. else
  3060. lomela = .false.
  3061. endif
  3062.  
  3063. 75 lomela = lomela.and.lostat
  3064. endif
  3065.  
  3066. enddo
  3067. ENDIF
  3068. lostat = lomela
  3069. do ivm3 = 1,imode1.ivamod(/1)
  3070. c imode1 = imomo
  3071. IF(imode1.tymode(ivm3).eq.'IMODEL') THEN
  3072. imode3 = imode1.ivamod(ivm3)
  3073. ENDIF
  3074. enddo
  3075. endif
  3076. if (lostat) then
  3077. kbmod = kbmod + 1
  3078. tymode(nobmod) = 'IMODEL'
  3079. ivamod(nobmod) = imomo
  3080. goto 79
  3081. endif
  3082. enddo
  3083. C *** ca se passe mal
  3084. if (kbmod.ne.1) then
  3085. write(ioimp,*) ' STATIO EN DEFAUT voir notice ',kbmod,im
  3086. call erreur(251)
  3087. goto 990
  3088. endif
  3089. C ***
  3090. 79 CONTINUE
  3091. ENDDO
  3092. ENDIF
  3093.  
  3094. C : table : dupliquer modele elementaire et pointer
  3095. if (iptabm.gt.0) then
  3096. call modsta(ipmode,iptabm,ipmod1)
  3097. endif
  3098.  
  3099. ENDIF
  3100. C fin du modele STAT ddddddddddddddddddddddddddddddddddddddddddddddd
  3101.  
  3102. if (plicon.ne.0) segsup,plicon
  3103.  
  3104. C Ecriture de l'objet MODELE cree
  3105. CALL ACTOBJ('MMODEL ',IPMODE,1)
  3106. CALL ECROBJ('MMODEL ',IPMODE)
  3107. RETURN
  3108.  
  3109. C Traitement des ERREURS
  3110. 99 CONTINUE
  3111. CALL ERREUR(21)
  3112. 990 CONTINUE
  3113. DO im = 1, kmodel(/1)
  3114. imodel = kmodel(im)
  3115. IF (imodel.NE.0) SEGSUP,imodel
  3116. ENDDO
  3117. SEGSUP,MMODEL
  3118.  
  3119. if (plicon.ne.0) segsup,plicon
  3120.  
  3121. c RETURN
  3122. END
  3123.  
  3124.  
  3125.  

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