Télécharger modeli.eso

Retour à la liste

Numérotation des lignes :

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

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