meladd
C MELADD SOURCE PV 20/03/24 21:19:27 10554 *----------------------------------------------------------------------* * ADDITION DE 2 MELVALS, LE SECOND ETANT AJOUTE AU PREMIER. *----------------------------------------------------------------------* * ENTREES : * IELVA1 MELVAL A COMPLETER <- ACTif et MOD en Entree/Sortie * IELVA2 MELVAL A AJOUTER <- ACTif en Entree/Sortie * TYPCHA TYPE DES CHAMPS CI-DESSUS ADDITIONNER * ILEL21 = 0 si les maillages des melvals se correspondent element * par element * = MLENTI(>0) liste d'entiers donnant la correspondance * des elements du champ2 presents dans le champ1 (addition * des valeurs commmunes) * * SORTIES : * IELVA1 MELVAL RESULTAT COMPLETE <- ACTif et MOD en Sortie * IRET = 0 si pas d'erreur * = entier non nul correspondant a l'erreur : * 104, 21, 197 par ex. *----------------------------------------------------------------------* IMPLICIT INTEGER(I-N) IMPLICIT REAL*8(A-H,O-Z) -INC PPARAM -INC CCOPTIO -INC SMCHAML -INC SMCOORD -INC SMLENTI -INC SMLREEL CHARACTER*(*) TYPCHA IRET = 0 melva1 = IELVA1 melva2 = IELVA2 * SEGACT,melva1*MOD <- suppose ACTif et MOD en Entree * SEGACT melva2 <- suppose ACTif en Entree mlenti = ILEL21 * IF (mlenti.NE.0) SEGACT,mlenti <- suppose ACTif en Entree * 1---------------------------1 * 1. MELVAL a valeurs reelles : * 1---------------------------1 IF (TYPCHA.EQ.'REAL*8') THEN nbpi1 = melva1.velche(/1) nbel1 = melva1.velche(/2) nbpi2 = melva2.velche(/1) nbel2 = melva2.velche(/2) * "Extension" de melva1 par rapport a melva2 (MELEXT) nbpie = nbpi2 IF (mlenti.NE.0) THEN nbele = mlenti.lect(/1) IF (nbel1.GT.1 .AND. nbel1.NE.nbele) THEN write(ioimp,*) 'MELADD : nbele .NE. nbel1 > 1 !' ENDIF ELSE nbele = nbel2 IF (nbel1.GT.1 .AND. nbel2.GT.1 .AND. nbel1.NE.nbel2) THEN write(ioimp,*) 'MELADD : nbel2 .NE. nbel1 > 1 !' ENDIF ENDIF * Addition des valeurs de melva2 dans melva1 pour les elements communs : nbpi1 = melva1.velche(/1) nbel1 = melva1.velche(/2) DO iel1 = 1, nbel1 iel2 = iel1 IF (mlenti.NE.0) iel2 = mlenti.lect(iel1) IF (iel2.GT.0) THEN jel2 = MIN(iel2,nbel2) DO igau1 = 1, nbpi1 igau2 = MIN(igau1,nbpi2) melva1.velche(igau1,iel1) = melva1.velche(igau1,iel1) & + melva2.velche(igau2,jel2) ENDDO ENDIF ENDDO * 2------------------------------------2 * 2. MELVAL a valeurs de type pointeur : * 2------------------------------------2 ELSE nbpi1 = melva1.ielche(/1) nbel1 = melva1.ielche(/2) nbpi2 = melva2.ielche(/1) nbel2 = melva2.ielche(/2) * "Extension" de melva1 par rapport a melva2 (MELEXT) nbpie = nbpi2 IF (mlenti.NE.0) THEN nbele = mlenti.lect(/1) IF (nbel1.GT.1 .AND. nbel1.NE.nbele) THEN write(ioimp,*) 'MELADD : nbele .NE. nbel1 > 1 !' ENDIF ELSE nbele = nbel2 IF (nbel1.GT.1 .AND. nbel2.GT.1 .AND. nbel1.NE.nbel2) THEN write(ioimp,*) 'MELADD : nbel2 .NE. nbel1 > 1 !' ENDIF ENDIF * Addition des valeurs de melva2 dans melva1 pour les elements communs : nbpi1 = melva1.ielche(/1) nbel1 = melva1.ielche(/2) IF (TYPCHA.EQ.'POINTEURLISTREEL') THEN DO iel1 = 1, nbel1 iel2 = iel1 IF (mlenti.NE.0) iel2 = mlenti.lect(iel1) IF (iel2.GT.0) THEN jel2 = MIN(iel2,nbel2) DO igau1 = 1, nbpi1 igau2 = MIN(igau1,nbpi2) mlree1 = melva1.ielche(igau1,iel1) mlree2 = melva2.ielche(igau2,jel2) IF (mlree1.EQ.0) THEN melva1.ielche(igau1,iel1) = mlree2 ELSE IF (mlree2.NE.0) THEN SEGACT,mlree1*MOD SEGACT,mlree2 IF (jg2.LE.jg1) THEN DO i = 1, jg2 ENDDO ELSE jg = jg2 SEGADJ,mlree1 DO i = 1, jg1 ENDDO DO i = jg1+1, jg2 ENDDO ENDIF ** SEGDES,mlree1,mlree2 ** on ne desactive pas, on se contente de remettre en lecture seule SEGACT mlree1 ENDIF ENDDO ENDIF ENDDO ELSE IF (TYPCHA.EQ.'POINTEURPOINT ') THEN * Probleme en // car modif. mcoord bloque les assistants en deadlock. * Se pose aussi la question de la legalite de l'operation effectuee * ici sur les points = directions. idimp1 = IDIM + 1 nbnoe = nbpts nbpts = nbnoe ** nbpts = nbpts + (nbpi1 * nbel1) ** SEGADJ,mcoord DO iel1 = 1, nbel1 iel2 = iel1 IF (mlenti.NE.0) iel2 = mlenti.lect(iel1) IF (iel2.GT.0) THEN jel2 = MIN(iel2,nbel2) DO igau1 = 1, nbpi1 igau2 = MIN(igau1,nbpi2) ip1 = melva1.ielche(igau1,iel1) ip2 = melva2.ielche(igau2,jel2) IF (ip1.EQ.0) THEN melva1.ielche(igau1,iel1) = ip2 ELSE IF (ip2.NE.0) THEN C- Si les numeros des points sont differents, on va tester s'ils C- n'ont pas les memes coordonnees. Si non, alors erreur 5... IF (ip1.NE.ip2) THEN iref1 = (ip1-1) * idimp1 iref2 = (ip2-1) * idimp1 i_z = 0 DO i = 1, idim r_z1 = MAX( ABS(xcoor(iref1+i)) , & ABS(xcoor(iref2+i)) ) r_z2 = ABS( xcoor(iref1+i) - xcoor(iref2+i) ) IF (r_z2 .GT. 1.D-9*r_z1) i_z = i_z + 1 ENDDO IF (i_z.GT.0) nbnoe = nbnoe + 1 ** A voir par la suite : tester aussi si les 2 points/vecteurs sont ** colineaires (produit vectoriel nul). Si oui, on conserve ip1 (en ** esperant celui-ci non nul). ** ireff = nbnoe * idimp1 ** DO i = 1, idimp1 ** xcoor(ireff+i) = xcoor(iref1+i) + xcoor(iref2+i) ** ENDDO ** nbnoe = nbnoe + 1 ** melva1.ielche(igau1,iel1) = nbnoe ENDIF ENDIF ENDDO ENDIF ENDDO IF (nbnoe.NE.nbpts) THEN write(ioimp,*) ' Cas NON prevu sur les POINTs dans MELADD' ** nbpts = nbnoe ** SEGADJ,mcoord ENDIF ELSE IF (TYPCHA.EQ.'POINTEUREVOLUTIO') THEN i_xx = 1 DO iel1 = 1, nbel1 iel2 = iel1 IF (mlenti.NE.0) iel2 = mlenti.lect(iel1) IF (iel2.GT.0) THEN jel2 = MIN(iel2,nbel2) DO igau1 = 1, nbpi1 igau2 = MIN(igau1,nbpi2) ievol1 = melva1.ielche(igau1,iel1) ievol2 = melva2.ielche(igau2,jel2) IF (ievol1.EQ.0) THEN melva1.ielche(igau1,iel1) = ievol2 ELSE IF (ievol2.NE.0) THEN IF (ievolf.EQ.0) IRET = 21 melva1.ielche(igau1,iel1) = ievolf ENDIF ENDDO ENDIF ENDDO ELSE DO iel1 = 1, nbel1 iel2 = iel1 IF (mlenti.NE.0) iel2 = mlenti.lect(iel1) IF (iel2.GT.0) THEN jel2 = MIN(iel2,nbel2) DO igau1 = 1, nbpi1 igau2 = MIN(igau1,nbpi2) ip1 = melva1.ielche(igau1,iel1) ip2 = melva2.ielche(igau2,jel2) IF (ip1.EQ.0) THEN melva1.ielche(igau1,iel1) = ip2 ELSE IF (ip2.NE.0) THEN melva1.ielche(igau1,iel1) = 0 IRET = 197 ENDIF ENDDO ENDIF ENDDO ENDIF ENDIF * SEGDES,melva1,melva2 <- Segments ACTifs en Sortie RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales