isova3
C ISOVA3 SOURCE PV 20/04/01 21:15:54 10569 IMPLICIT REAL*8 (A-H,O-Z) IMPLICIT INTEGER (I-N) C*********************************************************************** C NOM : ISOVA3 C DESCRIPTION : Construit le noeud correspondant à l'intersection C d'une isovaleur sur un segment. C Ajoute 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 VERSION : v1.1, 29/07/2014, modifie la pile des nouveaux noeuds C VERSION : v1, 17/12/2008, version initiale C HISTORIQUE : v1, 17/12/2008, création C HISTORIQUE : C HISTORIQUE : C*********************************************************************** -INC PPARAM -INC CCOPTIO *-INC SMCOORD -INC CCREEL -INC SMLENTI * SEGMENT NEWNOD INTEGER NNOD INTEGER NOEINF(MAXNOD) INTEGER NOESUP(MAXNOD) REAL*8 COEINF(MAXNOD) ENDSEGMENT * DVAL=VAL2-VAL1 XBAR=(XISO-VAL1)/DVAL XMBAR=1.D0-XBAR *dbg WRITE(IOIMP,*) ' XBAR=',XBAR,' DVAL=', DVAL * On a rajoute ce test suite a la fiche 8625 * On met xzprec*10.D0 pour mimer le XTOL mis dans isoval.eso if ((xbar.lt.-xzprec*10.D0).or.(xmbar.lt.-xzprec*10.D0)) then MOTERR(1:8)='ISOVA3 ' RETURN endif * * On adopte une logique différente : on ajoute des noeuds * dans la pile NEWNOD au lieu d'incrémenter directement MCOORD. * En effet, on va éliminer les noeuds de NEWNOD géométriquement * confondus avant de les ajouter à MCOORD. L'intérêt est que comme les * coefficients barycentriques sont compris entre 0. et 1., il est * plus facile de trouver un critère d'élimination pertinent * (XZPREC*10.D0 doit à peu près convenir) * * Tous les noeuds créés sont des barycentres de deux noeuds existants * Par convention, on met le noeud existant de numéro le plus petit * dans NOEINF et l'autre dans NOESUP. Ceci facilitera les recherches * pour l'élimination ultérieure * * On stocke le coefficient * barycentrique de NOEINF dans COEINF. L'autre coefficient se retrouve * en faisant 1-COEINF (on perd peut-être un peu en précision ?) * NNOD=NNOD+1 IF (NUM1.LE.NUM2) THEN NOEINF(NNOD)=NUM1 NOESUP(NNOD)=NUM2 COEINF(NNOD)=XMBAR ELSE NOEINF(NNOD)=NUM2 NOESUP(NNOD)=NUM1 COEINF(NNOD)=XBAR ENDIF * Par convention, un noeud de la pile NEWNOD est mis en négatif dans * LECT pour le distinguer des noeuds usuels de MCOORD LECT(**)=-NNOD * IDIM1=IDIM+1 * NBPTS=nbpts * NBPTS=NBPTS+1 * SEGADJ,MCOORD * DO II=1,IDIM+1 * XCOOR((NBPTS-1)*IDIM1+II)= * $ (XCOOR((NUM2-1)*IDIM1+II)*XBAR)+ * $ (XCOOR((NUM1-1)*IDIM1+II)*XMBAR) * ENDDO * LECT(**)=NBPTS RETURN * * End of subroutine ISOVA3 * END
© Cast3M 2003 - Tous droits réservés.
Mentions légales