corrsp
C CORRSP SOURCE CB215821 20/11/25 13:22:36 10792 C C********************************************************************** C C CE SP APPELE PAR ITINV, SIMUL1 ... PREPARE L OBJET 'LISTMOTS' C NECESSAIRE A L OPERATEUR XTY : COUPLE DES NOMS D INCONNUES A c ASSOCIER C C IPR : pointeur sur l'objet RIGIDITE qui définit la dualité C IPVEC : OBJET DE TYPE CHPOINT C IPMX : OBJET DE TYPE CHPOINT C IPLMOX : POINTEUR SUR OBJET LISTMOTS UX,UY.... C IPLMOY : POINTEUR SUR OBJET LISTMOTS FX,FY.... C C AUTEUR : D.BROCHARD C DATE : 11/01/88 C C BP , novembre 2010 : on supprime l hypothese selon laquelle : c " la matrice possede des correspondances sur les inconnues c (c'est a dire que la ieme ligne est la duale de la ieme colonne) " C => On utilise NOMDD et NOMDU de CCHAMP pour créer l'association C "naturelle" entre les inconnues primales et duales (permet dutiliser C de matrices creuses commes celles crees par imped par ex.) C C********************************************************************* C C IMPLICIT INTEGER(I-N) IMPLICIT REAL*8(A-H,O-Z) -INC PPARAM -INC CCOPTIO -INC CCHAMP -INC SMLMOTS pointeur lmopri.mlmots, lmodua.mlmots -INC SMCHPOI -INC SMRIGID CHARACTER*(LOCOMP) NOCO C iplmox=0 iplmoy=0 C C==== CREATION DE lmopri lmodua QUI DEFINIT LA REGLE D'ASSOCIATION ==== C C CREATION BASEE SUR NOMDD et NOMDU de CCHAMP rempli dans bdata.eso C jgn=LOCOMP jgm=LNOMDD segini,lmopri segini,lmodua do i=1,jgm enddo c C c C CREATION BASEE SUR LA MATRICE FOURNIE (ancienne syntaxe) c C mrigid=ipr segact,mrigid nbriel=irigel(/2) if (irigel(/1).lt.3) then write(*,*) 'CORRSP: Information insuffisante dans la RIGIDITE' segdes,mrigid return endif itaill=0 do 1 i=1,nbriel descr=irigel(3,i) segact,descr nbcpri=lisinc(/2) nbcdua=lisdua(/2) if(nbcpri.ne.nbcdua) then * write(*,*) 'CORRSP: Zone',i,' de la RIGIDITE contient des', * & ' matrices non carrées !!!' segdes,descr goto 1 endif do 2 ic=1,nbcpri if (lisinc(ic).eq.lisdua(ic)) goto 2 do 6 ij=1,jgm moterr(9:12)= lisdua(ic) 6 continue if (jgm.eq.0) then jgm=1 segadj,lmopri segadj,lmodua else do 3 ica=1,jgm 3 continue jgm=jgm+1 segadj,lmopri segadj,lmodua endif 2 continue segdes,descr 1 continue segdes,mrigid c itaill=jgm if (iimpi.eq.321) then do 4 i=1,itaill 4 continue endif C C C==== CREATION et REMPLISSAGE DE MLMOTS MLMOT2 (= RESULTATS) ==== C JGN=LOCOMP JGM=0 SEGINI MLMOTS,MLMOT2 C C ON UTILISE LE CHPOINT PRIMAL INU=0 MCHPO1=IPVEC SEGACT MCHPO1 NSOUP1=MCHPO1.IPCHP(/1) C DO 10 ISOUP1 = 1,NSOUP1 MSOUP1 = MCHPO1.IPCHP(ISOUP1) SEGACT MSOUP1 NC1 = MSOUP1.NOCOMP(/2) DO 20 NCI = 1,NC1 C IF(IIMPI.EQ.321) WRITE(IOIMP,*) NCI,MSOUP1.NOCOMP(NCI) C IF(INU.NE.0) GOTO 30 NOCO = MSOUP1.NOCOMP(1) if(ipla.eq.0) goto 20 JGM=JGM+1 SEGADJ MLMOTS SEGADJ MLMOT2 INU = INU+1 GOTO 20 C 30 CONTINUE NOCO = MSOUP1.NOCOMP(NCI) DO 40 I =1,INU 40 CONTINUE if (ipla.eq.0) goto 20 INU =INU+1 JGM=JGM+1 SEGADJ MLMOTS SEGADJ MLMOT2 20 CONTINUE SEGDES MSOUP1 10 CONTINUE SEGDES MCHPO1 C IPLMOX=MLMOTS IPLMOY=MLMOT2 C C C==== VERIFICATION : C LES VARIABLES SONT ELLES BIEN DANS LE CHPOINT DUAL c c rem : il s agit seulement d un message informatif c pas d une erreur car on peut avoir u={UX RX LX} c et M*u={FX } seulement ! c ca ne derange pas xty1 a priori... c IF(IIMPI.lt.5) GOTO 999 c c on peut faire mieux en enlevant les couples "veufs" C==== CREATION et REMPLISSAGE DE MLMOT1 ==== JGM=0 SEGINI MLMOT1 IMU=0 MCHPOI=IPMX SEGACT MCHPOI NSOUPO=IPCHP(/1) DO 100 ISOUPO=1,NSOUPO C MSOUPO=IPCHP(ISOUPO) SEGACT MSOUPO NC1 = NOCOMP(/2) DO 120 NCI = 1,NC1 C IF(IIMPI.EQ.321) WRITE(IOIMP,*) NCI,NOCOMP(NCI) C IF (IMU.NE.0) GOTO 130 NOCO = NOCOMP(1) JGM=JGM+1 SEGADJ MLMOT1 IMU = IMU+1 GOTO 120 C 130 CONTINUE NOCO = NOCOMP(NCI) DO 140 I =1,IMU 140 CONTINUE IMU =IMU+1 JGM=JGM+1 SEGADJ MLMOT1 120 CONTINUE SEGDES MSOUPO 100 CONTINUE SEGDES MCHPOI C C==== COMPARAISON DE MLMOT1 et MLMOT2 ==== c JGM=0 DO 210 I1=1,JGM1 210 CONTINUE c on n a pas retrouvé cette composante IF(IIMPI.GE.5) 1000 FORMAT(/4X,'LA COMPOSANTE ',A4,' DUALE DE ',A4, & ' N EST PAS CONTENUE DANS LE SECOND CHPOINT') goto 200 199 CONTINUE c on a retrouvé cette composante duale JGM=JGM+1 200 CONTINUE if(JGM.ne.JGM2) segadj,MLMOTS,MLMOT2 SEGSUP,MLMOT1 C C==== MENAGE, MESSAGES et RETOUR ==== c 999 CONTINUE SEGDES MLMOTS,MLMOT2 segsup lmopri,lmodua C IF (IIMPI.eq.321) then WRITE(IOIMP,5000) 5000 FORMAT(/10X,'SBR CORRSP',//) endif C RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales