ylap2b
C YLAP2B SOURCE CB215821 20/11/25 13:44:14 10792 $ MPVOLU,MPNORM,MPSURF,MELEFL, $ KRFACE,KRCENT,LCLIMT,KRTIMP,LCLIMQ,KRQIMP, $ NOMINC, $ KAPPA,CV, $ IJACO, $ IMPR,IRET) IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) C*********************************************************************** C NOM : YLAP2B C DESCRIPTION : Calcul de la matrice jacobienne du résidu du laplacien C VF 3D. 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 w, \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 : YLAP2A : Calcul de la matrice jacobienne du C résidu du laplacien VF 3D. 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 NOMINC (type MLMOTS) : noms des inconnues. 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 3D. C SORTIES : - C CODE RETOUR (IRET) : = 0 si tout s'est bien passé C*********************************************************************** C VERSION : v1, 28/08/2001, version initiale C HISTORIQUE : v1, 28/08/2001, création C HISTORIQUE : 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,KCDTDZ.MELVAL -INC SMELEME POINTEUR MELEFL.MELEME POINTEUR MCOGRT.MELEME -INC SMLENTI POINTEUR KRTIMP.MLENTI,KRQIMP.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 RETRHO.MATSIM POINTEUR RETROU.MATSIM POINTEUR RETROV.MATSIM POINTEUR RETROW.MATSIM POINTEUR RETRET.MATSIM * REAL*8 KAPPA,CV * INTEGER IMPR,IRET * LOGICAL LCLIMT,LCLIMQ LOGICAL LMUR LOGICAL LCTRB1 * 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,BETAZ,CNX,CNY,CNZ REAL*8 SIGNOR,SURFFA,VOLUEL REAL*8 RHOP,UP,VP,WP,TP REAL*8 FACTOR REAL*8 DTDRHO,DTDROU,DTDROV,DTDROW,DTDRET C * * Executable statements * IF (IMPR.GT.2) WRITE(IOIMP,*) 'Entrée dans ylap2b.eso' * On calcule la partie de d Res_{\rho e_t} / d var * (var prend successivement les valeurs : * \rho, \rho u, \rho v, \rho w, \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, RETROW, RETRET IF (LCLIMT) THEN SEGACT KRTIMP ENDIF IF (LCLIMQ) THEN SEGACT KRQIMP ENDIF SEGACT NOMINC SEGACT KRCENT SEGACT KRFACE SEGACT MELEFL SEGACT MPSURF SEGACT MPNORM SEGACT MPVOLU SEGACT MPROC SEGACT MPVITC 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) KCDTDY=JCOGRT.IELVAL(2) KCDTDZ=JCOGRT.IELVAL(3) SEGDES JCOGRT SEGACT KCDTDX SEGACT KCDTDY SEGACT KCDTDZ SEGACT MCOGRT NELEM=MCOGRT.NUM(/2) NPTEL=MCOGRT.NUM(/1) NPP1=NPTEL-1 NPP2=NPTEL-1 NEL1=NELEM NEL2=NELEM IEL1=1 IEL2=1 SEGINI RETRHO SEGINI RETROU SEGINI RETROV SEGINI RETROW SEGINI RETRET SEGINI CTGRT RETRHO.NOMPRI(5:8)=' ' RETRHO.NOMDUA(5:8)=' ' RETROU.NOMPRI(5:8)=' ' RETROU.NOMDUA(5:8)=' ' RETROV.NOMPRI(5:8)=' ' RETROV.NOMDUA(5:8)=' ' RETROW.NOMPRI(5:8)=' ' RETROW.NOMDUA(5:8)=' ' RETRET.NOMPRI(5:8)=' ' 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 n°1' 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. IF (LCLIMQ) THEN NLCLQ=KRQIMP.LECT(NGFACE) IF (NLCLQ.NE.0) THEN LCTRB1=.FALSE. ENDIF ENDIF 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 n°1' GOTO 9999 ENDIF DO 124 IPP=1,NPP NPPRIM=MCOGRT.NUM(IPP+1,IELEM) C C AB : we do not check the BC anymore C NLCENP=KRCENT.LECT(NPPRIM) IF (NLCENP .EQ. 0) 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 RETRHO.VALMA2(IPD,IPP,IEL2)=0.D0 RETROU.VALMA2(IPD,IPP,IEL2)=0.D0 RETROV.VALMA2(IPD,IPP,IEL2)=0.D0 RETROW.VALMA2(IPD,IPP,IEL2)=0.D0 RETRET.VALMA2(IPD,IPP,IEL2)=0.D0 ELSE CTGRT.POIPR1(IPP,IEL1)=NPDUAL RETRHO.VALMA1(IPD,IPP,IEL1)=0.D0 RETROU.VALMA1(IPD,IPP,IEL1)=0.D0 RETROV.VALMA1(IPD,IPP,IEL1)=0.D0 RETROW.VALMA1(IPD,IPP,IEL1)=0.D0 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) + (n_z * \beta_z)) * * ((dT)_p / (d var)_p)] * avec : * (dT)_p / (d \rho)_p = (1 / \rho_p) * * ( (((u_p)^2 + (v_p)^2 + (w_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 w)_p = - w_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 * \beta_z : coefficients pour le calcul de dT/dz * * 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) CNZ =MPNORM.VPOCHA(NLFACE,3) BETAX =KCDTDX.VELCHE(IPP+1,IELEM) BETAY =KCDTDY.VELCHE(IPP+1,IELEM) BETAZ =KCDTDZ.VELCHE(IPP+1,IELEM) RHOP =MPROC.VPOCHA(NLCENP,1) UP =MPVITC.VPOCHA(NLCENP,1) VP =MPVITC.VPOCHA(NLCENP,2) WP =MPVITC.VPOCHA(NLCENP,3) TP =MPTEMC.VPOCHA(NLCENP,1) FACTOR=SIGNOR*(1.D0/VOLUEL)*SURFFA*KAPPA $ *((CNX*BETAX)+(CNY*BETAY)+(CNZ*BETAZ)) DTDRHO=((((UP*UP)+(VP*VP)+(WP*WP)) $ /(2.D0*CV))-TP)/RHOP DTDROU=-UP/(RHOP*CV) DTDROV=-VP/(RHOP*CV) DTDROW=-WP/(RHOP*CV) DTDRET=1.D0/(RHOP*CV) IF (.NOT.LMUR) THEN CTGRT.POIPR2(IPP,IEL2)=NPPRIM RETRHO.VALMA2(IPD,IPP,IEL2)=FACTOR*DTDRHO RETROU.VALMA2(IPD,IPP,IEL2)=FACTOR*DTDROU RETROV.VALMA2(IPD,IPP,IEL2)=FACTOR*DTDROV RETROW.VALMA2(IPD,IPP,IEL2)=FACTOR*DTDROW RETRET.VALMA2(IPD,IPP,IEL2)=FACTOR*DTDRET ELSE CTGRT.POIPR1(IPP,IEL1)=NPPRIM RETRHO.VALMA1(IPD,IPP,IEL1)=FACTOR*DTDRHO RETROU.VALMA1(IPD,IPP,IEL1)=FACTOR*DTDROU RETROV.VALMA1(IPD,IPP,IEL1)=FACTOR*DTDROV RETROW.VALMA1(IPD,IPP,IEL1)=FACTOR*DTDROW RETRET.VALMA1(IPD,IPP,IEL1)=FACTOR*DTDRET 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 SEGADJ RETRHO SEGADJ RETROU SEGADJ RETROV SEGADJ RETROW SEGADJ RETRET SEGADJ CTGRT CTGRT.LMATSI(**)=RETRHO CTGRT.LMATSI(**)=RETROU CTGRT.LMATSI(**)=RETROV CTGRT.LMATSI(**)=RETROW CTGRT.LMATSI(**)=RETRET * On accumule les matrices résultantes dans IJACO IF (IRET.NE.0) GOTO 9999 SEGSUP RETRHO SEGSUP RETROU SEGSUP RETROV SEGSUP RETROW SEGSUP RETRET SEGSUP CTGRT * SEGDES MCOGRT SEGDES KCDTDZ SEGDES KCDTDY SEGDES KCDTDX 1 CONTINUE SEGDES ICOGRT SEGDES MPTEMC SEGDES MPVITC SEGDES MPROC SEGDES MPVOLU SEGDES MPNORM SEGDES MPSURF SEGDES MELEFL SEGDES KRFACE SEGDES KRCENT SEGDES NOMINC IF (LCLIMQ) THEN SEGDES KRQIMP ENDIF IF (LCLIMT) THEN SEGDES KRTIMP ENDIF * * Normal termination * IRET=0 RETURN * * Format handling * * * Error handling * 9999 CONTINUE IRET=1 WRITE(IOIMP,*) 'An error was detected in subroutine ylap2b' RETURN * * End of subroutine YLAP2B * END
© Cast3M 2003 - Tous droits réservés.
Mentions légales