hybp
C HYBP SOURCE CB215821 24/04/12 21:16:18 11897 SUBROUTINE HYBP C----------------------------------------------------------------------- C Cet operateur permet de calculer la charge en fonction des traces de C charge dans le cadre d'une formulation variationnelle mixte hybride C pour les equations de DARCY. C C (n) (n-1) -1 t -1 C H = (1 - BETA) * H + (DIV * M1 * DIV) * BETA * C -1 (n) (n-1) C ( DIV * M1 * (THETA * TH + (1-THETA) * TH - M * F) + SOUR ) C C--------------------------- C Phrase d'appel (GIBIANE) : C--------------------------- C C CHPO1 = HYBP MMODEL MRIGI1 CHPO2 (TABLE2) (CHPO3) (MRIGI2 CHPO4); C C------------------------ C Operandes et resultat : C------------------------ C C CHPO1 : CHPO centre de nom de composante H. C MRIGI1 : RIGIDITE masses hybrides élémentaires de sous-type DARCY. C MRIGI2 : Matrices masses hybrides elementaires de sous-type MASSE. C MMODEL : MODELE spécifiant la formulation. C CHPO2 : CHPO face de nom de composante TH. C TABLE2 : TABLE DARCY_TRANSITOIRE a inclure en transitoire; contient C Theta, le pas de temps, Ck|K|, TH(n-1) et H(n-1). C CHPO3 : CHPO centre de nom de composante SOUR. C CHPO4 : CHPO centre de composante FX,FY(,FZ), C densite de force moyenne par élément. C C----------------------------------------------------------------------- C C Langage : ESOPE + FORTRAN77 C C Auteurs : 09/93 F.DABBENE - Cas permanent C 09/94 X.NOUVELLON - Extension au cas transitoire C 02/96 L.V.BENET - Prise en compte de forces de volume C C----------------------------------------------------------------------- IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) * -INC PPARAM -INC CCOPTIO -INC SMCHAML -INC SMCHPOI -INC SMELEME -INC SMMODEL -INC SMRIGID -INC SMTABLE * SEGMENT IPMAHY INTEGER MAHYBR(NSOUS) ENDSEGMENT * LOGICAL LOGRE,LOGIN CHARACTER*4 NOMTOT(1) CHARACTER*4 NOMTO3(3) CHARACTER*6 CHAR6 CHARACTER*8 TAPIND,TYPOBJ,CHARIN,CHARRE,LETYPE * * Initialisations * IVALIN = 0 XVALIN = 0.D0 LOGIN = .TRUE. IOBIN = 0 TAPIND = 'MOT ' * * Lecture du MMODEL et test de la formulation * IF (IERR.NE.0) RETURN MMODEL = IPMODE * * Lecture de la TABLE domaine * IPTABL = 0 C CALL LIRTAB('DOMAINE',IPTABL,1,IRET) IF (IERR.NE.0) RETURN CHARIN = 'MAILLAGE' IF (IERR.NE.0) RETURN IPGEOM = IOBRE CHARIN = 'ELTFA' IF (IERR.NE.0) RETURN IELTFA = IOBRE CHARIN = 'CENTRE' IF (IERR.NE.0) RETURN ICENTR = IOBRE CHARIN = 'FACE' IF (IERR.NE.0) RETURN IPFACE = IOBRE * * récup. MCHAML orientation normale * IF (IERR.NE.0) RETURN * * récup. CHPO orientation normale * IF (IERR.NE.0) RETURN * * récup. CHPO surface des faces * IF (IERR.NE.0) RETURN * * Lecture de RIGIDITE obligatoire * IF (IERR.NE.0) RETURN RI1 = IPRIGI * * Lecture du CHAMPOINT obligatoire * IF (IERR.NE.0) RETURN * * Lecture eventuelle du 1er CHAMPOINT optionnel * ICHP1 = 0 IF (IERR.NE.0) RETURN * * Lecture eventuelle du 2me CHAMPOINT optionnel * ICHP2 = 0 IF (IERR.NE.0) RETURN * * Lecture de la RIGIDITE complementaire * IPRIGI = 0 IF (IERR.NE.0) RETURN RI2 = IPRIGI * * Lecture éventuelle de la TABLE Darcy_transitoire * IPTABL = 0 IF (IERR.NE.0) RETURN IF (IRET.EQ.1) THEN TYPOBJ = 'FLOTTANT' S TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,IOBRE) IF (IERR.NE.0) RETURN THETA = XVALRE THEMIN = -1.D-12 THEMAX = 1.D0 - THEMIN REAERR(2) = REAL(0.D0) REAERR(3) = REAL(1.D0) MOTERR(1:8) = ' THETA ' RETURN ENDIF S TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,IOBRE) IF (IERR.NE.0) RETURN DELTAT = XVALRE IF (DELTAT.LT.0.D0) THEN REAERR(1) = REAL(DELTAT) REAERR(2) = REAL(0.D0) MOTERR(1:8) = ' DELTAT ' RETURN ENDIF TYPOBJ = 'MCHAML ' S TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,IOBRE) IF (IERR.NE.0) RETURN IPCK = IOBRE TYPOBJ = 'CHPOINT ' S TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,IOBRE) IF (IERR.NE.0) RETURN ITP = IOBRE S TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,IOBRE) IF (IERR.NE.0) RETURN IH = IOBRE ELSE DELTAT = 0.D0 IPCK = 0 ITP = 0 IH = 0 ENDIF * * Test CHAMPOINT centre H * IF (IH.NE.0) THEN NOMTOT(1) = 'H' IF (IERR.NE.0) RETURN ENDIF * (n-1) * Test du CHAMPOINT face TH * IF (ITP.NE.0) THEN NOMTOT(1) = 'TH' IF (IERR.NE.0) RETURN ENDIF * * Test de la formulation contenu dans MMODEL * SEGACT MMODEL NSOUS = KMODEL(/1) SEGINI IPMAHY IDARCY = 0 IPT1=IPGEOM IPT2=IPGEOM DO 10 ISOUS=1,NSOUS IF(NSOUS.GT.1)THEN SEGACT IPT2 IPT1= IPT2.LISOUS(ISOUS) ENDIF IMODEL = KMODEL(ISOUS) SEGACT IMODEL LETYPE = FORMOD(1) IF (LETYPE.EQ.'DARCY') THEN IDARCY = IDARCY + 1 MAHYBR(ISOUS) = IPT1 ENDIF 10 CONTINUE IF (IDARCY.EQ.0) THEN MOTERR = LETYPE GOTO 100 ENDIF * * Tri et test des CHAMPOINTs ARGUMENTS * ISOUR=0 IFORC=0 IF(IRET1.EQ.1)THEN NOMTO3(1) = ' ' NOMTO3(2) = ' ' NOMTO3(3) = ' ' IF (IERR.NE.0) RETURN IF(NOMTO3(1).EQ.'SOUR')THEN ISOUR=ICHP1 ELSE IF(NOMTO3(1).EQ.'FX')THEN IFORC=ICHP1 ENDIF IF(IRET2.EQ.1)THEN NOMTO3(1) = ' ' NOMTO3(2) = ' ' NOMTO3(3) = ' ' IF (IERR.NE.0) RETURN IF(NOMTO3(1).EQ.'SOUR')THEN ISOUR=ICHP2 ELSE IF(NOMTO3(1).EQ.'FX')THEN IFORC=ICHP2 ENDIF ENDIF ENDIF * * Récuperation des pointeurs ELTFA pour les zones ou DARCY est defini * MELEME = IELTFA SEGACT MELEME LZONES = LISOUS(/1) IF (LZONES.EQ.0) LZONES = 1 IPT4 = IPGEOM SEGACT IPT4 DO 30 ISOUS=1,NSOUS IMAMEL = MAHYBR(ISOUS) IF (IMAMEL.NE.0) THEN DO 20 ISZ=1,LZONES IF (LZONES.EQ.1) THEN IPT2 = IPT4 IPT3 = MELEME ELSE IPT2 = IPT4.LISOUS(ISZ) IPT3 = LISOUS(ISZ) ENDIF IF (IPT2.EQ.IMAMEL) THEN MAHYBR(ISOUS) = IPT3 GOTO 30 ENDIF 20 CONTINUE IF (IMAMEL.EQ.MAHYBR(ISOUS)) THEN MOTERR(1:8) = ' MODELE ' MOTERR(9:16) = ' ELTFA ' INTERR(1) = ISOUS GOTO 100 ENDIF ENDIF 30 CONTINUE * * Test et tri du sous-type des matrices de rigiditée récupérées * IPFORC=0 IPDARC=0 SEGACT RI1 LETYPE = RI1.MTYMAT IF(LETYPE.EQ.'DARCY')THEN IPDARC=RI1 ELSE IF(LETYPE.EQ.'MASSE')THEN IPFORC=RI1 ENDIF IF(RI2.NE.0)THEN SEGACT RI2 LETYPE = RI2.MTYMAT IF(LETYPE.EQ.'MASSE')THEN IPFORC=RI2 ELSE IF(LETYPE.EQ.'DARCY')THEN IPDARC=RI2 ENDIF IF(IPFORC.EQ.0)THEN MOTERR(1:8) = 'RIGIDITE' MOTERR(9:16) = 'MASSE' SEGDES RI1 SEGDES RI2 GOTO 100 ELSE IF(IFORC.EQ.0)THEN MOTERR(1:8) = 'CHPOINT' MOTERR(9:16) = 'FORCE' SEGDES RI1 SEGDES RI2 GOTO 100 ENDIF ENDIF IF(IPDARC.EQ.0)THEN MOTERR(1:8) = 'RIGIDITE' MOTERR(9:16) = 'DARCY' SEGDES RI1 IF(IPFORC.NE.0)SEGDES RI2 GOTO 100 ENDIF * * Controle des pointeurs de MELEME de la rigidité * DO 40 ISOUS=1,NSOUS IMAMEL = MAHYBR(ISOUS) IF (IMAMEL.NE.0) THEN RI1=IPDARC IPTEST = RI1.IRIGEL(1,ISOUS) IF (.NOT. LOGRE) THEN MOTERR(1:8) = 'DARCY' MOTERR(9:16) = ' ELTFA ' INTERR(1) = ISOUS SEGDES RI1 GOTO 100 ENDIF IF(IPFORC.NE.0)THEN RI2=IPFORC IPTEST = RI2.IRIGEL(1,ISOUS) IF (.NOT. LOGRE) THEN MOTERR(1:8) = 'MASSE' MOTERR(9:16) = ' ELTFA ' INTERR(1) = ISOUS SEGDES RI1 SEGDES RI2 GOTO 100 ENDIF ENDIF ENDIF 40 CONTINUE SEGDES RI1 IF(IPFORC.NE.0)SEGDES RI2 * * Vérification du support du MCHAML Ck|K| % au MMODEL * Controle du nombre de composantes reelles * IF (IPCK.NE.0) THEN ISUP = 2 ICOND = 1 IF (IRET.GT.1) GOTO 100 MCHELM = IPCK SEGACT MCHELM DO 50 ISOUS=1,NSOUS IF (MAHYBR(ISOUS).NE.0) THEN MCHAML = ICHAML(ISOUS) SEGACT MCHAML N2 = TYPCHE(/2) IF (N2.GT.1) THEN GOTO 100 ENDIF CHAR6 = TYPCHE(1)(1:6) IF (CHAR6.NE.'REAL*8') THEN MOTERR(1:8) = NOMCHE(1) GOTO 100 ENDIF ENDIF 50 CONTINUE ENDIF * (n) * Test du CHAMPOINT face TH * On ne teste que la présence d'une composante de nom TH * MCHPO1 = ITPN SEGACT MCHPO1 NSOUP1 = MCHPO1.IPCHP(/1) DO 70 ISOUS=1,NSOUP1 MSOUPO = MCHPO1.IPCHP(ISOUS) SEGACT MSOUPO NC = NOCOMP(/2) DO 60 J=1,NC IF (NOCOMP(J).EQ.'TH ') GOTO 80 60 CONTINUE 70 CONTINUE MOTERR(1:4) = ' TH ' GOTO 100 80 CONTINUE * * Construction du CHPO des charges * SEGDES IPMAHY S ISURF,THETA,DELTAT,IPCK,ITP,IH,ISOUR,IPFORC,IFORC,ICHP1) IF (ICHP1.NE.0) THEN ENDIF * * Ménage * 100 CONTINUE SEGSUP IPMAHY END
© Cast3M 2003 - Tous droits réservés.
Mentions légales