caavct
C CAAVCT SOURCE CB215821 20/11/25 13:19:00 10792 SUBROUTINE CAAVCT C************************************************************************ C C MODIFICATIONS : IZDD -> IZD2 (chgt de diago) C TEST SUR MTABD C SIMPLIFICATION DES PARAMETRES DE PF500 (on passe C MTABD) C C************************************************************************ C C .Rajout de commentaires et de nouveaux messages d'erreurs en utilisant C la routine ERREUR de K2000 : F.D Juillet 96 C .Correction d'erreurs dans le cas des CHPO Centre : on teste le nom C des inconnues et on effectue le calcul pour toutes les composantes C des inconnues : P.G Aout 96 C************************************************************************ IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) -INC PPARAM -INC CCOPTIO CHARACTER*8 TYPE,TYPE1,NOM,NOMZ,TYPC,TYP0,TYPINC CHARACTER*(LOCOMP+1) NOMI1 CHARACTER*(LOCOMP) NOC,KOMP(4),NOMI,NOMIX(10) C -INC SMLENTI POINTEUR IZIPAD.MLENTI,MLH.MLENTI -INC SMCHAML -INC SMMATRIK -INC SMCHPOI POINTEUR CLIM.MCHPOI POINTEUR IPHI.MPOVAL,IPHR.MPOVAL,IPHH.MPOVAL POINTEUR IZD.MCHPOI ,IZD0.MCHPOI ,IZG.MCHPOI ,IZGD.MCHPOI POINTEUR IZDD.MPOVAL,IZDD0.MPOVAL,IZGG.MPOVAL,IZGDD.MPOVAL POINTEUR IZD2.MPOVAL,IZSS.MPOVAL,IZS.MCHPOI,IZH.MCHPOI POINTEUR IZPHI.MCHPOI -INC SMLMOTS POINTEUR MINCOG.MLMOTS -INC SMELEME POINTEUR MAH.MELEME POINTEUR MELEMI.MELEME POINTEUR IGEOM0.MELEME -INC SMLREEL -INC SMEVOLL PARAMETER (NTB=1) DIMENSION KTAB(NTB) CHARACTER*8 LTAB(NTB) DATA KOMP/'UX ','UY ','UZ ','SCAL'/ DATA LTAB /'EQEX '/ C C- Lecture des tables transmises en arguments C ------------------------------------------ IF (IRET.EQ.0)THEN WRITE(6,*)' Opérateur AVCT :' WRITE(6,*)' On attend un ensemble de table soustypes' RETURN ENDIF KIZC = KTAB(1) C C- Lecture facultative de la "cfl" C ------------------------------ IF (IRET.EQ.0) ALFA=1.D0 C C- Lecture facultative des paramètres pour les impressions de controle C ------------------------------------------------------------------- IMPR = 0 IF (IRET.EQ.0) THEN IMPR = 0 ELSEIF (NOM.EQ.'IMPR ') THEN IF (IRET.EQ.0) RETURN ENDIF C C- Récuperation des pointeurs des tables INCO et EQEX !! C- BUG dans LITABS puisque EQEX etait facultatif --> à corriger C TYPE=' ' IF(IERR.NE.0) RETURN C C- Récupération des noms d'inconnues C --------------------------------- TYPE = 'LISTMOTS' IF (IERR.NE.0) RETURN SEGACT MLMOT2 C C- Récupérations des pointeurs associés aux tables KIZD et KIZG C ------------------------------------------------------------ C (contenant la matrice "masse" diagonale et l'"incrément".) C TYPE=' ' TYPE=' ' TYPE=' ' 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 DT = 1.D0 TPS = 0.D0 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- Récupération des pointeurs associés aux tables KIZG1 et KIZS C ------------------------------------------------------------ C TYPE=' ' TYPE=' ' C C============================================================== C Boucle principale : Traitement de chaque inconnue de LISTINCO C============================================================== C DO 1 L=1,NBINC1 C C- NOMI est l'identifiant de l'inconnue dans chaque table C C C- Activation du MPOVAL de l'inconnue au temps précédant C ----------------------------------------------------- TYPE = 'CHPOINT ' IF (IERR.NE.0) RETURN NPT = IPHI.VPOCHA(/1) NC = IPHI.VPOCHA(/2) C C- Activation du terme source éventuel associé à l'inconnue NOMI C ------------------------------------------------------------- IZSS = 0 IGEOMS = 0 IF (KIZS.NE.0) THEN TYPE = 'CHPOINT ' IF (IERR.NE.0) RETURN IF (IGEOMS.NE.IGEOM0) THEN MOTERR(1: 8) = NOMI(1:4)//'KIZS' MOTERR(9:16) = NOMI(1:4)//'INCO' INTERR(1) = 1 RETURN ENDIF ENDIF C C- Identification du MPOVAL de l'inconnue au nouveau pas de temps C -------------------------------------------------------------- C (pour écrasement éventuel des valeurs du pas précédant) C IPHR = IPHI C C- Correspondance entre numérotation globale et locale C --------------------------------------------------- SEGACT IGEOM0 C C- Cas ou il y a des matrices masses non diagonales C ------------------------------------------------ IF(KIZK.NE.0)THEN TYPE=' ' MATRIK=KIZK SEGACT MATRIK NBK=IRIGEL(/2) DO 411 K=1,NBK IMATRI=IRIGEL(4,K) SEGACT IMATRI 411 CONTINUE ENDIF C C- Cas où les tables KIZD et KIZG sont données C ------------------------------------------- IF (KIZD.NE.0.AND.KIZG.NE.0) THEN C C- Recherche de la matrice "masse" diagonale associée à l'inconnue NOMI C -------------------------------------------------------------------- TYPE = ' ' IF (TYPE.NE.'CHPOINT ') THEN WRITE(6,*)'pas de matrice diagonale pour ',NOMI GOTO 1 ENDIF C C- Recherche de l'"incrément" associé à l'inconnue NOMI C ---------------------------------------------------- TYPE = ' ' IF (TYPE.NE.'CHPOINT ') THEN GOTO 1 ENDIF C C- Imposition des conditions aux limites sur l'"incrément" C ------------------------------------------------------ TYPE=' ' IF (KIZI.NE.0) THEN DO 211 I=1,NC NOC = KOMP(I) IF (NC.EQ.1) NOC=KOMP(4) TYPE = ' ' IF (TYPE.EQ.'CHPOINT') THEN IF (MPOVAL.NE.0) THEN SEGACT MELEMI SEGDES MELEMI,MPOVAL ENDIF ENDIF 211 CONTINUE ENDIF C C- Calcul de l'inconnue au nouveau pas de temps C -------------------------------------------- C- En EF C- En VF C DO 11 I=1,NC C C -------------------- Cas de des inconnues situées au Centre C -------------------------------------- IF (TYPC.EQ.'FACE') THEN TYPE=' ' IF (MTABD.EQ.0) THEN MOTERR(1: 8) = 'TABLE ' MOTERR(9:16) = 'DOMAINE ' RETURN ENDIF TYPE = 'CHPOINT ' cccc CALL ACMO(KIZD,'DIAC0',TYPE,MCHPO4) IF (IERR.NE.0) RETURN C if(I .EQ. NC) SEGDES MCHPO4,IZD2 C C -------------------- Cas de des inconnues situées au Sommet C -------------------------------------- ELSEIF (TYPC.EQ.'SOMMET') THEN IF (KIZG1.EQ.0) THEN ELSE TYPE = ' ' IF (TYPE.NE.'CHPOINT ') THEN ELSE & IZGG.VPOCHA(1,I),IPHR.VPOCHA(1,I), ENDIF ENDIF ENDIF 11 CONTINUE C C- Imposition des conditions aux limites C ------------------------------------- TYPE = ' ' IF (TYPE.EQ.'CHPOINT')THEN DO 111 I=1,NC IF (NC.EQ.1) THEN NOC=NOMI ELSE WRITE(NOC,FMT='(I1)')I NOC=NOC(1:1)//NOMI(1:LOCOMP-1) ENDIF SEGACT MCHPOI NSOUPO = IPCHP(/1) DO 10111 NSP=1,NSOUPO MSOUPO = IPCHP(NSP) SEGACT MSOUPO NCOMP = NOCOMP(/2) DO 10112 NCP=1,NCOMP IF (NOCOMP(NCP).EQ.NOC) THEN MELEMI = IGEOC MPOVAL = IPOVAL SEGACT MELEMI,MPOVAL SEGDES MELEMI,MPOVAL ENDIF 10112 CONTINUE SEGDES MSOUPO 10111 CONTINUE SEGDES MCHPOI 111 CONTINUE ENDIF C C- Mise à zero de l'ensemble des données et ménage C ----------------------------------------------- SEGDES IZG,IZGG SEGDES IZD,IZDD IF (KIZG1.NE.0.AND.IZGD.NE.0) THEN SEGDES IZGD,IZGDD ENDIF IF (KIZS.NE.0.AND.IZSS.NE.0) THEN ENDIF C -------------------------------------------------- C- Fin du cas ou les tables KIZD et KIZG sont données C -------------------------------------------------- ENDIF C C- Traitement des historiques C -------------------------- IF (MTABT.NE.0) THEN TYPE=' ' NOMIX(1) = NOMI NOMIX(2) = '1'//NOMI(1:LOCOMP-1) NOMIX(3) = '2'//NOMI(1:LOCOMP-1) NOMIX(4) = '3'//NOMI(1:LOCOMP-1) NUCR = 1 IF (NUC.GT.1) NUCR=NUC-1 TYPE = ' ' IF (TYPE.EQ.'EVOLUTIO')THEN TYPE1=' ' NOMI1='$'//NOMIX(NUC)(1:LOCOMP-1) IF (TYPE1.EQ.'MAILLAGE') THEN SEGACT MAH ENDIF CALL REDU TYPE1=' ' IF (TYPE1.EQ.'ENTIER') THEN ELSE KFIH = 20 ENDIF INDH = IPT - IPT/KFIH * KFIH IF (INDH.NE.0) GOTO 80 SEGACT MEVOLL NH=IEVOLL(/1) DO 81 IH=1,NH KEVOLL=IEVOLL(IH) SEGACT KEVOLL MLREE1=IPROGX IF (IH.EQ.1)THEN SEGACT MLREE1 SEGADJ MLREE1 SEGDES MLREE1 ENDIF MLREE2=IPROGY SEGACT MLREE2 SEGADJ MLREE2 if(ih.le.iphh.vpocha(/1)) then else endif SEGDES MLREE2,KEVOLL 81 CONTINUE SEGDES MEVOLL 80 CONTINUE SEGDES MAH ENDIF 82 CONTINUE ENDIF ELSE WRITE(6,*)' Pour des historiques il faut une table PASDETPS' ENDIF C SEGDES IPHI,IPHR SEGDES IGEOM0 SEGSUP IZIPAD 1 CONTINUE C SEGDES MLMOT2 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 IF (IPT.EQ.1) THEN WRITE(6,*) & ' IPT : NUMERO DU PAS DE TEMPS , NUEL : NUMERO DE L ELEMENT , ' &,' DIAEL : DIAMETRE MOYEN DE L ELEMENT ' WRITE(6,*) &' ALFA : TOLERANCE SUR LE PAS DE TEMPS , DTMAX : PAS DE TEMPS MAX' &,' DTT1 : PAS DE TEMPS DE CONVECTION , DTT2 PAS DE TEMPS DE' &,' DIFFUSION' ENDIF IF (IND.EQ.0)THEN WRITE(6,1011)NOMZ,NOMI WRITE(6,1010)IPT,NUEL,DIAEL,ALFA,DT,DTT1,DTT2 ENDIF ENDIF C C- Mise à jour de la table PASDETPS C -------------------------------- 800 CONTINUE IF (KIZD.NE.0.AND.KIZG.NE.0) THEN IF (MTABT.NE.0) THEN DT=1.E30 IPT = IPT + 1 ENDIF ENDIF 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) 1011 FORMAT(2X,' ZONE :',A8,' OPERATEUR :',A8) END
© Cast3M 2003 - Tous droits réservés.
Mentions légales