selloi
C SELLOI SOURCE OF166741 26/02/19 21:15:02 12437 *======================================================================* * * OBJET : Composante de type TABLE * ------- * La TABLE donne le nom de la loi et les parametres de la composante, * en fonction desquels doit se faire l'evaluation externe. * * ENTREE : * -------- * IPTABE Pointeur sur la TABLE de definition de la LOI externe * Le segment est DESACTIVE en Sortie (SEGDES) * IFCT Indicateur =0 si appel par VARINU, =1 si appel par VARILE * * SORTIE : * -------- * IPTABS Pointeur sur la TABLE preconditionnee * < 0 ou = 0 si erreur lors de l'analyse * Le segment est ACTIF en Sortie (SEGACT*NOMOD) *======================================================================* SUBROUTINE SELLOI(IPTABE,IPTABS,IFCT) IMPLICIT INTEGER(I-N) IMPLICIT REAL*8(A-H,O-Z) -INC PPARAM -INC CCOPTIO -INC CCNOYAU -INC CCASSIS -INC CCPRECO -INC SMLMOTS -INC SMTABLE CHARACTER*(LOCHAI) MOTEMP,LMELIB,LMEFCT c*dbg iimpi0 = IIMPI c*dbg iimpi0 = 1972 IF (IFCT.NE.0 .AND. IFCT.NE.1) THEN MOTERR = '(SELLOI) ERROR: IFCT incorrect' ENDIF IPTABS = 0 mtab1 = IPTABE C- Recherche si la table IPTABE n'a pas deja ete traite : C- Verification si presence dans le preconditionnement "CLOIEX" (CCPRECO) isloi = 0 DO is = 1, NBELOI IF ( LOITAB(is).LE.0 ) GOTO 10 isloi = isloi + 1 IF ( mtab1 .EQ. LOITAB(is) ) THEN mtab2 = LOIPRE(is) c*dbg if (iimpi0.eq.1972) then c*dbg write(ioimp,*) 'Preconditionnement SELLOI trouve', c*dbg & is,mtab1,mtab2 c*dbg endif C Mise a jour du preconditionnement dans CCPRECO : Deplacement en position 1 IF (is .GT. 1) THEN DO js = is, 2, -1 LOITAB(js) = LOIPRE(js-1) LOIPRE(js) = LOIPRE(js-1) ENDDO LOITAB(1) = mtab1 LOIPRE(1) = mtab2 ENDIF SEGACT,mtab2*NOMOD IPTABS = mtab2 GOTO 100 ENDIF ENDDO 10 CONTINUE c*dbg if (iimpi0.eq.1972) then c*dbg write(ioimp,*) 'Preconditionnement SELLOI :',isloi,'/',NBELOI c*dbg endif C- Verification du contenu de la table & Ajout au preconditionnement : SEGACT,mtab1 IF (NBESC.NE.0) SEGACT,IPILOC ierloc = 0 C- Recherche sur les noms C Initialisation des indices NPARA = 0 MLMOT1 = 0 NVARI = 0 MLMOT2 = 0 NCOEF = 0 MLMOT3 = 0 ITROUT = 0 ITROU1 = 0 LMELIB = ' ' LMELGB = 0 LMEFCT = ' ' LMELGT = 0 LMEPTR = 0 LMELOI = 0 ITROU2 = 0 LMEPRO = 0 C Verification des types des indices correspondants DO IN = 1, mtab1.MLOTAB IF (mtab1.MTABTI(IN).EQ.'MOT') THEN ip = mtab1.MTABII(IN) IDEBCH = IPCHAR(ip) IFINCH = IPCHAR(ip+1)-1 MOTEMP = ICHARA(IDEBCH:IFINCH) C Liste des parametres (entrees) de la loi IF ((MOTEMP.EQ.'PARA_LOI' ) .OR. & (MOTEMP.EQ.'PARAMETRES')) THEN IF (mtab1.MTABTV(IN).EQ.'LISTMOTS') THEN MLMOT1 = mtab1.MTABIV(IN) ELSE MLMOT1 = 0 IERR = 0 IERGLB = 0 MOTERR = ' ' MOTERR( 1:11) = MOTEMP MOTERR(12:19) = 'LISTMOTS' ierloc = ierloc + 1 ENDIF C Liste des variables (sorties) de la loi (VARI Loi Externe) ELSE IF ((MOTEMP.EQ.'VARI_LOI' ) .OR. & (MOTEMP.EQ.'VARIABLES')) THEN IF (mtab1.MTABTV(IN).EQ.'LISTMOTS') THEN mlmots = mtab1.MTABIV(IN) ELSE mlmots = 0 IERR = 0 IERGLB = 0 MOTERR = ' ' MOTERR( 1:11) = MOTEMP MOTERR(12:19) = 'LISTMOTS' ierloc = ierloc + 1 ENDIF IF (IFCT.EQ.0) THEN MLMOT1 = mlmots ELSE IF (IFCT.EQ.1) THEN MLMOT2 = mlmots ENDIF C Liste des coefficients (constantes) de la loi (VARI Loi Externe) ELSE IF ((MOTEMP.EQ.'COEF_LOI' ) .OR. & (MOTEMP.EQ.'COEFFICIENTS')) THEN IF (IFCT.EQ.1) THEN IF (mtab1.MTABTV(IN).EQ.'LISTMOTS') THEN MLMOT3 = mtab1.MTABIV(IN) ELSE MLMOT3 = 0 IERR = 0 IERGLB = 0 MOTERR = ' ' MOTERR( 1:11) = MOTEMP MOTERR(12:19) = 'LISTMOTS' ierloc = ierloc + 1 ENDIF C* ELSE C* MLMOT3 = 0 ENDIF C Nom de la loi/fonction a utiliser dans la bibliotheque ELSE IF ((MOTEMP.EQ.'FCT_LOI') .OR. & (MOTEMP.EQ.'NOM_LOI') .OR. & (MOTEMP.EQ.'MODELE' )) THEN IF (mtab1.MTABTV(IN).EQ.'MOT ') THEN ip = mtab1.MTABIV(IN) IDEBCH = IPCHAR(ip) IFINCH = IPCHAR(ip+1)-1 LMELGT = IFINCH-IDEBCH+1 IF (LMELGT.LE.0 .OR. LMELGT.GT.LOCHAI) THEN IERR = 0 IERGLB = 0 INTERR(1) = LMELGT MOTERR = ICHARA(IDEBCH:IFINCH) IERR = 0 IERGLB = 0 LMELGT = 0 ierloc = ierloc + 1 ELSE LMEFCT = ICHARA(IDEBCH:IFINCH) ITROU1 = ITROU1+1 ENDIF ELSE IERR = 0 IERGLB = 0 MOTERR = ' ' MOTERR( 1:11) = MOTEMP MOTERR(12:19) = 'MOT ' ierloc = ierloc + 1 ENDIF C Nom de la bibliotheque ou se trouve la loi materiau ELSE IF ((MOTEMP.EQ.'LIB_LOI ') .OR. & (MOTEMP.EQ.'LIBRAIRIE')) THEN IF (mtab1.MTABTV(IN).EQ.'MOT ') THEN ip = mtab1.MTABIV(IN) IDEBCH = IPCHAR(ip) IFINCH = IPCHAR(ip+1)-1 LMELGB = IFINCH-IDEBCH+1 IF (LMELGB.LE.0 .OR. LMELGB.GT.LOCHAI) THEN IERR = 0 IERGLB = 0 INTERR(1) = LMELGB MOTERR = ICHARA(IDEBCH:IFINCH) IERR = 0 IERGLB = 0 LMELGT = 0 ierloc = ierloc + 1 ELSE LMELIB = ICHARA(IDEBCH:IFINCH) ITROU1 = ITROU1+10 ENDIF ELSE IERR = 0 IERGLB = 0 MOTERR = ' ' MOTERR( 1:11) = MOTEMP MOTERR(12:19) = 'MOT ' ierloc = ierloc + 1 ENDIF C Nom du programme externe ELSE IF (MOTEMP.EQ.'PROGRAMME') THEN IF (mtab1.MTABTV(IN).EQ.'MOT ') THEN ip = mtab1.MTABIV(IN) IDEBCH = IPCHAR(ip) IFINCH = IPCHAR(ip+1)-1 LMEPRO = IFINCH-IDEBCH+1 IF (LMEPRO.LE.0 .OR. LMEPRO.GT.LOCHAI) THEN IERR = 0 IERGLB = 0 INTERR(1) = LMEPRO MOTERR = ICHARA(IDEBCH:IFINCH) IERR = 0 IERGLB = 0 LMEPRO = 0 ierloc = ierloc + 1 ELSE LMEPRO = ip ITROU2 = 1 ENDIF ELSE IERR = 0 IERGLB = 0 MOTERR = ' ' MOTERR( 1:11) = MOTEMP MOTERR(12:19) = 'MOT ' ierloc = ierloc + 1 ENDIF ENDIF ENDIF ENDDO IF (ierloc.GT.0) GOTO 30 C Dernieres verifications de la table IF (IFCT.EQ.0) THEN IF (MLMOT1.EQ.0) THEN MOTERR = 'ERROR: VARI_LOI/VARIABLES/ or '// & 'PARA_LOI/PARAMETRES missing' ierloc = ierloc + 1 ENDIF ELSE IF (IFCT.EQ.1) THEN IF (MLMOT1.EQ.0) THEN MOTERR = 'ERROR: PARA_LOI/PARAMETRES missing' ierloc = ierloc + 1 ENDIF IF (MLMOT2.EQ.0) THEN MOTERR = 'ERROR: VARI_LOI/VARIABLES missing' ierloc = ierloc + 1 ENDIF ENDIF IF ((ITROU1.EQ.0).AND.(ITROU2.EQ.0)) THEN MOTERR = 'ERROR: PROGRAMME and LIB_LOI/FCT_LOI missing' ierloc = ierloc + 1 ENDIF IF ((ITROU1.NE.0).AND.(ITROU2.NE.0)) THEN MOTERR = 'ERROR: neither PROGRAMME nor LIB_LOI/FCT_LOI' ierloc = ierloc + 1 GOTO 30 ENDIF IF (ITROU1.NE.0) THEN IF (ITROU1.NE.11) THEN MOTERR = 'ERROR: LIB_LOI or FCT_LOI missing' ierloc = ierloc + 1 ENDIF ENDIF IF (ierloc.GT.0) THEN GOTO 30 ENDIF SEGACT,MLMOT1 IF (MLMOT2.NE.0) SEGACT,MLMOT2 IF (MLMOT3.NE.0) SEGACT,MLMOT3 IF (NPARA.LE.0) THEN MOTERR = 'ERROR: PARA_LOI/PARAMETRES is empty (NPARA=0) !' ierloc = 1 GOTO 35 ENDIF C- Cas particulier : Parametres speciaux (VARI Loi Externe) IF (IFCT.EQ.1) THEN jgm = NPARA SEGINI,mlmots ITROUT = 0 IF (ip.NE.0) ITROUT = ITROUT + 1 IF (ip.NE.0) ITROUT = ITROUT + 10 IF (ITROUT.EQ.00) THEN jgm = 0 ELSE IF (ITROUT.EQ.01) THEN jgm = 1 ELSE IF (ITROUT.EQ.10) THEN jgm = 1 c ELSE IF (ITROUT.EQ.11) THEN ELSE jgm = 2 ENDIF NDEB = jgm DO IN = 1, NPARA IF (ip.EQ.0) THEN jgm = jgm + 1 ENDIF ENDDO SEGDES,MLMOT1 MLMOT1 = mlmots IF (jgm.NE.NPARA) THEN MOTERR = 'ERROR: PARA_LOI/PARAMETRES "TEMP" or "T " '// & 'defined several times' ierloc = 1 GOTO 35 ENDIF ENDIF C- Non redondance des parametres DO IN = 2, NPARA jgm = IN-1 IF (ip.NE.0) THEN MOTERR = 'ERROR: PARA_LOI/PARAMETRES "'// ierloc = ierloc + 1 ENDIF ENDDO IF (ierloc.GT.0) THEN GOTO 35 ENDIF IF (MLMOT2.NE.0) THEN IF (NVARI.LE.0) THEN MOTERR = 'ERROR: no VARI_LOI/VARIABLES defined (NVARI=0) !' ierloc = 1 GOTO 35 ENDIF C- Non redondance des variables DO IN = 2, NVARI jgm = IN-1 IF (ip.NE.0) THEN MOTERR = 'ERROR: VARI_LOI/VARIABLES "'// ierloc = ierloc + 1 ENDIF ENDDO IF (ierloc.GT.0) THEN GOTO 35 ENDIF DO IN = 1, NVARI IF (ip.NE.0) THEN ierloc = ierloc + 1 MOTERR = 'ERROR: VARI_LOI/VARIABLES "'// & 'in PARA_LOI/PARAMETERS' ENDIF ENDDO IF (ierloc.GT.0) THEN GOTO 35 ENDIF ENDIF IF (MLMOT3.NE.0) THEN IF (NCOEF.LE.0) THEN MOTERR = 'ERROR: no COEF_LOI/COEFFICIENTS defined (NCOEF=0) !' GOTO 35 ENDIF C- Non redondance des coefficients DO IN = 2, NCOEF jgm = IN-1 IF (ip.NE.0) THEN MOTERR = 'ERROR: COEF_LOI/COEFFICIENTS "'// ierloc = ierloc + 1 ENDIF ENDDO IF (ierloc.GT.0) THEN GOTO 35 ENDIF DO IN = 1, NCOEF IF (ip.NE.0) THEN ierloc = ierloc + 1 MOTERR = 'ERROR: COEF_LOI/COEFFICIENTS "'// & 'in PARA_LOI/PARAMETERS' ENDIF IF (ip.NE.0) THEN ierloc = ierloc + 1 MOTERR = 'ERROR: COEF_LOI/COEFFICIENTS "'// & 'in VARI_LOI/VARIABLES' ENDIF ENDDO IF (ierloc.GT.0) THEN GOTO 35 ENDIF ENDIF 35 CONTINUE SEGDES,MLMOT1 IF (MLMOT2.NE.0) SEGDES,MLMOT2 IF (MLMOT3.NE.0) SEGDES,MLMOT3 IF (ierloc.GT.0) GOTO 30 C- Recherche et Ouverture de la bibliotheque et de la loi IF (ITROU1.NE.0) THEN ip = -1 IF (IFCT.EQ.0) ip = NPARA CALL LEXTOP(LMELIB,LMEFCT,ip,LMELOI,LMEPTR) IF (IERR.NE.0) GOTO 30 ENDIF C- Verification de la table reussie - Creation de la table preconditionnee : M = 3 IF (IFCT.EQ.1) M = 6 SEGINI,mtab2 mtab2.MLOTAB = M DO IN = 1, M mtab2.MTABTI(IN) = 'ENTIER ' mtab2.MTABII(IN) = IN ENDDO mtab2.MTABTV(1) = 'ENTIER ' IF (ITROU1.NE.0) THEN mtab2.MTABIV(1) = 1 ELSE mtab2.MTABIV(1) = 2 ENDIF IF (ITROU1.NE.0) THEN mtab2.MTABTV(2) = 'ENTIER ' mtab2.MTABIV(2) = LMEPTR ELSE mtab2.MTABTV(2) = 'MOT ' mtab2.MTABIV(2) = LMEPRO ENDIF mtab2.MTABTV(3) = 'LISTMOTS' mtab2.MTABIV(3) = MLMOT1 IF (IFCT.EQ.1) THEN mtab2.MTABTV(4) = 'LISTMOTS' mtab2.MTABIV(4) = MLMOT2 mtab2.MTABTV(5) = 'ENTIER ' IF (NCOEF.GT.0) mtab2.MTABTV(8) = 'LISTMOTS' mtab2.MTABIV(5) = MLMOT3 mtab2.MTABTV(6) = 'ENTIER ' mtab2.MTABIV(6) = ITROUT ENDIF c*dbg if (iimpi0.eq.1972) then c*dbg call ectabl(mtab2) c*dbg endif SEGACT,mtab2*NOMOD C- Ajout en position 1 dans le preconditionnement "CLOIEX" (CCPRECO) if (isloi.eq.NBELOI) then moterr = 'Warning "CLOIEX": maximum NBELOI atteint' end if isloi = MIN(isloi + 1,NBELOI) DO is = isloi, 2, -1 LOITAB(is) = LOIPRE(is-1) LOIPRE(is) = LOIPRE(is-1) ENDDO LOITAB(1) = mtab1 LOIPRE(1) = mtab2 LOITAB(0) = isloi IPTABS = mtab2 c*dbg if (iimpi0.eq.1972) then c*dbg write(ioimp,*) 'Preconditionnement SELLOI ',iptabe,iptabs,isloi c*dbg endif C- Fin du traitement 30 CONTINUE SEGDES,mtab1 if (NBESC.NE.0) SEGDES,IPILOC 100 CONTINUE c return END
© Cast3M 2003 - Tous droits réservés.
Mentions légales