tcnm
C TCNM SOURCE CB215821 20/11/25 13:40:44 10792 SUBROUTINE TCNM C----------------------------------------------------------------------- C Mise à jour des CHPOINTs à l'occasion du changement de pas de temps. C----------------------------------------------------------------------- C Les tables de sous type KIZX associées à l'opérateur DFDT permettent C d'effectuer la mise à jour. Pour chaque opérateur DFDT, selon la C syntaxe ayant été utilisée C 1) si l'objet pointé à l'indice ARG2 de la table associée à C l'opérateur DFDT considéré est un CHPOINT on l'update ou C 2) on récupere à l'indice ARG2 de la table associée à DFDT le nom C associé à l'inconnue à updater dans la table INCO et on update le C CHPOINT dans INCO. C C--------------------------- C Phrase d'appel (GIBIANE) : C--------------------------- C C IRT = TCNM TAB1 ; C C------------------------ C Opérandes et résultat : C------------------------ C C TAB1 : TABLE de sous type EQEX contenant l'ensemble des données pour C la modélisation. C C IRT : = 1 Temps final atteint = 0 sinon C C---------------------------- C Indices de table modifiés : C---------------------------- C C Indice ARG2 des tables DFDT si ISYNT=1. C Indices de la table INCO alias du nom des inconnues à traiter sinon. C C---------------------- C Variables principales C---------------------- C C ISYNT : Flag indiquant le type de syntaxe utilisé C MTAB1 : Pointeur vers la table de sous type EQEX C MTAB2 : Pointeur vers la table INCO C MTABLE : Pointeur vers une table associée à un opérateur (DFDT...) C C----------------------------------------------------------------------- IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) CHARACTER*8 NOMZ,TYPE,NOMINC,TYP2,NOM,NOMA,NOMA2,TYPE1 CHARACTER*8 NOMIX(10),NOMI1,TYP0 LOGICAL ZHIST2 C -INC PPARAM -INC CCOPTIO -INC SMLMOTS -INC SMCHPOI POINTEUR IPHI.MPOVAL,IPHH.MPOVAL -INC SMLCHPO -INC SMELEME POINTEUR MAH.MELEME POINTEUR IGEOM0.MELEME -INC SMLREEL -INC SMLENTI -INC SMEVOLL C PARAMETER (NTB=1) DIMENSION KTAB(NTB) CHARACTER*8 LTAB(NTB) DATA LTAB /'EQEX '/ C C- Lecture de la table de sous type EQEX C NTO = 1 IF (IRET.EQ.0) RETURN MTAB1 = KTAB(1) IUPDT=1 IF(LCHAR.NE.0.AND.NOM.EQ.'NOUP')THEN IUPDT=0 ENDIF C C- Appel ancien TCNM C IF(NASTOK.EQ.0)THEN RETURN ENDIF C C- Lecture de la table INCO C TYPE = 'TABLE ' IF (IERR.NE.0) RETURN C C- Récupération du LISTMOTS à l'indice 'LISTOPER' de la table EQEX C TYPE = 'LISTMOTS' IF (IERR.NE.0) RETURN SEGACT MLMOTS IF (NBIND.GE.1000) THEN INTERR(1) = 1000 ENDIF C C- Initialisation des données temporelles C -------------------------------------- TYPE=' ' IF (MTABT.NE.0) THEN IF (IERR.NE.0) RETURN IF (IERR.NE.0) RETURN IF (IERR.NE.0) RETURN ELSE C? DT = 1.D0 C? TPS = 0.D0 C? IPT = 1 ENDIF DT = DT * ALFA IFINAL=0 TPS1 = TPS + DT C write(6,*)' TPS=',tps,' TFINAL=',tfinal,' DT=',dt IF(TPS.GT.TFINAL)THEN IFINAL=1 GO TO 800 ELSEIF(TPS1.GT.TFINAL)THEN DT=TFINAL-TPS IFINAL=1 ENDIF TPS = TPS + DT C C- Doit-on sauvegarder des CHPOINT ? C --------------------------------- ZHIST2=.FALSE. TYPE=' ' IF (TYPE.EQ.'TABLE'.AND.KHIS2.NE.0) THEN * INDICE DE DEBUT DE SAUVEGARDE ? TYPE=' ' & TYPE,IDEB1,XVAL,BLAN,XLOGI,IRET) IF (TYPE.EQ.' ') IDEB1=0 IF (IPT.LT.IDEB1) GOTO 51 * INDICE DE FIN DE SAUVEGARDE ? TYPE=' ' & TYPE,IFIN1,XVAL,BLAN,XLOGI,IRET) IF (IPT.GT.IFIN1) GOTO 51 * PAS DE SAUVEGARDE ? TYPE=' ' & TYPE,IPAS1,XVAL,BLAN,XLOGI,IRET) IF (TYPE.EQ.' ') IPAS1=1 IF (MOD(IPT-IDEB1,IPAS1).NE.0) GOTO 51 ZHIST2=.TRUE. * AJOUT DU TEMPS COURANT A L'INDICE 'TPS' TYPE = ' ' IF (TYPE.EQ.'LISTREEL') THEN SEGACT,MLREEL * ON AJOUTE AUSSI LE TEMPS INITIAL SI BESOIN IF (IDEB1.EQ.0.AND.IPT.EQ.1) THEN SEGADJ,MLREEL ELSE SEGADJ,MLREEL ENDIF ENDIF ENDIF 51 CONTINUE C C- Recherche de l'ensemble des champs à mettre à jour via DFDT C DO 10 K=1,NBIND IF (NOMA(1:4).EQ.'DFDT') THEN IF (K.LT.10) THEN WRITE(NOMA2,FMT='(I1,A7)') K,NOMA(1:7) ELSE WRITE(NOMA2,FMT='(I2,A6)') K,NOMA(1:6) ENDIF TYPE = ' ' IF (TYPE.EQ.'TABLE') THEN C C- Caractérisation de la syntaxe de DFDT : le champoint contenant C- les valeurs de l'inconnue au pas de temps précédant se trouve C- ISYNT =1 -> Dans la table DFDT MTABLE C- ISYNT =2 -> Dans la table INCO MTAB2 C TYPE = ' ' IF(ISCHT.EQ.1.OR.ISCHT.EQ.2)THEN C C- Récupération du nom de l'indice de la table INCO contenant C- le CHPOINT au temps précédent N. C TYPE = ' ' IF (IERR.NE.0) RETURN IF (TYPE.EQ.'CHPOINT ') THEN ISYNT = 1 ELSEIF (TYPE.EQ.'MOT ') THEN ISYNT = 2 IF (IERR.NE.0) RETURN TYP2 = 'CHPOINT ' IF (IERR.NE.0) RETURN ELSE MOTERR( 1: 8) = NOMA MOTERR( 9:16) = 'ARG2 ' MOTERR(17:30) = 'CHPOINT ou MOT' RETURN ENDIF C C Récupération du nom de l'indice de la table INCO contenant le C point au 2eme temps précédent N-1. C TYPE = ' ' IF (IERR.NE.0) RETURN IF (TYPE.EQ.'CHPOINT ') THEN ISYNT = 1 ELSEIF (TYPE.EQ.'MOT ') THEN ISYNT = 2 IF (IERR.NE.0) RETURN TYP2 = 'CHPOINT ' IF (IERR.NE.0) RETURN ELSE MOTERR( 1: 8) = NOMA MOTERR( 9:16) = 'ARG3 ' MOTERR(17:30) = 'CHPOINT ou MOT' RETURN ENDIF C C- Duplication du CHPOINT contenant l'inconnue au temps N vers N-1 C IF(IUPDT.EQ.1)THEN * gounand 07/12/2012 : dans TCRR, on change de stratégie et on crée un * chpoint tout neuf, cela permet d'éviter les appels à COPIER dans TCNM * et dans les procédures utilisateurs. On pourra aussi se référer au * pointeur pour préconditionner. * CALL ECROBJ('CHPOINT',MCHPI) * CALL COPIER * CALL LIROBJ('CHPOINT',MCHPOI,1,IRET) MCHPOI=MCHPI C C- Update du CHPOINT contenant l'inconnue au temps précédant C IF (ISYNT.EQ.1) THEN ELSE ENDIF ENDIF ENDIF C C- Récupération du nom de l'indice de la table INCO contenant C- le CHPOINT au temps courant N+1 (donc près calcul). C TYPE = 'LISTMOTS' IF (IERR.NE.0) RETURN SEGACT MLMOT1 C C- Récupération du pointeur du CHPOINT dans la table INCO à l'instant N. C TYPE = 'CHPOINT ' IF (IERR.NE.0) RETURN TYPE = ' ' IF (IERR.NE.0) RETURN IF (TYPE.EQ.'CHPOINT ') THEN ISYNT = 1 ELSEIF (TYPE.EQ.'MOT ') THEN ISYNT = 2 IF (IERR.NE.0) RETURN TYP2 = 'CHPOINT ' IF (IERR.NE.0) RETURN ELSE MOTERR( 1: 8) = NOMA MOTERR( 9:16) = 'ARG2 ' MOTERR(17:30) = 'CHPOINT ou MOT' RETURN ENDIF C C- Duplication du CHPOINT contenant l'inconnue au temps courant N+1 vers N C IF(IUPDT.EQ.1)THEN * gounand 07/12/2012 : dans TCRR, on change de stratégie et on crée un * chpoint tout neuf, cela permet d'éviter les appels à COPIER dans TCNM * et dans les procédures utilisateurs. On pourra aussi se référer au * pointeur pour préconditionner. * CALL ECROBJ('CHPOINT',MCHPI) * CALL COPIER * CALL LIROBJ('CHPOINT',MCHPOI,1,IRET) MCHPOI=MCHPI C C- Update du CHPOINT contenant l'inconnue au temps précédant C IF (ISYNT.EQ.1) THEN ELSE ENDIF ENDIF ENDIF C C- Activation du MPOVAL de l'inconnue au temps précédant C ----------------------------------------------------- C C- Traitement des historiques C -------------------------- IF (MTABT.NE.0) THEN * SAUVEGARDE D'UNE VALEUR PONCTUELLE TYPE=' ' * * POUR RETROCOMPATIBILITE, ON TOLERE L'UTILISATION DU * MOT-CLE 'KFIH' (JAMAIS DOCUMENTE NULLE PART...) A LA * PLACE DE 'NISTO' TYPE1=' ' IF (TYPE1.EQ.'ENTIER') THEN ELSE TYPE=' ' & TYPE,NISTO,XVAL,BLAN,XLOGI,IRET) ENDIF IF (IERR.NE.0) RETURN IF (NISTO.LE.0.OR.MOD(IPT-1,NISTO).NE.0) GOTO 83 NOMIX(1) = NOMINC NOMIX(2) = '1'//NOMINC(1:7) NOMIX(3) = '2'//NOMINC(1:7) NOMIX(4) = '3'//NOMINC(1:7) NUCR = 1 IF (NUC.GT.1) NUCR=NUC-1 TYPE = ' ' IF (TYPE.EQ.'EVOLUTIO')THEN TYPE1=' ' NOMI1='$'//NOMIX(NUC) IF (TYPE1.EQ.'MAILLAGE') THEN SEGACT MAH ELSE RETURN ENDIF CALL REDU SEGACT MEVOLL,MAH NH=MAH.NUM(/2) DO 81 IH=1,NH KEVOLL=IEVOLL(IH) SEGACT KEVOLL MLREE1=IPROGX IF (IH.EQ.1)THEN SEGACT MLREE1 SEGADJ MLREE1 ENDIF MLREE2=IPROGY SEGACT MLREE2 SEGADJ MLREE2 IH1=LECT(MAH.NUM(1,IH)) C write(6,*)' IH,IH1,NUCR=',IH,IH1,NUCR,JG IF(IH1.EQ.0)THEN ELSE ENDIF 81 CONTINUE 80 CONTINUE SEGSUP MLENTI ENDIF 82 CONTINUE ENDIF * SAUVEGARDE DU CHPOINT COMPLET 83 CONTINUE IF (ZHIST2) THEN IF (MOD(IPT-IDEB1,IPAS1).NE.0) GOTO 84 TYPE = ' ' IF (TYPE.EQ.'LISTCHPO') THEN SEGACT,MLCHPO * ON AJOUTE AUSSI LE CHPOINT INITIAL SI BESOIN IF (IDEB1.EQ.0.AND.IPT.EQ.1) THEN N1=ICHPOI(/1)+2 SEGADJ,MLCHPO ICHPOI(N1-1)=MCHPN ELSE N1=ICHPOI(/1)+1 SEGADJ,MLCHPO ENDIF * ON AJOUTE LE CHPOINT COURANT ICHPOI(N1)=MCHPI ENDIF ENDIF ELSE WRITE(IOIMP,*)' Pour des historiques il faut une table PASDETPS' ENDIF C 84 CONTINUE C ENDIF 10 CONTINUE C C C- Impressions de controle C ----------------------- IF (IMPR.NE.0) THEN KFIDT = IMPR IF (MTABT.NE.0) THEN ELSE IPT=1 ENDIF IND = IPT - IPT/KFIDT * KFIDT C write(6,*)' TCNM NOMZ=',NOMZ IF(NOMZ(1:4).NE.'EQEX')THEN IF (IPT.EQ.1) THEN WRITE(IOIMP,*) & ' IPT : NUMERO DU PAS DE TEMPS , NUEL : NUMERO DE L ELEMENT , ' &,' DIAEL : DIAMETRE MOYEN DE L ELEMENT ' WRITE(IOIMP,*) &' ALFA : TOLERANCE SUR LE PAS DE TEMPS , DTMAX : PAS DE TEMPS MAX' &,' DTT1 : PAS DE TEMPS DE CONVECTION , DTT2 : PAS DE TEMPS DE' &,' DIFFUSION ' WRITE(IOIMP,*) ' TPS : TEMPS CUMULE' ENDIF IF (IND.EQ.0)THEN WRITE(IOIMP,1011)NOMZ,NOMINC WRITE(IOIMP,1010)IPT,NUEL,DIAEL,ALFA,DT,DTT1,DTT2,TPS ENDIF ELSE IF (IPT.EQ.1) THEN WRITE(IOIMP,*) ' PAS DE TEMPS IMPOSE : DT , ', & ' IPT : NUMERO DU PAS DE TEMPS , TPS : TEMPS CUMULE' ENDIF IF (IND.EQ.0)THEN WRITE(IOIMP,1012)IPT,DT,TPS ENDIF ENDIF ENDIF C C- Mise à jour de la table PASDETPS C -------------------------------- 800 CONTINUE C??? IF (KIZD.NE.0.AND.KIZG.NE.0) THEN IF (MTABT.NE.0) THEN IF(IUPDT.EQ.1)THEN DT=1.D30 IPT = IPT + 1 ENDIF ENDIF C??? ENDIF C C- Désactivation et ménage C RETURN C C- Formats associés aux impression de controle C ------------------------------------------- 1010 FORMAT(2X,'N.DT',I5,' NU.EL',I5,' DIAEL=',1PE11.4,' ALFA=', & 1PE11.4,' DTMAX=',1PE11.4, & ' DT1=',1PE11.4,' DT2=',1PE11.4,' TPS=',1PE11.4) 1011 FORMAT(2X,' ZONE :',A8,' OPERATEUR :',A8) 1012 FORMAT(2X,'N.DT',I5,' DT=',1PE11.4,' TPS=',1PE11.4) END
© Cast3M 2003 - Tous droits réservés.
Mentions légales