fixmel
C FIXMEL SOURCE CHAT 05/01/13 00:01:55 5004 $ MELPR2,MELDU2, $ IMPR,IRET) IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) C*********************************************************************** C NOM : FIXMEL C PROJET : Noyau linéaire NLIN C DESCRIPTION : On corrige les maillages primaux et duaux s'ils n'ont C pas le même nombre de sous-objets géométriques. C C LANGAGE : ESOPE C AUTEUR : Stéphane GOUNAND (CEA/DRN/DMT/SEMT/LTMF) C mél : gounand@semt2.smts.cea.fr C*********************************************************************** C APPELES (UTIL.) : RSETI C APPELE PAR : PRASEM C*********************************************************************** C ENTREES : MELPRI, MELDUA C SORTIES : MELPR2, MELDU2 C CODE RETOUR (IRET) : = 0 si tout s'est bien passé C*********************************************************************** C VERSION : v1, 16/11/99, version initiale C HISTORIQUE : v1, 16/11/99, 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 SMELEME INTEGER NBNN,NBELEM,NBSOUS,NBREF POINTEUR MELPRI.MELEME POINTEUR MELDUA.MELEME POINTEUR MELPR2.MELEME POINTEUR MELDU2.MELEME POINTEUR SMLPRI.MELEME POINTEUR SMLDUA.MELEME POINTEUR SMLPR2.MELEME POINTEUR SMLDU2.MELEME -INC SMLENTI INTEGER JG POINTEUR NBLPRI.MLENTI POINTEUR NBLDUA.MLENTI POINTEUR NBLMIX.MLENTI * INTEGER IDXPRI,IDXDUA INTEGER NELPRI,NELDUA INTEGER NUPRI,NUDUA,NUMIX INTEGER ISOUS,ISOUP,ISOUD,ISOUM INTEGER NSOUS,NSOUP,NSOUD,NSOUM * INTEGER IMPR,IRET * * Executable statements * IF (IMPR.GT.1) WRITE(IOIMP,*) 'Entrée dans fixmel' * * Comptage des éléments dans chaque MELEME * * primal... SEGACT MELPRI NSOUS=MELPRI.LISOUS(/1) JG=MAX(1,NSOUS)+1 SEGINI NBLPRI NBLPRI.LECT(1)=1 DO 1 ISOUS=1,MAX(1,NSOUS) IF (NSOUS.EQ.0) THEN SMLPRI=MELPRI ELSE SMLPRI=MELPRI.LISOUS(ISOUS) SEGACT SMLPRI ENDIF NBLPRI.LECT(ISOUS+1)=NBLPRI.LECT(ISOUS)+SMLPRI.NUM(/2) IF (NSOUS.NE.0) SEGDES SMLPRI 1 CONTINUE SEGDES MELPRI * ... et dual SEGACT MELDUA NSOUS=MELDUA.LISOUS(/1) JG=MAX(1,NSOUS)+1 SEGINI NBLDUA NBLDUA.LECT(1)=1 DO 3 ISOUS=1,MAX(1,NSOUS) IF (NSOUS.EQ.0) THEN SMLDUA=MELDUA ELSE SMLDUA=MELDUA.LISOUS(ISOUS) SEGACT SMLDUA ENDIF NBLDUA.LECT(ISOUS+1)=NBLDUA.LECT(ISOUS)+SMLDUA.NUM(/2) IF (NSOUS.NE.0) SEGDES SMLDUA 3 CONTINUE SEGDES MELDUA * * D'où les nombres d'éléments (+1)... * NSOUP=NBLPRI.LECT(/1)-1 NELPRI=NBLPRI.LECT(NSOUP+1) NSOUD=NBLDUA.LECT(/1)-1 NELDUA=NBLDUA.LECT(NSOUD+1) IF (NELPRI.NE.NELDUA) THEN WRITE(IOIMP,*) 'Maillage primaux et duaux : nbel différents' GOTO 9999 ENDIF IF (NSOUP.EQ.NSOUD) THEN MELPR2=MELPRI MELDU2=MELDUA ELSE * * On détermine combien il faudra de sous-maillages * avec quels nombres d'éléments par sous-maillage * NSOUM=NSOUP*NSOUD JG=NSOUM+1 SEGINI NBLMIX ISOUP=1 ISOUD=1 ISOUM=0 NUPRI=NBLPRI.LECT(ISOUP+1) NUDUA=NBLDUA.LECT(ISOUD+1) NBLMIX.LECT(ISOUM+1)=1 5 CONTINUE IF (NUPRI.LT.NUDUA) THEN ISOUM=ISOUM+1 NBLMIX.LECT(ISOUM+1)=NUPRI ISOUP=ISOUP+1 NUPRI=NBLPRI.LECT(ISOUP+1) GOTO 5 ELSEIF (NUPRI.GT.NUDUA) THEN ISOUM=ISOUM+1 NBLMIX.LECT(ISOUM+1)=NUDUA ISOUD=ISOUD+1 NUDUA=NBLDUA.LECT(ISOUD+1) GOTO 5 ELSE ISOUM=ISOUM+1 NBLMIX.LECT(ISOUM+1)=NUDUA IF (NUPRI.LT.NELPRI.AND.NUDUA.LT.NELDUA) THEN ISOUP=ISOUP+1 ISOUD=ISOUD+1 NUPRI=NBLPRI.LECT(ISOUP+1) NUDUA=NBLDUA.LECT(ISOUD+1) GOTO 5 ELSEIF (.NOT.(NUPRI.EQ.NELPRI.AND.NUDUA.EQ.NELDUA)) THEN WRITE(IOIMP,*) 'Erreur de programmation' GOTO 9999 ENDIF ENDIF * * On remplit MELPR2 et MELDU2 (partitionnés) comme il faut. * NBNN=0 NBELEM=0 NBSOUS=ISOUM NBREF=0 SEGINI MELPR2 SEGINI MELDU2 ISOUP=1 ISOUD=1 ISOUM=0 SEGACT MELPRI NSOUP=MELPRI.LISOUS(/1) IF (NSOUP.EQ.0) THEN SMLPRI=MELPRI ELSE SMLPRI=MELPRI.LISOUS(1) SEGACT SMLPRI ENDIF SEGACT MELDUA NSOUD=MELDUA.LISOUS(/1) IF (NSOUD.EQ.0) THEN SMLDUA=MELDUA ELSE SMLDUA=MELDUA.LISOUS(1) SEGACT SMLDUA ENDIF NUPRI=NBLPRI.LECT(ISOUP+1) NUDUA=NBLDUA.LECT(ISOUD+1) NUMIX=NBLMIX.LECT(ISOUM+1) 7 CONTINUE IF (NUPRI.LT.NUDUA) THEN ISOUM=ISOUM+1 NBNN=SMLPRI.NUM(/1) NBELEM=NUPRI-NUMIX NBSOUS=0 NBREF=0 SEGINI SMLPR2 SMLPR2.ITYPEL=SMLPRI.ITYPEL IDXPRI=NUMIX-NBLPRI.LECT(ISOUP)+1 SEGDES SMLPR2 MELPR2.LISOUS(ISOUM)=SMLPR2 NBNN=SMLDUA.NUM(/1) SEGINI SMLDU2 SMLDU2.ITYPEL=SMLDUA.ITYPEL IDXDUA=NUMIX-NBLDUA.LECT(ISOUD)+1 SEGDES SMLDU2 MELDU2.LISOUS(ISOUM)=SMLDU2 SEGDES SMLPRI ISOUP=ISOUP+1 SMLPRI=MELPRI.LISOUS(ISOUP) SEGACT SMLPRI NUPRI=NBLPRI.LECT(ISOUP+1) NUMIX=NBLMIX.LECT(ISOUM+1) GOTO 7 ELSEIF (NUPRI.GT.NUDUA) THEN ISOUM=ISOUM+1 NBNN=SMLPRI.NUM(/1) NBELEM=NUDUA-NUMIX NBSOUS=0 NBREF=0 SEGINI SMLPR2 SMLPR2.ITYPEL=SMLPRI.ITYPEL IDXPRI=NUMIX-NBLPRI.LECT(ISOUP)+1 SEGDES SMLPR2 MELPR2.LISOUS(ISOUM)=SMLPR2 NBNN=SMLDUA.NUM(/1) SEGINI SMLDU2 SMLDU2.ITYPEL=SMLDUA.ITYPEL IDXDUA=NUMIX-NBLDUA.LECT(ISOUD)+1 SEGDES SMLDU2 MELDU2.LISOUS(ISOUM)=SMLDU2 SEGDES SMLDUA ISOUD=ISOUD+1 SMLDUA=MELDUA.LISOUS(ISOUD) SEGACT SMLDUA NUDUA=NBLDUA.LECT(ISOUD+1) NUMIX=NBLMIX.LECT(ISOUM+1) GOTO 7 ELSE ISOUM=ISOUM+1 NBNN=SMLPRI.NUM(/1) NBELEM=NUDUA-NUMIX NBSOUS=0 NBREF=0 SEGINI SMLPR2 SMLPR2.ITYPEL=SMLPRI.ITYPEL IDXPRI=NUMIX-NBLPRI.LECT(ISOUP)+1 SEGDES SMLPR2 MELPR2.LISOUS(ISOUM)=SMLPR2 NBNN=SMLDUA.NUM(/1) SEGINI SMLDU2 SMLDU2.ITYPEL=SMLDUA.ITYPEL IDXDUA=NUMIX-NBLDUA.LECT(ISOUD)+1 SEGDES SMLDU2 MELDU2.LISOUS(ISOUM)=SMLDU2 IF (NUPRI.LT.NELPRI.AND.NUDUA.LT.NELDUA) THEN SEGDES SMLPRI ISOUP=ISOUP+1 SMLPRI=MELPRI.LISOUS(ISOUP) SEGACT SMLPRI SEGDES SMLDUA ISOUD=ISOUD+1 SMLDUA=MELDUA.LISOUS(ISOUD) SEGACT SMLDUA NUPRI=NBLPRI.LECT(ISOUP+1) NUDUA=NBLDUA.LECT(ISOUD+1) NUMIX=NBLMIX.LECT(ISOUM+1) GOTO 7 ELSEIF (.NOT.(NUPRI.EQ.NELPRI.AND.NUDUA.EQ.NELDUA)) THEN WRITE(IOIMP,*) 'Erreur de programmation' GOTO 9999 ENDIF ENDIF IF (NSOUD.NE.0) SEGDES SMLDUA SEGDES MELDUA IF (NSOUP.NE.0) SEGDES SMLPRI SEGDES MELPRI SEGDES MELDU2 SEGDES MELPR2 SEGSUP NBLMIX ENDIF SEGSUP NBLDUA SEGSUP NBLPRI * * Normal termination * IRET=0 RETURN * * Format handling * * * Error handling * 9999 CONTINUE IRET=1 WRITE(IOIMP,*) 'An error was detected in subroutine fixmel' RETURN * * End of subroutine FIXMEL * END
© Cast3M 2003 - Tous droits réservés.
Mentions légales