yla1bt
C YLA1BT SOURCE CB215821 20/11/25 13:43:59 10792 C YLAP1B SOURCE LEPOTIER 02/12/17 21:19:20 4510 $ MPVOLU,MPNORM,MPSURF,MELEFL, $ KRFACE,KRCENT,LCLIMT,KRTIMP,LCLIMQ,KRQIMP, $ LMIXT,KRMIXT,IJACO, $ IMPR,IRET) IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) C*********************************************************************** C NOM : YLA1BT C DESCRIPTION : Calcul de la matrice jacobienne du résidu du laplacien C VF 2D. C Ici, on ne calcule que les contributions à la matrice C jacobienne faisant intervenir les coefficients pour le C calcul des gradients de température (ICOGRT). C (contributions à d Res_{\rho e_t} / d var C var prenant successivement les valeurs : C \rho, \rho u, \rho v, \rho e_t) C C C C C LANGAGE : ESOPE C AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF) C mél : gounand@semt2.smts.cea.fr C*********************************************************************** C APPELES (UTIL) : AJMTK : ajoute un objet de type MATSIM (non C standard) à un objet de type MATRIK. C APPELE PAR : YLAP1A : Calcul de la matrice jacobienne du C résidu du laplacien VF 2D. C*********************************************************************** C ENTREES : ICOGRT (type MCHELM) : coefficients pour le C calcul du gradient de la température aux C interfaces. C MPROC (type MPOVAL) : masse volumique par C élément. C MPVITC (type MPOVAL) : vitesse par élément. C MPTEMC (type MPOVAL) : température par élément. C MPVOLU (type MPOVAL) : volume des éléments. C MPNORM (type MPOVAL) : normale aux faces. C MPSURF (type MPOVAL) : surface des faces. C MELEFL (type MELEME) : connectivités face-(centre C gauche, centre droit). C KRFACE (type MLENTI) : tableau de repérage dans C le maillage des faces des éléments. C KRCENT (type MLENTI) : tableau de repérage dans C le maillage des centres des éléments. C LCLIMT (type logique) : .TRUE. => CL de Dirichlet C sur la température. C KRTIMP (type MLENTI) : tableau de repérage dans C maillage des CL de Dirichlet sur la C température. C LCLIMQ (type logique) : .TRUE. => CL de Dirichlet C sur le flux de chaleur. C KRTIMP (type MLENTI) : tableau de repérage dans C maillage des CL de Dirichlet sur la C température. C KRQIMP (type MLENTI) : tableau de repérage dans C maillage des CL de Dirichlet sur le flux de C chaleur. C LMIXT (type logique) : .TRUE. => CL mixtes C KRMIXT (type MLENTI) : tableau de repérage dans C maillage des CL mixtes. C NOMINC (type MLMOTS) : noms des inconnues. C ICLAU : option pour ne calculer C que la thermique C KAPPA (type réel) : conductivité thermique (SI) C CV (type réel) : chaleur spécifique à volume C constant (SI). C ENTREES/SORTIES : IJACO (type MATRIK) : matrice jacobienne du C résidu du laplacien VF 2D. C SORTIES : - C CODE RETOUR (IRET) : = 0 si tout s'est bien passé C*********************************************************************** C VERSION : v1, 08/08/2001, version initiale C HISTORIQUE : v1, 08/08/2001, création C HISTORIQUE : 11/02/2003, ajout de l'option 'MIXT' C HISTORIQUE : C*********************************************************************** C Prière de PRENDRE LE TEMPS de compléter les commentaires C en cas de modification de ce sous-programme afin de faciliter C la maintenance ! C*********************************************************************** -INC PPARAM -INC CCOPTIO -INC SMCHPOI POINTEUR MPROC.MPOVAL ,MPVITC.MPOVAL,MPTEMC.MPOVAL POINTEUR MPSURF.MPOVAL,MPNORM.MPOVAL,MPVOLU.MPOVAL -INC SMCHAML POINTEUR ICOGRT.MCHELM,JCOGRT.MCHAML POINTEUR KCDTDX.MELVAL,KCDTDY.MELVAL -INC SMELEME POINTEUR MELEFL.MELEME POINTEUR MCOGRT.MELEME -INC SMLENTI POINTEUR KRTIMP.MLENTI,KRQIMP.MLENTI,KRMIXT.MLENTI POINTEUR KRCENT.MLENTI,KRFACE.MLENTI -INC SMLMOTS POINTEUR NOMINC.MLMOTS -INC SMMATRIK POINTEUR IJACO.MATRIK * * Objet matrice élémentaire simplifié * SEGMENT GMATSI INTEGER POIPR1(NPP1,NEL1) INTEGER POIDU1(1,NEL1) INTEGER POIPR2(NPP2,NEL2) INTEGER POIDU2(2,NEL2) POINTEUR LMATSI(0).MATSIM ENDSEGMENT * Contributions de la part du gradient de température (CTGRT) POINTEUR CTGRT.GMATSI SEGMENT MATSIM CHARACTER*8 NOMPRI,NOMDUA REAL*8 VALMA1(1,NPP1,NEL1) REAL*8 VALMA2(2,NPP2,NEL2) ENDSEGMENT POINTEUR RETRET.MATSIM * REAL*8 KAPPA,CV * INTEGER IMPR,IRET,ICLAU * LOGICAL LCLIMT,LCLIMQ,LMIXT LOGICAL LMUR LOGICAL LCTRB1,LCTRB2 * INTEGER IELEM,IPD,IPP,ISOUCH,IEL1,IEL2 INTEGER NELEM,NPD,NPP,NSOUCH,NEL1,NEL2,NPP1,NPP2 INTEGER NGCDRO,NGCGAU,NGFACE,NPPRIM,NPDUAL INTEGER NLCENP,NLCEND,NLFACE,NLCLQ,NLCLT INTEGER NPTEL * REAL*8 BETAX,BETAY,CNX,CNY REAL*8 SIGNOR,SURFFA,VOLUEL REAL*8 RHOP,UP,VP,TP REAL*8 FACTOR REAL*8 DTDRHO,DTDROU,DTDROV,DTDRET C * * Executable statements * IF (IMPR.GT.2) WRITE(IOIMP,*) 'Entrée dans ylap1b.eso' * On calcule la partie de d Res_{\rho e_t} / d var * (var prend successivement les valeurs : * \rho, \rho u, \rho v, \rho e_t) * faisant intervenir les coefficients pour le calcul des gradients de * température (ICOGRT). * C'est la partie contenant le terme : - \vect{q} \pscal \vect{n} * Les noms de matrices élémentaires (type MATSIM) associées sont : * RETRHO, RETROU, RETROV, RETRET IF (LCLIMT) THEN SEGACT KRTIMP ENDIF IF (LCLIMQ) THEN SEGACT KRQIMP ENDIF IF (LMIXT) THEN SEGACT KRMIXT ENDIF SEGACT KRCENT SEGACT KRFACE SEGACT MELEFL SEGACT MPSURF SEGACT MPNORM SEGACT MPVOLU SEGACT MPTEMC SEGACT ICOGRT NSOUCH=ICOGRT.IMACHE(/1) DO 1 ISOUCH=1,NSOUCH MCOGRT=ICOGRT.IMACHE(ISOUCH) JCOGRT=ICOGRT.ICHAML(ISOUCH) SEGACT JCOGRT KCDTDX=JCOGRT.IELVAL(1) SEGDES JCOGRT SEGACT KCDTDX SEGACT MCOGRT NELEM=MCOGRT.NUM(/2) NPTEL=MCOGRT.NUM(/1) NPP1=NPTEL-1 NPP2=NPTEL-1 NEL1=NELEM NEL2=NELEM IEL1=1 IEL2=1 c BOUCLE POUR EVALUER LE NOMBRE DE FACES FRONTIERES c POUR CHAQUE SOUS DOMAINE NFRON = 1 DO 1200 IELEM=1,NELEM NGFACE=MCOGRT.NUM(1,IELEM) NLFACE=KRFACE.LECT(NGFACE) IF (NLFACE.EQ.0) THEN WRITE(IOIMP,*) 'Erreur de programmation n1' GOTO 9999 ENDIF NGCGAU=MELEFL.NUM(1,NLFACE) NGCDRO=MELEFL.NUM(3,NLFACE) IF ( NGCGAU.EQ.NGCDRO) THEN NFRON = NFRON + 1 ENDIF 1200 CONTINUE c WRITE(6,*) 'NFRON= ',NFRON NEL1 = NFRON c WRITE(6,*) 'NPP1= ',NPP1,'NPP2= ',NPP2 c WRITE(6,*) 'NEL1= ',NEL1,'NEL2= ',NEL2 SEGINI RETRET SEGINI CTGRT RETRET.NOMPRI(1:4)='RETN' RETRET.NOMPRI(5:8)=' ' RETRET.NOMDUA(1:4)='RETN' RETRET.NOMDUA(5:8)=' ' DO 12 IELEM=1,NELEM * Le premier point du support de ICOGRT est un point FACE NGFACE=MCOGRT.NUM(1,IELEM) NLFACE=KRFACE.LECT(NGFACE) IF (NLFACE.EQ.0) THEN WRITE(IOIMP,*) 'Erreur de programmation n1' GOTO 9999 ENDIF * On calcule la contribution à la matrice jacobienne IJACO de la face * NGFAC (points duaux : centres à gauche et à droite de la face) * (points primaux : une partie (bicoz conditions aux limites) * de ceux du stencil pour le calcul du gradient * à la face, ils doivent être des points centres) * Si le flux de chaleur sur la face est imposé par les conditions * aux limites, la contribution de la face à IJACO est nulle. LCTRB1=.TRUE. c IF (LCLIMQ) THEN c NLCLQ=KRQIMP.LECT(NGFACE) c IF (NLCLQ.NE.0) THEN c LCTRB1=.FALSE. c ENDIF c ENDIF * WRITE(6,*) 'NGFACE= ',NGFACE,'LCTRB1= ', LCTRB1 IF (LCTRB1) THEN NGCGAU=MELEFL.NUM(1,NLFACE) NGCDRO=MELEFL.NUM(3,NLFACE) LMUR=(NGCGAU.EQ.NGCDRO) * On distingue le cas où la face est un bord du maillage (mur) * du cas où la face est interne au maillage IF (.NOT.LMUR) THEN NPD=2 ELSE NPD=1 ENDIF NPP=NPTEL-1 * IPD=1 : point à gauche du point NGFACE * IPD=2 : point à droite du point NGFACE DO 122 IPD=1,NPD NPDUAL=MELEFL.NUM((2*IPD)-1,NLFACE) IF (.NOT.LMUR) THEN CTGRT.POIDU2(IPD,IEL2)=NPDUAL ELSE CTGRT.POIDU1(IPD,IEL1)=NPDUAL ENDIF NLCEND=KRCENT.LECT(NPDUAL) IF (NLCEND.EQ.0) THEN WRITE(IOIMP,*) 'Erreur grave n1' GOTO 9999 ENDIF DO 124 IPP=1,NPP NPPRIM=MCOGRT.NUM(IPP+1,IELEM) LCTRB2=.TRUE. IF (LCLIMT) THEN NLCLT=KRTIMP.LECT(NPPRIM) IF (NLCLT.NE.0) THEN LCTRB2=.FALSE. ENDIF ENDIF IF (LCLIMQ) THEN NLCLQ=KRQIMP.LECT(NPPRIM) IF (NLCLQ.NE.0) THEN LCTRB2=.FALSE. ENDIF ENDIF IF (LMIXT) THEN NLCLM=KRMIXT.LECT(NPPRIM) IF (NLCLM.NE.0) THEN LCTRB2=.FALSE. ENDIF ENDIF IF (.NOT.LCTRB2) THEN * Lorsque une contribution est nulle, on fixe artificiellement le * point primal égal au point dual. IF (.NOT.LMUR) THEN CTGRT.POIPR2(IPP,IEL2)=NPDUAL RETRET.VALMA2(IPD,IPP,IEL2)=0.D0 ELSE CTGRT.POIPR1(IPP,IEL1)=NPDUAL RETRET.VALMA1(IPD,IPP,IEL1)=0.D0 ENDIF ELSE * Les contributions valent : * (d Res_{\rho e_t})_d / (d var)_p = * +/-1 (normale sortante, rentrante) (1/V_d) * (S_f) * \kappa * * [ ((n_x * \beta_x) +(n_y * \beta_y)) * * ((dT)_p / (d var)_p)] * avec : * (dT)_p / (d \rho)_p = (1 / \rho_p) * * ( (((u_p)^2 + (v_p)^2) / (2 * c_v)) - T ) * (dT)_p / (d \rho u)_p = - u_p / (\rho_p * c_v) * (dT)_p / (d \rho v)_p = - v_p / (\rho_p * c_v) * (dT)_p / (d \rho e_t)_p = 1 / (\rho_p * c_v) * \beta_x : coefficients pour le calcul de dT/dx * \beta_y : coefficients pour le calcul de dT/dy * NLCENP=KRCENT.LECT(NPPRIM) IF (NLCENP.EQ.0) THEN WRITE(IOIMP,*) 'Erreur grave n2' GOTO 9999 ENDIF * normale sortante pour IPD=1, rentrante pour IPD=2 SIGNOR=(-1.D0)**(IPD+1) VOLUEL=MPVOLU.VPOCHA(NLCEND,1) SURFFA=MPSURF.VPOCHA(NLFACE,1) CNX =MPNORM.VPOCHA(NLFACE,1) CNY =MPNORM.VPOCHA(NLFACE,2) BETAX =KCDTDX.VELCHE(IPP+1,IELEM) FACTOR=SIGNOR*(1.D0/VOLUEL)*SURFFA $ *(BETAX) DTDRET=1.D0 IF (.NOT.LMUR) THEN CTGRT.POIPR2(IPP,IEL2)=NPPRIM RETRET.VALMA2(IPD,IPP,IEL2)=FACTOR*DTDRET c WRITE(6,*) 'IPD=',IPD,'IPP=',IPP,'IEL2=',IEL2 c WRITE(6,*) 'FACT=',FACTOR*DTDRET c WRITE(6,*) 'SIGNOR=',SIGNOR,'VOLUEL=',VOLUEL, c & 'SURFFA=',SURFFA,'BETAX= ',BETAX ELSE CTGRT.POIPR1(IPP,IEL1)=NPPRIM RETRET.VALMA1(IPD,IPP,IEL1)=FACTOR*DTDRET c WRITE(6,*) 'IPD=',IPD,'IPP=',IPP,'IEL1=',IEL1 c WRITE(6,*) 'FACT=',FACTOR*DTDRET c WRITE(6,*) 'SIGNOR=',SIGNOR,'VOLUEL=',VOLUEL, c & 'SURFFA=',SURFFA,'BETAX= ',BETAX ENDIF ENDIF 124 CONTINUE 122 CONTINUE IF (.NOT.LMUR) THEN IEL2=IEL2+1 ELSE IEL1=IEL1+1 ENDIF ENDIF 12 CONTINUE NPP1=NPTEL-1 NPP2=NPTEL-1 NEL1=IEL1-1 NEL2=IEL2-1 c WRITE(6,*) 'APRES SEGADJ' c WRITE(6,*) 'NPP1= ',NPP1,'NPP2= ',NPP2 c WRITE(6,*) 'NEL1= ',NEL1,'NEL2= ',NEL2 SEGDES MCOGRT SEGDES KCDTDX SEGADJ RETRET SEGADJ CTGRT CTGRT.LMATSI(**)=RETRET * On accumule les matrices résultantes dans IJACO IF (IRET.NE.0) GOTO 9999 SEGSUP RETRET SEGSUP CTGRT * 1 CONTINUE SEGDES ICOGRT SEGDES MPTEMC SEGDES MPVOLU SEGDES MPNORM SEGDES MPSURF SEGDES MELEFL SEGDES KRFACE SEGDES KRCENT IF (LCLIMQ) THEN SEGDES KRQIMP ENDIF IF (LCLIMT) THEN SEGDES KRTIMP ENDIF IF (LMIXT) THEN SEGDES KRMIXT ENDIF * * Normal termination * IRET=0 RETURN * * Format handling * * * Error handling * 9999 CONTINUE IRET=1 WRITE(IOIMP,*) 'An error was detected in subroutine ylap1b' RETURN * * End of subroutine YLAP1B * END
© Cast3M 2003 - Tous droits réservés.
Mentions légales