diff --git a/sairube.f b/sairube.f new file mode 100644 index 0000000000000000000000000000000000000000..f92fe3dceffd1032d95bfbf69a367ef953dc2c27 --- /dev/null +++ b/sairube.f @@ -0,0 +1,5180 @@ +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C C +C PROGRAMME DE SAISIE DES DONNEES ASSOCIEES AU PROGRAMME C +C DE PROPAGATION D'ONDE DE RUPTURE DE BARRAGE C +C C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C C +C VERSION INITIALE DU 26/09/1988 AUTEUR : JP VILA C +C MODIFICATIONS PAR G.MARTINET ET A.PAQUIER C +C VERSION DU 19/6/98 DE A.PAQUIER C +C version du 15 octobre 2007 :ecriture geometrie dans geomac-i +C corrige le 22/10 +C corrections du 17/11/08 sur : +c les parametres des ouvrages y compris largeur maximale de B +C et le controle de l'ordre des abscisses +C mise a jour octobre 2009 pour rubarBE +C le 25 aout 2016 ajout des points 10 et 11 du menu +C pour passer de monbief a multibief +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C C +C LISTE FICHIERS C +C ---------------- C +C C +C DONNEE.ETUDE : CONTIENT PARAMETRES DE CALCUL C +C ts.etude : PARAMETRES DU TRANSPORT SOLIDE C +C MAIL0 : ABSCISSES MAILLAGE ET PAS D ESPACE C +C GEOMAC-I00 : GEOMETRIE C +C geomac-i0 : TOPOGRAPHIE ABSCISSE-COTE (AUX INTERMAILLES) C +C geomac-i : GEOMETRIE (TOPO+SÉD) ABSCISSE-COTE (AUX INTERMAILLES) C +C frot0 : DONNEES FROTTEMENTS C +C frot : FROTTEMENTS (AUX CENTREMAILLES) C +C condi0 : DONNEES CONDITIONS INITIALES HYDRAULIQUES C +C condin : CONDITIONS INITIALES HYDRAULIQUES (AUX CENTREMAILLES) C +C condis0 : DONNEES CONDITIONS INITIALES SEDIMENTAIRES C +C condins : CONDITIONS INITIALES SEDIMENTAIRES (AUX CENTREMAILLES)C +C ABSHYD : ABSCISSE DES HYDROGRAMMES C +C TNPROF : TEMPS DE SAUVEGARDE DES PROFILS C +C C +C LES FICHIERS'0' INDIQUENT QU'ILS CONTIENNENT LES C +C VARIABLES INTRODUITES AU CLAVIER ET CEUX SANS LE C +C '0' QU'ILS CONTIENNENT LES VARIABLES INTERPOLEES C +C C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C C +C ETUDE EST LE NOM DU TRAVAIL.L'UTILISATION DU CODE C +C SE DEROULE EN PLUSIEURS ETAPES C +C C +C 1- GENERATION DU MAILLAGE FICHIER MAIL.ETUDE C +C 2- CREATION DES FICHIERS GEOM0.ETUDE,FROT0.ETUDE C +C ,CONDI0.ETUDE EN SELECTIONNANT UN CERTAIN C +C NOMBRE DE SECTIONS CARACTERISTIQUES LE LONG C +C DU PROFIL C +C 3- CREATION DES FICHIERS GEOMac-i.ETUDE,FROT.ETUDE C +C ,CONDIN.ETUDE PAR INTERPOLATION LINEAIRE SUR C +C LE MAILLAGE C +C---------------------------------------------------------C +C STRUCTURE DES ET DENOMINATION DES FICHIERS: C +C C +C LM EST LE NOMBRE DE POINTS DE CALCULS C +C C +C-->MAILLAGE : C +C------------- C +C MAIL0.ETUDE C +C BOUCLE SUR LES SECTIONS DE DONNEE C +C X, DX (PAS D ESPACE DESIRE) C +C FIN DE LA BOUCLE C +C MAIL.ETUDE C +C LM = NOMBRE DE POINTS DE CALCUL C +C BOUCLE SUR I DE 1 A LM SUR ABSCISSES DES POINTS C +C DE CALCUL : TMAIL(I) PUIS SUR XTMAIL(I) C +C ABSCISSES DES INTERMAILLES C +C-->GEOMETRIE : C +C-------------- C +C geomac-i0.etude C +C LM-1 [nb de sections du fichier] C +C Pour chaque section: C +C I,XSECT(I),IJ0(I) [num section, abscisse section, nb couples]C +C Pour chaque couple de points de la section: C +C CCOU(J),YCOU(J),ZCOU(J) [marque, abscisse latérale, cote] C +C C +C geomac-i.etude C +C LM-1 [nb de sections du fichier] C +C Pour chaque section: C +C I,XSECT(I),IJ0(I) [num section, abscisse section, nb couples]C +C Pour chaque couple de points de la section: C +C CCOU(J),YCOU(J),+NBCS(J)fois(ZCS(J,K),DCS(J,K),SCS(J,K),TMCS(J,K)) +C [marque, abscisse latérale, puis pour chaque compart séd:] C +C [(cote du toit, diamètre, étendue, contrainte mise en mvt)]C +C C +C-->FROTTEMENTS : C +C---------------- C +C FROT0.ETUDE C +C BOUCLE SUR LES SECTIONS DE DONNEE C +C X, FROT0 (COEFFICIENT DE STRICKLER) C +C C +C FROT.ETUDE C +C BOUCLE SUR I DE 1 A LM C +C I, FROT(I) (COEFFICIENT DE STRICKLER) C +C C +C-->CONDITIONS INITIALES : C +C------------------------- C +C CONDI0.ETUDE C +C BOUCLE SUR LES SECTIONS DE DONNEE C +C X, Y (TIRANT D'EAU), V (VITESSE),H(COTE) C +C C +C CONDIN.ETUDE C +C BOUCLE SUR I DE 1 A LM C +C I, Y(I) (TIRANT D'EAU), V(I) (VITESSE) C +C C +C-->CONDITIONS AUX LIMITES : C +C--------------------------- C +C CONDAV.ETUDE C +C QYH(I), YH(I) C +C C +C HYDRO.ETUDE C +C TH(I), QTH(I) C +C C +C HAMONT.ETUDE C +C HIMP(I),TA(I) C +C C +C-->AUTRES CAS : C +C--------------- C +C PARAMETRES DE SAUVEGARDES : TEMPS ET ABSCISSES C +C " " DEVERSEMENT C +C VISUALISATION DES VARIABLES C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC + + PROGRAM SAISIE + +C IMPLICIT NONE + + INTEGER LMAX,NCMAX,NSMAX,IDPARS,IE,NCOURB + PARAMETER (LMAX=3000,NCMAX=300,NSMAX=3000) + PARAMETER(NCOURB=10) + + DOUBLE PRECISION eps +C :CFL, +c + TINIT, +c + TMAX, +c + TIOPDT, +c + DT, +c + TS, +c + PSAVE,DTSAUV, +c + FDEB1,FDEB2,FDEB3,EPS + + CHARACTER ETUDE*20 + + ,NOMFIC*38 + + ,IODEV*1 + + ,IOPDT*1 + + ,IOVIS*1 + + ,REP*1,FIC(6)*1 + + INTEGER CHOIX,I +c + ,CONDAM +c + ,CONDAV +c + ,REGIME + LOGICAL TESTCH + INTEGER NBCOUP(NCOURB) +c INTEGER OPTFPC +c DOUBLE PRECISION ROS,DIAM,ETEN + + COMMON/ETUDE/ETUDE + COMMON/CONST/IDPARS,IE + COMMON/EPSI/EPS + COMMON/NBVALE/NBCOUP + + EPS=0.001 + WRITE(*,*) ' ' + WRITE(*,*) ' ' + WRITE(*,*) ' ' + WRITE(*,*) ' ******************************************' + WRITE(*,*) ' PROGRAMME DE SAISIE ET DE VERIFICATION' + WRITE(*,*) ' DES DONNEES ASSOCIEES AU PROGRAMME' + WRITE(*,*) ' DE SIMULATION DE RUPTURE DE BARRAGE' +cliq WRITE(*,*)' RUBAR 3 ' + WRITE(*,*)' RubarBE ' + WRITE(*,*)' version du 9 NOVEMBRE 2016 ' + WRITE(*,*) ' ******************************************' + WRITE(*,*) ' ' + WRITE(*,*) ' ' + +C 1)--> DESIGNATION DE L'ETUDE +C------------------------------ + + WRITE(*,412) +412 FORMAT(1H1) + WRITE(*,*)'DONNEZ EN MOINS DE 20 CARACTERES LE NOM DE L ETUDE' + READ(*,9998) ETUDE +9998 FORMAT(A20) + + +C 2)--> CHOIX DU TYPE DE SAISIE.IL EST A NOTER QUE LE PREMIER D' +C ENTRE EUX DOIT ETRE IMPERATIVEMENT LE N° 1 +C-------------------------------------------------------------- + + +30 WRITE(*,*) ' ' + WRITE(*,*) '---------------------------------------------' + WRITE(*,*) ' LE NOM DE L ETUDE EST : ',ETUDE + WRITE(*,*) 'le maillage doit exister si choix autre que 1 ou 2' + WRITE(*,*) '---------------------------------------------' + WRITE(*,*) ' MENU D APPEL DES PROGRAMMES DE SAISIE ' + WRITE(*,*) '---------------------------------------------' + WRITE(*,*) 'CHOIX 1 : SAISIE DU MAILLAGE ' + WRITE(*,*) 'CHOIX 2 : SAISIE DE LA GEOMETRIE ' + WRITE(*,*) 'CHOIX 3 : SAISIE DU FROTTEMENT ' + WRITE(*,*) 'CHOIX 4 : SAISIE DES DONNEES INITIALES ' + WRITE(*,*) 'CHOIX 5 : SAISIE DES CONDITIONS AUX LIMITES ' + WRITE(*,*) 'CHOIX 6 : SAISIE DES DEVERSEMENTS/APPORTS LATERAUX' + WRITE(*,*) 'CHOIX 7 : SAISIE DES OUVRAGES ' + WRITE(*,*) 'CHOIX 8 : SAISIE DES PARAMETRES DE SAUVEGARDE' + WRITE(*,*) 'CHOIX 9 : SAISIE DES PARAMETRES DE SIMULATION' + WRITE(*,*) 'CHOIX 10 : fusion plusieurs monobiefs + :','en un projet multibief' + WRITE(*,*) 'CHOIX 11 : scission un projet monobief + :','en un projet multibief' + WRITE(*,*) 'CHOIX 12 : Transformation projet multibief + :','en un projet monobief pour visualisation resultats' + WRITE(*,*) 'CHOIX 0 : RETOUR AU SYSTEME ' + WRITE(*,*) '---------------------------------------------' + WRITE(*,*) ' ' + WRITE(*,*) 'DONNEZ VOTRE CHOIX' + READ (*,*) CHOIX + +C -- TEST DU CHOIX + + TESTCH=.FALSE. + DO 40 I=0,12 + TESTCH=TESTCH.OR.(CHOIX.EQ.I) +40 CONTINUE + IF (.NOT.TESTCH) THEN + WRITE(*,*) 'VOUS AVEZ DONNE UN MAUVAIS CHOIX' + WRITE(*,*) 'RECOMMENCEZ' + GOTO 30 + ELSEIF(CHOIX.ne.0)THEN + + GOTO(1,2,3,4,5,6,7,8,9,10,11,12),CHOIX + +1 CALL MAILLA + GO TO 30 + +2 CALL GEOMET + GO TO 30 + +3 CALL FROTTE + GO TO 30 + +4 CALL DONINI + GO TO 30 + +5 CALL CONDLI + GO TO 30 + +6 CALL SAIDEV + GO TO 30 + +7 CALL SAIOUV + GOTO 30 + +8 CALL SAISAV + GOTO 30 + +C 3)--> REMPLISSAGE DU FICHIER DONNEE.ETUDE +C-----------------------------------------------------------------C +C Il contient tous les parametres de simulation C +C-----------------------------------------------------------------C + + + 9 CALL SAICONFIG + GOTO 30 + + 10 CALL FU1BMB + GOTO 30 + + 11 CALL TR1BMB + GOTO 30 + + 12 CALL TRMB1B + GOTO 30 + + +C fin du if sur choix + ENDIF + + END + +C----------------------------------------------------------------------- + SUBROUTINE FU1BMB +C----------------------------------------------------------------------- +C rassembler des projets monobiefs en un projet multibief' +C----------------------------------------------------------------------- + IMPLICIT NONE + INTEGER LMAX,NBMAX,CSMAX,LNCMAX + PARAMETER (LMAX=3000,NBMAX=150,CSMAX=10,LNCMAX=130000) + CHARACTER ETUDE*20,NOMFIC*38,CHAINE*50 + DOUBLE PRECISION X(LMAX) + + COMMON/ETUDE/ETUDE + Write (*,*)'non operationnel' + return + end +C----------------------------------------------------------------------- + SUBROUTINE TR1BMB +C----------------------------------------------------------------------- +C sectionner un projet monobief en un projet multibief' +C----------------------------------------------------------------------- + IMPLICIT NONE + INTEGER LMAX,NBMAX,CSMAX,LNCMAX + PARAMETER (LMAX=3000,NBMAX=150,CSMAX=10,LNCMAX=130000) + CHARACTER ETUDE*20,NOMFIC*38,CHAINE*50 + DOUBLE PRECISION X(LMAX) + + COMMON/ETUDE/ETUDE + + Write (*,*)'non operationnel' + return + end +C----------------------------------------------------------------------- + SUBROUTINE TRMB1B +C----------------------------------------------------------------------- +C modifier a minima projet multibief en projet monobief +C sert uniquement a la visualisation des resultats par pamhyr +C----------------------------------------------------------------------- + IMPLICIT NONE + INTEGER LMAX,NBMAX,CSMAX,LNCMAX + PARAMETER (LMAX=3000,NBMAX=150,CSMAX=10,LNCMAX=130000) + CHARACTER ETUDE*20,NOMFIC*38,CHAINE*50 + CHARACTER LIGNE*630,FINLIGNE*600,MORCLIGNE*58 + DOUBLE PRECISION X(LMAX),X2(LMAX),XX + INTEGER NBB,M,ILM(0:NBMAX),I,NM,XNC(0:LMAX) + :,NSM,II,J,K,XNBCS(LNCMAX),NUMCS,NBSECT,N + DOUBLE PRECISION XYCOU(LNCMAX),XZCS(LNCMAX,CSMAX) + : ,XDCS(LNCMAX,CSmax),XSCS(LNCMAX,CSMAX),XTMCS(LNCMAX,CSMAX) + CHARACTER*1 XCCOU(LNCMAX) + + COMMON/ETUDE/ETUDE + +C reecriture de geomac-i et mail +C on lit puis on sauve avant de reecrire en ecrasant + +C Lecture du fichier de maillage +C----------------------------------------------------------------------- + NBB=1 + ILM(0)=0 + OPEN(70,FILE = 'confl.'//ETUDE,STATUS='OLD',ERR=111) + READ(70,*,ERR=111)NBB + CLOSE(70) + NOMFIC='mail.'//ETUDE + OPEN(65,FILE=NOMFIC,STATUS='UNKNOWN') + DO 1000 M=1,NBB + READ(65,*) ILM(M) + ILM(M)=ILM(M-1)+ILM(M) + READ(65,*) (X(I),I=ILM(M-1)+1,ILM(M)) + READ(65,*) (X2(I),I=ILM(M-1)+1,ILM(M)-1) + X2(ILM(m))=X2(ILM(m)-1) + 1000 CONTINUE + CLOSE(65) + NM=ILM(NBB) + GO TO 112 + 111 NBB=1 + Write(*,*)'un seul bief initialement' + write(*,*)'erreur' + return +C Ouverture du fichier de géométrie abscisse-cote aux intermailles +C geomac-i + 112 NOMFIC='geomac-i.'//ETUDE + OPEN(24,FILE=NOMFIC,STATUS='OLD',FORM='FORMATTED',ERR=98) + XNC(0)=0 + GO TO 980 + 98 WRITE(*,*)'FICHIER geomac-i INEXISTANT' + Stop + 980 DO M=1,NBB + read(24,*)nsm + IF(NSM.NE.ILM(M)-1-ILM(M-1))THEN + write(*,*)'erreur en tete bief geomac-i ou fichier mail' + write(*,*)'nombre sections bief = ',m + Stop + ENDIF + + DO I=ILM(M-1)+1,ILM(M)-1 +C Contrôle des en-têtes de sections supprime + READ(24,*,END=240) II,XX,XNC(I) + XNC(I)=XNC(I)+XNC(I-1) + DO J=XNC(I-1)+1,XNC(I) +C Lecture des couples abscisse-cote + READ(24,'(A630)') LIGNE + READ(LIGNE,9994) XCCOU(J),XYCOU(J),FINLIGNE +C Décodage sédimentaire (description point par point) + DO NUMCS=1,CSMAX + MORCLIGNE=FINLIGNE(1+58*(NUMCS-1):58*NUMCS) + READ(MORCLIGNE,9996,END=200) XZCS(J,NUMCS),XDCS(J,NUMCS) + & ,XSCS(J,NUMCS),XTMCS(J,NUMCS) + ENDDO + 200 CONTINUE + XNBCS(J)=NUMCS-1 +C fin boucle sur J + ENDDO +C fin boucle sur I + ENDDO + XNC(ILM(M))=XNC(ILM(M)-1) +C fin boucle sur IB + + ENDDO + 240 CLOSE(24) + + 9994 FORMAT(A1,1X,F11.5,A600) + 9996 FORMAT(F13.5,2F15.10,F15.5) + + + NOMFIC='mail.'//ETUDE//'ancien' + OPEN(65,FILE=NOMFIC,STATUS='UNKNOWN') + DO 1015 M=1,NBB + write(65,*) ILM(M)-ILM(m-1) + Write(65,*) (X(I),I=ILM(M-1)+1,ILM(M)) + WRITE(65,*) (X2(I),I=ILM(M-1)+1,ILM(M)-1) + 1015 CONTINUE + CLOSE(65) + + NOMFIC='mail.'//ETUDE + OPEN(65,FILE=NOMFIC,STATUS='UNKNOWN') + write(65,*) ILM(M) + DO 1001 M=1,NBB + Write(65,*) (X(I),I=ILM(M-1)+1,ILM(M)) + 1001 CONTINUE + DO 1002 M=1,NBB-1 + WRITE(65,*) (X2(I),I=ILM(M-1)+1,ILM(M)-1) + WRITE(65,*) X2(ILM(M)-1) + 1002 CONTINUE + M=NBB + WRITE(65,*) (X2(I),I=ILM(M-1)+1,ILM(M)-1) + CLOSE(65) + +C RéÉcriture de 'geomac-i.etude' initial +C----------------------------------------------------------------------- + NOMFIC='geomac-i.'//ETUDE//'ancien' + OPEN(24,FILE=NOMFIC,STATUS='UNKNOWN') + DO M=1,NBB + NBSECT=ILM(M)-ILM(m-1)-1 + WRITE(24,110)NBSECT,0. + DO I=ilm(m-1)+1,ilm(m-1)+NBSECT + WRITE(24,2111)I,X2(I),xnc(i)-xnc(i-1) + DO J=XNC(I-1)+1,XNC(I) + DO K=1,XNBCS(J) + N=1+58*(K-1) + WRITE(FINLIGNE(N:),113)xZCS(J,K),xDCS(J,K),xSCS(J,K) + & ,xTMCS(J,K) + ENDDO + WRITE(24,2112)xcCOU(J),xYCOU(J),FINLIGNE + ENDDO + ENDDO +C fin boucle sur bief + ENDDO + CLOSE(24) + WRITE(*,*)'Ecriture de ',NOMFIC + +C Écriture de 'geomac-i.etude' +C----------------------------------------------------------------------- + NOMFIC='geomac-i.'//ETUDE + OPEN(24,FILE=NOMFIC,STATUS='UNKNOWN') + WRITE(24,110)ilm(nbb)-1,0. + DO M=1,NBB + NBSECT=ILM(M)-ILM(m-1)-1 + DO I=ilm(m-1)+1,ilm(m-1)+NBSECT + WRITE(24,2111)I,X2(I),xnc(i)-xnc(i-1) + DO J=XNC(I-1)+1,XNC(I) + DO K=1,XNBCS(J) + N=1+58*(K-1) + WRITE(FINLIGNE(N:),113)xZCS(J,K),xDCS(J,K),xSCS(J,K) + & ,xTMCS(J,K) + ENDDO + WRITE(24,2112)xcCOU(J),xYCOU(J),FINLIGNE + ENDDO + ENDDO + IF(M.NE.NBB)THEN +C on double la dernieres section de chaque bief sauf le dernier + I=ilm(m-1)+NBSECT + WRITE(24,2111)I,X2(I),xnc(i)-xnc(i-1) + DO J=XNC(I-1)+1,XNC(I) + DO K=1,XNBCS(J) + N=1+58*(K-1) + WRITE(FINLIGNE(N:),113)xZCS(J,K),xDCS(J,K),xSCS(J,K) + & ,xTMCS(J,K) + ENDDO + WRITE(24,2112)xcCOU(J),xYCOU(J),FINLIGNE + ENDDO +C fin du endif sur m=NBB + ENDIF +C fin boucle sur bief + ENDDO + CLOSE(24) + WRITE(*,*)'Ecriture de ',NOMFIC + 110 FORMAT(I4,1X,F12.3) + 2111 FORMAT(I4,1X,F11.3,1X,I4) + 2112 FORMAT(A1,1X,F11.5,A600) + 113 FORMAT(F13.5,F15.10,F15.10,F15.5) +C 2111 FORMAT(3(A7,F16.3)) +C 2112 FORMAT(1X,I4,1X,3(F16.3)) + + RETURN + END + +C----------------------------------------------------------------------- + SUBROUTINE SAIDONNEE +C----------------------------------------------------------------------- +C Remplissage du fichier des parametres de simulation 'donnee.etude' +C----------------------------------------------------------------------- + IMPLICIT NONE + INTEGER CONDAM,CONDAV,REGIME,OPTFPC + CHARACTER ETUDE*20,NOMFIC*38,CHAINE*50 + & ,IODEV*1,IOPDT*1,REP*1,IOVIS*1,FIC(7)*1 + DOUBLE PRECISION CFL,TINIT,TMAX + & ,TIOPDT,DT + & ,TS,PSAVE,DTSAUV + & ,FDEB1,FDEB2,FDEB3 + :,ROS,DIAM,ETEN + + COMMON/ETUDE/ETUDE + +C Récupération des informations +C----------------------------------------------------------------------- + NOMFIC='donnee.'//ETUDE + OPEN(10,FILE=NOMFIC,STATUS='UNKNOWN') + WRITE(*,*) 'REMPLISSAGE DU FICHIER DONNEE.ETUDE CONTENANT' + WRITE(*,*) ' LES PARAMETRES PERMETTANT ' + WRITE(*,*) ' D ''INITIALISER LES CALCULS ' + WRITE(*,*) + WRITE(*,*) + WRITE(*,*) 'RENTREZ LES PARAMETRES DE CALCUL :' + WRITE(*,*) + WRITE(*,*) ' CONDITION DE FRIEDRICH LEVY (CFL)' + READ(*,*) CFL + CHAINE='CONDITION DE FRIEDRICH LEVY=' + WRITE(10,101)CHAINE,CFL + WRITE(*,*)'- Condition limite amont' + WRITE(*,*)' - Rien ---------------> 0' + WRITE(*,*)' - Q(t)[hydro] --------> 1' + WRITE(*,*)' - Z(t)[hamont] -------> 2' + READ(*,*) CONDAM + CHAINE='CONDITION LIMITE AMONT=' + WRITE(10,102)CHAINE,CONDAM + WRITE(*,*) ' CONDITION LIMITE AVAL ' + WRITE(*,*) ' REGIME CRITIQUE-----> 7 ' + WRITE(*,*) ' REGIME UNIFORME-----> 5 ' + WRITE(*,*) ' Z(T) ---- ----------> 3 ' + WRITE(*,*) ' REFLEXION ----------> 2 ' + WRITE(*,*) ' Q(Y) ---------------> 1 ' + WRITE(*,*) ' SORTIE LIBRE -------> 0 ' + READ(*,*) CONDAV + CHAINE='CONDITION LIMITE AVAL=' + WRITE(10,103)CHAINE,CONDAV +103 FORMAT(A50,I1) + WRITE(*,*) ' COTE IMPOSEE A L''AMONT ' + WRITE(*,*) ' NON ---->0 ' + WRITE(*,*) ' OUI ---->1 ' +C WRITE(*,*) ' OUI SEULE ---->2 ' + READ(*,*)REGIME + CHAINE='COTE IMPOSEE EN AMONT=' + WRITE(10,119)CHAINE,REGIME +119 FORMAT(A50,I1) + WRITE(*,414) +414 FORMAT(1H1) + WRITE(*,*) 'RENTREZ LES OPTIONS DE CALCUL : ' + WRITE(*,*) + WRITE(*,*) ' DEVERSEMENT LATERAL ' + WRITE(*,*) ' NON ----> N OUI ----> O ' + READ(*,'(A1)') IODEV + CHAINE='DEVERSEMENT LATERAL O/N=' + WRITE(10,104)CHAINE,IODEV + WRITE(*,*) ' PAS DE TEMPS AUTOMATIQUE ' + WRITE(*,*) ' NON -->N OUI --> O MIXTE --> M ' + READ(*,'(A1)') IOPDT + CHAINE='PAS DE TEMPS AUTOMATIQUE O/N/M' + WRITE(10,105)CHAINE,IOPDT +105 FORMAT(A50,A1) + WRITE(*,*) ' CREATION DU FICHIER largeur et autres ' + WRITE(*,*) ' NON -->N OUI --> O ' + READ(*,'(A1)') IOVIS + CHAINE='CREATION FICHIER largeur O/N=' + WRITE(10,106)CHAINE,IOVIS +106 FORMAT(A50,A1) + WRITE(*,415) +415 FORMAT(1H1) + WRITE(*,*) 'RENTREZ LES PARAMETRES TEMPORELS ' + WRITE(*,*) + WRITE(*,*) ' REPRISE DU CALCUL ' + WRITE(*,*) ' NON ----> N OUI ----> O ' + READ(*,'(A1)') REP + CHAINE='REPRISE DU CALCUL A T DIFFERENT DE 0' + WRITE(10,107)CHAINE,REP +107 FORMAT(A50,A1) + WRITE(*,*) 'TEMPS DEBUT DE CALCUL ' + READ(*,*) TINIT + CHAINE='TEMPS DEBUT DE CALCUL=' + WRITE(10,108)CHAINE,TINIT +108 FORMAT(A50,E12.5) + WRITE(*,*) ' TEMPS DE FIN CALCUL ' + READ(*,*) TMAX + CHAINE='TEMPS FIN DE CALCUL=' + WRITE(10,109)CHAINE,TMAX +109 FORMAT(A50,E12.5) + IF(IOPDT.NE.'M')THEN + WRITE(*,*) ' TEMPS JUSQU''AUQUEL DT=CONSTANT ' +C WRITE(*,*) ' METTEZ 0 SI PAS DE TEMPS MIXTE PAS CHOISI' + READ(*,*) TIOPDT + ELSE + TIOPDT=TINIT + ENDIF + CHAINE='PAS DE TEMPS CONSTANT JUSQU''A T=' + WRITE(10,110)CHAINE,TIOPDT +110 FORMAT(A50,E12.5) + WRITE(*,*) ' PAS DE TEMPS INITIAL DT ' + READ(*,*) DT + CHAINE='VALEUR DU PAS DE TEMPS INITIAL =' + WRITE(10,111)CHAINE,DT +111 FORMAT(A50,E12.5) + WRITE(*,416) +416 FORMAT(1H1) + WRITE(*,417) +417 FORMAT(1H1) + WRITE(*,*) 'FICHIERS RESULTATS DESIRES ' + WRITE(*,*) ' NON ----> N OUI ----> O ' + WRITE(*,*) + WRITE(*,*) ' tps (REPRISE ULTERIEURE) ' + READ(*,'(A1)') FIC(1) + WRITE(*,*) ' hydlim (SAUVEGARDE Q,V,H à x fixé )' + READ(*,'(A1)') FIC(2) + WRITE(*,*) ' envlop (ENVELOPPE DES Q,Y,V) ' + READ(*,'(A1)') FIC(3) + WRITE(*,*) ' profil (SAUVEGARDE A T DONNE) ' + READ(*,'(A1)') FIC(4) + WRITE(*,*) ' profil (SAUVEGARDE dt donne) ' + READ(*,'(A1)') FIC(5) + WRITE(*,*) ' trajec (TEMPS ARRIVEE DES FRONTS) ' + READ(*,'(A1)') FIC(6) + WRITE(*,*) 'RENTREZ LES PARAMETRES DE SORTIE ' + WRITE(*,*) + If(fic(1).eq.'O'.or.fic(1).eq.'o')then + WRITE(*,*) ' TEMPS DE SAUVEGARDE POUR REPRISE EVENTUELLE ' + READ(*,*) TS + else + ts=tmax + endif + CHAINE='TEMPS DE SAUVEGARDE POUR REPRISE=' + WRITE(10,112)CHAINE,TS +112 FORMAT(A50,E12.5) + WRITE(*,*) + +' PAS DE SAUVEGARDE POUR LES SORTIES DE LIGNES D''EAU' + READ(*,*) DTSAUV + CHAINE='PAS DE SAUVEGARDE POUR LIGNE D''EAU=' + WRITE(10,113)CHAINE,DTSAUV + if(fic(2).eq.'O'.or.fic(2).eq.'o')then + WRITE(*,*) + +' PAS DE SAUVEGARDE POUR LES SORTIES D''HYDROGRAMMES' + READ(*,*) PSAVE + else + psave=tmax + endif + CHAINE='PAS DE SAUVEGARDE POUR HYDROGRAMMES' + WRITE(10,113)CHAINE,PSAVE +113 FORMAT(A50,E12.5) + if(fic(6).eq.'O'.or.fic(6).eq.'o')then + WRITE(*,*) ' ' + WRITE(*,*) ' ENTREZ LES TROIS FRONTS DE DEBIT ' + WRITE(*,*) ' FRONT DEBIT 1 ' + WRITE(*,*) ' FRONT DEBIT 2 ' + WRITE(*,*) ' FRONT DEBIT 3 ' + READ(*,*) FDEB1,FDEB2,FDEB3 + else + fdeb1=1. + fdeb2=10. + fdeb3=100. + endif + CHAINE='FRONTS DE DEBIT=' + WRITE(10,114)CHAINE,FDEB1 + WRITE(10,114)CHAINE,FDEB2 + WRITE(10,114)CHAINE,FDEB3 +114 FORMAT(A50,E12.5) + CHAINE='tps (REPRISE)-------------> O/N' + WRITE(10,115)CHAINE,FIC(1) + CHAINE='hydlim (Q(T),V(T),H(T))---> O/N' + WRITE(10,115)CHAINE,FIC(2) + CHAINE='envlop (QMAX,YMAX,VMAX)---> O/N' + WRITE(10,115)CHAINE,FIC(3) + CHAINE='profil(Y(X),V(X),Q(X) A T)--> O/N' + WRITE(10,115)CHAINE,FIC(4) + CHAINE='profil(Y(X),V(X),Q(X) A DT)--> O/N' + WRITE(10,115)CHAINE,FIC(5) + CHAINE='trajec (FRONTS)-----------> O/N' + WRITE(10,115)CHAINE,FIC(6) + WRITE(*,*) ' transport de sediments O/N' + READ(*,'(A1)') FIC(6) + CHAINE='transport de sediment (o,n)' +cliq FIC(6)='N' + WRITE(10,115)CHAINE,FIC(6) + +115 FORMAT(A50,A1) + WRITE(*,*) ' OPTION FROTTEMENTS ' + WRITE(*,*) ' pas de changement --> 0 ' + WRITE(*,*) ' BROWNLIE -----> 1 ' + WRITE(*,*) ' GRIFFITH ----------> 2 ' + WRITE(*,*) ' KARIM ----------> 3 ' + WRITE(*,*) ' WU et WANG ---------> 4 ' + WRITE(*,*) ' YU et LIM -------> 5 ' + WRITE(*,*) ' RECKING -------> 6 ' + WRITE(*,*) ' GARDE et RAJU ------> 7 ' + READ(*,*) OPTFPC + CHAINE='OPTION FROTTEMENTS=' + WRITE(10,103)CHAINE,OPTFPC + IF(OPTFPC.NE.0)THEN + WRITE(*,*) ' masse volumique des sediments ' + READ(*,*) ROS + CHAINE='MASSE VOLUMIQUE DES SEDIMENTS=' + WRITE(10,109)CHAINE,ROS + WRITE(*,*) ' diametre des sediments ' + READ(*,*) DIAM + CHAINE='DIAMETRE DES SEDIMENTS=' + WRITE(10,109)CHAINE,DIAM + WRITE(*,*) ' etendue des sediments ' + READ(*,*) ETEN + CHAINE='ETENDUE DES SEDIMENTS=' + WRITE(10,109)CHAINE,ETEN +C si optfpc =0 + ELSE + CHAINE='MASSE VOLUMIQUE DES SEDIMENTS=' + WRITE(10,109)CHAINE,2600. + CHAINE='DIAMETRE DES SEDIMENTS=' + WRITE(10,109)CHAINE,0.1 + CHAINE='ETENDUE DES SEDIMENTS=' + WRITE(10,109)CHAINE,1. + ENDIF + CLOSE(10) + + RETURN +101 FORMAT(A50,E12.5) +102 FORMAT(A50,I1) +104 FORMAT(A50,A1) + + END + + +C----------------------------------------------------------------------- + SUBROUTINE SAIVISU +C----------------------------------------------------------------------- +C Remplissage du fichier des parametres de simulation 'config-visu' +C----------------------------------------------------------------------- + IMPLICIT NONE + LOGICAL TRGEOMD,TRGEOMI,TRGEOML,TRSURFL,TRSL,ASPSL + CHARACTER ETUDE*20,NOMFIC*38,REP*1,CHAINE*50,COMM*60 + DOUBLE PRECISION XMIN,XMAX,DIRVUE,XVUE,YVUE,ZVUE,LARVUE + + COMMON/ETUDE/ETUDE + +C Récupération des informations +C----------------------------------------------------------------------- + WRITE(*,*)' ' + WRITE(*,*)' ' + WRITE(*,*)'--------------------------------------------------' + WRITE(*,*)' REMPLISSAGE DU FICHIER config-visu ' + WRITE(*,*)' DES PARAMETRES DE VISUALISATION 3D EN VRML ' + WRITE(*,*)'--------------------------------------------------' + WRITE(*,*)'Le fichier de sortie ''visu.wrl'' represente une vue ' + & ,'3D visitable du cas modelise. Il est lisible par tout ' + & ,'navigateur muni d''un plug-in gratuit de gestion du VRML.' + WRITE(*,*)' ' + WRITE(*,*)' ' + 100 CONTINUE + WRITE(*,*)'Quel est le minimum des abscisses en long (m) ?' + READ(*,*)XMIN + WRITE(*,*)'Quel est le maximum des abscisses en long (m) ?' + READ(*,*)XMAX + IF(XMAX.LE.XMIN)THEN + WRITE(*,*)'PROBLEME d''ordre des abscisses. Recommencez.' + GOTO 100 + ENDIF + WRITE(*,*)'Quelles sont les coordonnées X,Y,Z du point ' + & ,'d''observation dans le repere des points du profil (m m m) ?' + READ(*,*)XVUE,YVUE,ZVUE + WRITE(*,*)'Quelle est la direction d''observation (radians) ?' + WRITE(*,*)'[axeX:-1.57 axe-Y:0.00 axe-X:1.57 axeY:3.14]' + READ(*,*)DIRVUE + WRITE(*,*)'Quelle est la largeur du champ de vision (radians) ? ' + & ,'[0.35]' + READ(*,*)LARVUE + WRITE(*,*)'Voulez-vous tracer la topographie du lit ' + & ,'(strate superieure) ? (O/N)' + READ(*,*)REP + IF(REP.EQ.'O'.OR.REP.EQ.'o')THEN + TRGEOML=.TRUE. + WRITE(*,*)'Voulez-vous materialiser sa surface ? (O/N)' + READ(*,*)REP + IF(REP.EQ.'O'.OR.REP.EQ.'o')THEN + TRSURFL=.TRUE. + ELSE + TRSURFL=.FALSE. + ENDIF + ELSE + TRGEOML=.FALSE. + TRSURFL=.FALSE. + ENDIF + WRITE(*,*)'Voulez-vous tracer la topographie de la strate ' + & ,'inferieure du lit (eventuellement inerodable) ? (O/N)' + READ(*,*)REP + IF(REP.EQ.'O'.OR.REP.EQ.'o')THEN + TRGEOMD=.TRUE. + ELSE + TRGEOMD=.FALSE. + ENDIF + WRITE(*,*)'Voulez-vous tracer la topographie du lit initial ' + & ,'? (O/N)' + READ(*,*)REP + IF(REP.EQ.'O'.OR.REP.EQ.'o')THEN + TRGEOMI=.TRUE. + ELSE + TRGEOMI=.FALSE. + ENDIF + WRITE(*,*)'Voulez-vous tracer la surface libre ? (O/N)' + READ(*,*)REP + IF(REP.EQ.'O'.OR.REP.EQ.'o')THEN + TRSL=.TRUE. + WRITE(*,*)'Voulez-vous moirer sa surface ? (O/N)' + READ(*,*)REP + IF(REP.EQ.'O'.OR.REP.EQ.'o')THEN + ASPSL=.TRUE. + ELSE + ASPSL=.FALSE. + ENDIF + ELSE + TRSL=.FALSE. + ASPSL=.FALSE. + ENDIF + WRITE(*,*)'Quel est le titre ? (60 caracteres)' + READ(*,*)COMM + +C Écriture dans 'config-visu' +C----------------------------------------------------------------------- + NOMFIC='config-visu' + OPEN(10,FILE=NOMFIC,STATUS='UNKNOWN') + CHAINE='Minimum des abscisses en long (m)' + WRITE(10,101)XMIN,CHAINE + CHAINE='Maximum des abscisses en long (m)' + WRITE(10,101)XMAX,CHAINE + CHAINE='Compartiment inférieur courant' + IF(TRGEOMD)THEN + WRITE(10,102)1,CHAINE + ELSE + WRITE(10,102)0,CHAINE + ENDIF + CHAINE='Compartiment supérieur initial' + IF(TRGEOMI)THEN + WRITE(10,102)1,CHAINE + ELSE + WRITE(10,102)0,CHAINE + ENDIF + CHAINE='Compartiment supérieur courant' + IF(TRGEOML)THEN + WRITE(10,102)1,CHAINE + ELSE + WRITE(10,102)0,CHAINE + ENDIF + CHAINE='Surface du compartiment supérieur courant' + IF(TRSURFL)THEN + WRITE(10,102)1,CHAINE + ELSE + WRITE(10,102)0,CHAINE + ENDIF + CHAINE='Surface libre / aspect moiré' + IF(TRSL.AND.ASPSL)THEN + WRITE(10,103)1,1,CHAINE + ELSEIF(TRSL.AND..NOT.ASPSL)THEN + WRITE(10,103)1,0,CHAINE + ELSE + WRITE(10,103)0,0,CHAINE + ENDIF + CHAINE='Dir. obs. (rad) [X:-1.57 -Y:0.00 -X:1.57 Y:3.14]' + WRITE(10,101)DIRVUE,CHAINE + CHAINE='X,Y,Z observation (m m m)' + WRITE(10,104)XVUE,YVUE,ZVUE,CHAINE + CHAINE='Largeur du champ de vision (rad)' + WRITE(10,101)LARVUE,CHAINE + WRITE(10,105)COMM + CLOSE(10) + + RETURN +101 FORMAT(F11.3,1X,A50) +102 FORMAT(3X,I1,8X,A50) +103 FORMAT(3X,I1,3X,I1,4X,A50) +104 FORMAT(3(F11.3,1X),A50) +105 FORMAT(A60) + END + + +C----------------------------------------------------------------------- + SUBROUTINE SAITS +C----------------------------------------------------------------------- +C Remplissage du fichier des parametres du transport solide 'ts.etude' +C----------------------------------------------------------------------- + IMPLICIT NONE + INTEGER OPTS,ODCHAR,UNISOL,TYPDEF,CHOIXC,OPTION + & ,DEPOT,CAPASOL,DEFOND,VARCONS + INTEGER DEMIX + CHARACTER ETUDE*20,NOMFIC*38,CHAINE*50 + & ,VERSION*6 + DOUBLE PRECISION ROS,POR,VISC + & ,DCHARG,HALFA,BMIU,DCHARD,DCHARS + & ,MUCASO,TCADIM + + COMMON/ETUDE/ETUDE + +C Récupération des informations +C----------------------------------------------------------------------- + WRITE(*,*)' ' + WRITE(*,*)' ' + WRITE(*,*)'--------------------------------------------------' + WRITE(*,*)' REMPLISSAGE DU FICHIER ts.etude CONTENANT ' + WRITE(*,*)' LES PARAMETRES DU TRANSPORT SOLIDE ' + WRITE(*,*)'--------------------------------------------------' + WRITE(*,*)' ' + WRITE(*,*)' ' + WRITE(*,*)'Rentrez les options de calcul:' +C Le menu de saisie des conditions initiales solides ne permet pas +C d'entrer des concentrations. Donc on reste homogène dans cette version + WRITE(*,*)'- Unites pour les solides' + WRITE(*,*)' - Qs en kg/s ---------> 1' + WRITE(*,*)' - Cs en kg/m3 --------> 2' + READ(*,*)UNISOL +C UNISOL=1 + WRITE(*,*)'- Type de loi de capacite solide' + WRITE(*,*)' - Meyer-Peter&Muller -> 1' + WRITE(*,*)' - Engelund&Hansen ----> 2' + WRITE(*,*)' - Bagnold ------------> 3' + WRITE(*,*)' - Meyer-Peter&Muller+correction contrainte efficace ' + & ,'----------> 4' + WRITE(*,*)' - Meyer-Peter&Muller+contrainte critique ' + & ,'adimensionnelle fixe ----> 5' + WRITE(*,*)' - Meyer-Peter&Muller+correction contrainte efficace+' + WRITE(*,*)' contrainte critique adimensionnelle ' + & ,'fixe -----------> 6' + WRITE(*,*)' - Meyer-Peter&Muller modifie pour cours d eau ' + & ,'polonais ------------> 7' + WRITE(*,*)' - Ackers White -> 8' + WRITE(*,*)' - Smart Jaeggi -> 9' + WRITE(*,*)' - van Rijn -> 10' + WRITE(*,*)' - Rickenmann -> 11' + WRITE(*,*)' - Camenen et Larson -> 12' + WRITE(*,*)' - Schoklitsch -> 13' + WRITE(*,*)' - Sato et al. -> 14' + WRITE(*,*)' - Recking et al. -> 15' + READ(*,*)OPTS + WRITE(*,*)'- Option pour la distance de chargement' + WRITE(*,*)' - Fixe ---------------> 0' + WRITE(*,*)' - Calcul loi de Han --> 1' + write(*,*)' - Wu et Wang ---> 2' + READ(*,*)ODCHAR +C Pour l'instant, la méthode de déformation par les contraintes locales +C (Méthode des Perpendiculaires Confondues) n'est pas disponible +C WRITE(*,*)'- Methode de deformation geometrique de la section' +C WRITE(*,*)' - Synthetique --------> 1' +C WRITE(*,*)' - Contrainte locale --> 2' +C READ(*,*) TYPDEF + TYPDEF=1 + WRITE(*,*)'' + WRITE(*,*)' en cas de depot,vous pouvez choisir' + &,'trois facons de l appliquer' + WRITE(*,*)'' + WRITE(*,*)'- DEPOT 1: dans le lit mineur par couches ' + & ,'horizontales------> 1' + WRITE(*,*)'' + WRITE(*,*)'- DEPOT 2 :dans le lit mineur, depot ' + & ,'uniforme ---------> 2' + WRITE(*,*)'' + WRITE(*,*)'- DEPOT 3: dans le lit mineur, proportionnel' + & ,' a 1/contrainte ----------->3' + WRITE(*,*)'' + WRITE(*,*)'- DEPOT 4: dans le lit mineur,proportionnel a ' + & ,'(contrainte critique-K*contrainte)^(m)' + WRITE(*,*)' K est fonction de min(contrainte critique' + & ,'/contrainte) -------------->4' + WRITE(*,*)'' + WRITE(*,*)'- DEPOT 5: dans le lit mineur,proportionnel a ' + & ,'(contrainte critique-K*contrainte)^(m)' + WRITE(*,*)' K est fonction de moyenne(contrainte critique' + & ,'/contrainte) -------------->5' + WRITE(*,*)'' + WRITE(*,*)'- DEPOT 6: dans le lit mineur,proportionnel a ' + & ,'(contrainte)^(m)' + WRITE(*,*)' m est fonction de la formule de capacité solide ' + & ,'utilisee---------------->6' + READ(*,*) DEPOT + WRITE(*,*)'' + WRITE(*,*)' Avec quelle methode vous voulez calculer ' + & ,'la contrainte hydrodynamique:' + WRITE(*,*)' - Choix 1:MPC ----------------------> 1' + WRITE(*,*)' - Choix 2: formule regime uniforme---------> 2' + WRITE(*,*)' - Choix 3:MPC pente moyenne sur 3 points --> 3' + WRITE(*,*)' - Choix 4:MPC moyenne sur 3 segments ------> 4' + WRITE(*,*)' - Choix 5:MPC moyenne sur lp=h ------------> 5' + WRITE(*,*)' - Choix 6:MPC selon diametre coucheactive -> 6' + READ(*,*) CHOIXC + WRITE(*,*)' Avec quelle methode vous voulez calculer la ' + & ,'contrainte critique:' + WRITE(*,*)' - Option 1:Contrainte critique avec facteur IKDEA ' + & ,'-------> 1' + WRITE(*,*)' - Option 2: Contrainte critique sans facteur IKEDA ' + & ,'------------------> 2' + READ(*,*) OPTION + WRITE(*,*)'' + WRITE(*,*)' Avec quelle methode vous voulez calculer ' + & ,'la capacite solide:' + WRITE(*,*)' - Choix 1:largeur active et debit solide UNITAIRE ' + & ,'sont supposes independants de la repartition des contraintes' + WRITE(*,*)'' + WRITE(*,*)'Attention:cette methode est valable uniquement si vous' + & ,'avez choisi de calculer la contrainte par la formule "regime' + & ,'uniforme" et si la contrainte critique ne depend pas' + & ,'de la pente ----------------------> 1' + WRITE(*,*)'' + WRITE(*,*)' - Choix2: largeur active calculee en fonction de la' + & ,'repartition de la contrainte mais la capacite solide UNITAIRE' + & ,'est fonction de la contrainte moyenne---------> 2' + WRITE(*,*)'' + WRITE(*,*)' - Choix3: largeur active et capacite solide UNITAIRE' + & ,'sont fonction de la repartition des contraintes---------> 3' + READ(*,*) CAPASOL + WRITE(*,*)'' + WRITE(*,*)'Rentrez les parametres:' + WRITE(*,*)'- Viscosite cinematique de l eau (souvent 1.3E-6 m2/s)' + READ(*,*)VISC + WRITE(*,*)'CONTRAINTE CRITIQUE ADIMENSIONNELLE (souvent 0.047)' + read(*,*)TCADIM + WRITE(*,*)'- Masse volumique des sediments (kg/m3)' + READ(*,*)ROS + WRITE(*,*)'- Porosite des sediments (m3/m3)' + READ(*,*)POR + WRITE(*,*)'- tangente de l angle frottement interne des sediments' + READ(*,*)BMIU + IF(ODCHAR.EQ.0)THEN + WRITE(*,*)'- Distance de chargement (m)' + READ(*,*)DCHARG + HALFA=1. + ELSE + WRITE(*,*)'- Parametre de chargement de la loi de Han (m)' + READ(*,*)HALFA + DCHARG=1. + ENDIF + WRITE(*,*)' Effectuer le demixage' + WRITE(*,*)' - Non ----------------> 0' + WRITE(*,*)' - Oui ----------------> 1' + READ(*,*)DEMIX + IF(DEMIX.EQ.1)THEN + WRITE(*,*)'- Distance de chargement pour le demixage des ' + :,'diametres (m)' + READ(*,*)DCHARD + WRITE(*,*)'- Distance de chargement pour le demixage des ' + : ,'étendues granulométriques(m)' + READ(*,*)DCHARS + ENDIF + WRITE(*,*)'- Multiplicateur de la capacite solide (adim)' + READ(*,*)MUCASO + WRITE(*,*)' Deformation du lit' + WRITE(*,*)' - Non ----------------> 0' + WRITE(*,*)' - Oui ----------------> 1' + READ(*,*)DEFOND + WRITE(*,*)' variable hydraulique a conserver' + WRITE(*,*)' - section mouillee et debit------------> 1' + WRITE(*,*)' - niveau d eau et debit----------------> 2' + WRITE(*,*)' - niveau deau et vitesse--------------> 3' + READ(*,*)VARCONS +C Écriture dans 'ts.etude' (au format donné par VERSION) +C----------------------------------------------------------------------- +c VERSION='rube1b' + VERSION=' ' + NOMFIC='ts.'//ETUDE + OPEN(32,FILE=NOMFIC,STATUS='UNKNOWN') + CHAINE='Masse volumique des sediments (kg/m3)' + WRITE(32,101)CHAINE,ROS,VERSION +C WRITE(32,102)CHAINE,ROS + CHAINE='Porosite des sediments (m3/m3)' + WRITE(32,102)CHAINE,POR + CHAINE='Distance de chargement (si fixe) (m)' + WRITE(32,102)CHAINE,DCHARG + CHAINE='Parametre de chargement de la loi de Han (m)' + WRITE(32,102)CHAINE,HALFA + CHAINE='Multiplicateur de la capacite solide (adim)' + WRITE(32,102)CHAINE,MUCASO + CHAINE='Contr.crit.adim. /viscosite ' + WRITE(32,105)CHAINE,TCADIM,VISC + CHAINE='Type de loi de capacite solide (1,2,3,4,5,6,7)' + WRITE(32,103)CHAINE,OPTS + CHAINE='Option pour la distance de chargement (0,1)' + WRITE(32,103)CHAINE,ODCHAR + CHAINE='Choix debits solides / concentrations (1,2)' + WRITE(32,103)CHAINE,UNISOL + CHAINE='Precision reactualisation geometrie (0-4)' + WRITE(32,103)CHAINE,TYPDEF + CHAINE='methode dapplication du depot (1,2,3,4,5,6)' + WRITE(32,103)CHAINE,DEPOT + CHAINE='Choix de calcul de la contrainte (1,2)' + WRITE(32,103)CHAINE,CHOIXC + CHAINE='Option de calcul de la contrainte critique (1,2)' + WRITE(32,103)CHAINE,OPTION + CHAINE='methode de calcul de la capacité solide (1,2,3)' + WRITE(32,103)CHAINE,CAPASOL + CHAINE='tangente angle frottement moyen des sediments' + WRITE(32,102)CHAINE,BMIU + CHAINE='Demixage (0,1)' + WRITE(32,103)CHAINE,DEMIX + CHAINE='deformation du lit (0,1)' + WRITE(32,103)CHAINE,DEFOND + CHAINE='variables a conserver (1,2,3)' + WRITE(32,103)CHAINE,VARCONS + IF(DEMIX.NE.1)THEN + dchard=dcharg + dchars=dcharg + ENDIF + CHAINE='Distance de chargement pour les diametres de sediment (m)' + WRITE(32,102)CHAINE,DCHARD + CHAINE='Distance de chargement pour l etendue granulometrique (m)' + WRITE(32,102)CHAINE,DCHARS + CLOSE(32) + + + RETURN +101 FORMAT(A50,F10.5,A6) +102 FORMAT(A50,F10.5) +103 FORMAT(A50,I1) +104 FORMAT(A50,F10.8) +105 format(a50,f10.5,f10.8) + END + +C----------------------------------------------------------------------- + SUBROUTINE SAICONFIG +C----------------------------------------------------------------------- +C Menu relatif à la configuration du calcul +C----------------------------------------------------------------------- + IMPLICIT NONE + INTEGER CHOIX + +C Affichage du menu de configuration du calcul +C----------------------------------------------------------------------- +30 CONTINUE + WRITE(*,*)' ' + WRITE(*,*)' ' + WRITE(*,*)'--------------------------------------------------' + WRITE(*,*)' MENU DE CONFIGURATION DU CALCUL ' + WRITE(*,*)'--------------------------------------------------' + WRITE(*,*)'Choix 1: parametres de simulation generaux ' + WRITE(*,*)'Choix 2: parametres du transport solide ' + WRITE(*,*)'Choix 0: retour au menu principal ' + WRITE(*,*)'--------------------------------------------------' + WRITE(*,*)' ' + WRITE(*,*)' ' + WRITE(*,*)'Votre choix:' + READ(*,*)CHOIX + +C Ventilation +C----------------------------------------------------------------------- + IF(CHOIX.EQ.1)THEN + CALL SAIDONNEE + GOTO 30 + ELSEIF(CHOIX.EQ.2)THEN + CALL SAITS + GOTO 30 + ELSEIF(CHOIX.EQ.0)THEN + RETURN + ENDIF + WRITE(*,*) 'MAUVAIS CHOIX, RECOMMENCEZ' + GOTO 30 + + END + + +C----------------------------------------------------------------------- + SUBROUTINE CONDLI +C----------------------------------------------------------------------- + IMPLICIT NONE + INTEGER I,NT1,NT2,NT3,NT4,CHOIX,MODFIC + DOUBLE PRECISION QYH(100),YH(100),QTH(1000),TH(1000),HIMP(100) + & ,TA(100),QSTH(100),D(100),S(100) + CHARACTER ETUDE*20,NOMFIC*40 + + COMMON/ETUDE/ETUDE + + 30 WRITE(*,*)' ' + WRITE(*,*)' ' + WRITE(*,*)'------------------------------------------------------' + WRITE(*,*)'MENU POUR LA SAISIE DES CONDITIONS AUX LIMITES ' + WRITE(*,*)'------------------------------------------------------' + WRITE(*,*)'Choix 1: CL aval Q(Z) ou Z(t) condav.',ETUDE + WRITE(*,*)'Choix 2: CL amont Q(t) hydro.',ETUDE + WRITE(*,*)'Choix 3: CL amont Z(t) hamont.',ETUDE + WRITE(*,*)'Choix 4: CL solide amont Qs(t) hydros.',ETUDE + WRITE(*,*)'Choix 0: retour' + WRITE(*,*)'------------------------------------------------------' + WRITE(*,*)' ' + WRITE(*,*)'Donnez votre choix:' + READ(*,*)CHOIX + +C Ventilation +C----------------------------------------------------------------------- + IF(CHOIX.EQ.1)THEN + GOTO 201 + ENDIF + IF(CHOIX.EQ.2)THEN + GOTO 202 + ENDIF + IF(CHOIX.EQ.3)THEN + GOTO 203 + ENDIF + IF(CHOIX.EQ.4)THEN + GOTO 204 + ENDIF + IF(CHOIX.EQ.0)THEN + RETURN + ENDIF + WRITE(*,*) 'MAUVAIS CHOIX, RECOMMENCEZ' + GOTO 30 + +C Remplissage du fichier condav.etu (Q(Z) ou Z(t) à l'aval) +C---------------------------------------------------------- +201 CONTINUE + NOMFIC='condav.'//ETUDE + OPEN(11,FILE=NOMFIC,STATUS='UNKNOWN') + WRITE(*,*)' ' + WRITE(*,*)'Remplissage du fichier CONDAV.ETUDE contenant' + WRITE(*,*)' -> la loi Q(Z) aval si CONDAV=1' + WRITE(*,*)' un seul point avec Q=0. si Z constant' + WRITE(*,*)' -> la loi Z(t) aval si CONDAV=3' + WRITE(*,*)' ' + WRITE(*,*)' 100 points maximum' + WRITE(*,*)' ' + I=0 + +101 I=I+1 + IF(I.EQ.100)THEN + WRITE(*,*) 'Dernier couple de valeurs:' + ELSE + WRITE(*,*) 'Rentrez le ',I,'eme couple (Q,Z) ou (t,Z):' + ENDIF + READ(*,*) QYH(I),YH(I) + WRITE (*,*)'Y a-t-il d''autres valeurs ?' + WRITE(*,*) 'Oui--->1 Non--->0' + READ(*,*)MODFIC + IF(MODFIC.EQ.1)THEN + GOTO 101 + ELSE + NT1=I + WRITE(11,'(I6)')NT1 + DO I=1,NT1 + WRITE(11,'(F15.6,1X,F15.6)')QYH(I),YH(I) + ENDDO + CLOSE(11) + ENDIF + GOTO 30 + +C Remplissage du fichier hydro.etu (loi Q(t) à l'amont) +C------------------------------------------------------ +202 CONTINUE + NOMFIC='hydro.'//ETUDE + OPEN(12,FILE=NOMFIC,STATUS='UNKNOWN') + WRITE(*,*)' ' + WRITE(*,*)'Remplissage du fichier HYDRO.ETUDE contenant' + WRITE(*,*)' la loi Q(t) amont [CONDAM=1]' + WRITE(*,*)' ' + WRITE(*,*)' 100 points maximum' + WRITE(*,*)' ' + I=0 + +102 I=I+1 + IF(I.EQ.1000)THEN + WRITE(*,*) 'Dernier couple de valeurs:' + ELSE + WRITE(*,*) 'Rentrez le ',I,'eme couple (Q,t):' + ENDIF + READ(*,*) QTH(I),TH(I) + WRITE (*,*)'Y a-t-il d''autres valeurs ?' + WRITE(*,*) 'Oui--->1 Non--->0' + READ(*,*)MODFIC + IF(MODFIC.EQ.1)THEN + GOTO 102 + ELSE + NT2=I + WRITE(12,'(I6)')NT2 + DO I=1,NT2 + WRITE(12,'(F15.6,1X,F15.6)')QTH(I),TH(I) + ENDDO + CLOSE(12) + ENDIF + GOTO 30 + +C Remplissage du fichier hamont.etu (loi H(T) à l'amont) +C------------------------------------------------------- +203 CONTINUE + NOMFIC='hamont.'//ETUDE + OPEN(13,FILE=NOMFIC,STATUS='UNKNOWN') + WRITE(*,*)' ' + WRITE(*,*)'Remplissage du fichier HAMONT.ETUDE contenant' + WRITE(*,*)' les cotes d''eau amont Z(t) [REGIME=1]' + WRITE(*,*)' ' + WRITE(*,*)' 100 points maximum' + WRITE(*,*)' ' + I=0 + +103 I=I+1 + IF(I.EQ.100)THEN + WRITE(*,*) 'Dernier couple de valeurs:' + ELSE + WRITE(*,*) 'Rentrez le ',I,'eme couple (Z,t):' + ENDIF + READ(*,*) HIMP(I),TA(I) + WRITE (*,*)'Y a-t-il d''autres valeurs ?' + WRITE(*,*) 'Oui--->1 Non--->0' + READ(*,*)MODFIC + IF(MODFIC.EQ.1)THEN + GOTO 103 + ELSE + NT3=I + WRITE(13,'(I6)')NT3 + DO I=1,NT3 + WRITE(13,'(F15.6,1X,F15.6)')HIMP(I),TA(I) + ENDDO + CLOSE(13) + ENDIF + GOTO 30 + +C Remplissage du fichier hydros.etu (loi Qs(T) à l'amont) +C-------------------------------------------------------- +204 CONTINUE + NOMFIC='hydros.'//ETUDE + OPEN(14,FILE=NOMFIC,STATUS='UNKNOWN') + WRITE(*,*)' ' + WRITE(*,*)'Remplissage du fichier HYDROS.ETUDE contenant' + WRITE(*,*)' la loi Qs,D,S(T) amont' + WRITE(*,*)' Qs: debit solide (kg/s) si <0, alors capacite solide' + WRITE(*,*)' D: diametre reprsentatif (m)' + WRITE(*,*)' S: parametre d''etendue (m/m)' + WRITE(*,*)' ' + WRITE(*,*)' 100 points maximum' + WRITE(*,*)' ' + I=0 + +104 I=I+1 + IF(I.EQ.100)THEN + WRITE(*,*) 'Dernier quadruplet de valeurs:' + ELSE + WRITE(*,*) 'Rentrez le ',I,'eme quadruplet (Qs,T,D,S):' + ENDIF + READ(*,*) QSTH(I),TH(I),D(I),S(I) + WRITE (*,*)'Y a-t-il d''autres valeurs ?' + WRITE(*,*) 'Oui--->1 Non--->0' + READ(*,*)MODFIC + IF(MODFIC.EQ.1)THEN + GOTO 104 + ELSE + NT4=I + WRITE(14,'(I3,A,A)')NT4,' Qs(kg/s) temps(s) ' + & ,'Diam(m) Etend(m/m)' + DO I=1,NT4 + WRITE(14,'(1X,F12.6,1X,G15.6,1X,F12.6,1X,F12.6)')QSTH(I),TH(I) + & ,D(I),S(I) + ENDDO + CLOSE(14) + ENDIF + GOTO 30 + END + +C----------------------------------------------------------------------- + SUBROUTINE DONINI +C----------------------------------------------------------------------- +C Saisie des conditions initiales de la simulation +C----------------------------------------------------------------------- + IMPLICIT NONE + INTEGER LMAX,NCMAX,NSMAX + PARAMETER(LMAX=3000,NCMAX=300,NSMAX=3000) + LOGICAL ENCORE + INTEGER CHOIX,I,J,LL,LM,II,N,NBSECT,NUMSEC,IRET,N2,NC + DOUBLE PRECISION XSECT(NSMAX) + DOUBLE PRECISION XX,XZCOU,XCTDF(LMAX) + DOUBLE PRECISION TMAIL(LMAX),XTMAIL(LMAX) + DOUBLE PRECISION VINIT(LMAX),VINIT0(NSMAX) + DOUBLE PRECISION YINIT(LMAX),YINIT0(NSMAX) + DOUBLE PRECISION HINIT(LMAX),HINIT0(NSMAX) + DOUBLE PRECISION QSINIT(LMAX),QSINIT0(NSMAX) + DOUBLE PRECISION DINIT(LMAX),DINIT0(NSMAX) + DOUBLE PRECISION SINIT(LMAX),SINIT0(NSMAX) + CHARACTER ETUDE*20,NOMFIC*38,AA*1,REP*1 + INTEGER IREPVIT + + COMMON/TMAIL/TMAIL,XTMAIL + COMMON/NBMA/LM + COMMON/ETUDE/ETUDE + +C Lecture du fichier mail +C----------------------------------------------------------------------- + NOMFIC='mail.'//ETUDE + OPEN(20,FILE=NOMFIC,STATUS='OLD',ERR=1000) + READ(20,*)LM + READ(20,*)(TMAIL(I),I=1,LM) + READ(20,*)(XTMAIL(I),I=1,LM-1) + CLOSE(20) + +C Menu +C----------------------------------------------------------------------- + 30 CONTINUE + WRITE(*,*)' ' + WRITE(*,*)' ' + WRITE(*,*)'--------------------------------------------------' + WRITE(*,*)' MENU DE SAISIE DES CONDITIONS INITIALES ' + WRITE(*,*)'--------------------------------------------------' +Cliq WRITE(*,*)'Choix 1: C.I. par zones dans condi0' +Cliq WRITE(*,*)'Choix 2: interpolation des C.I. en condin' + WRITE(*,*)'Choix 1: C.I. liquides par zones dans condi0' + WRITE(*,*)'Choix 2: interpolation des C.I. liquides en condin' + WRITE(*,*)'Choix 3: C.I. solides par zones dans condis0' + WRITE(*,*)'Choix 4: interpolation des C.I. solides en condins' + WRITE(*,*)'Choix 0: retour au menu principal ' + WRITE(*,*)'--------------------------------------------------' + WRITE(*,*)' ' + WRITE(*,*)'Votre choix:' + READ(*,*)CHOIX + +C Ventilation +C----------------------------------------------------------------------- + IF(CHOIX.EQ.1)THEN + GOTO 412 + ELSEIF(CHOIX.EQ.3)THEN + GOTO 414 + ELSEIF(CHOIX.EQ.2)THEN + GOTO 413 + ELSEIF(CHOIX.EQ.4)THEN + GOTO 415 + ELSEIF(CHOIX.EQ.0)THEN + RETURN + ENDIF + WRITE(*,*) 'MAUVAIS CHOIX, RECOMMENCEZ' + GOTO 30 + +C Saisie d'un fichier 'condi0.etude' +C----------------------------------------------------------------------- +C Saisie +412 CONTINUE + write(*,*)'voulez vous rentrer ' + write(*,*)'vitesse ----> 1' + write(*,*)'debit ----> 2 ' + read(*,*)irepvit + If(irepvit.NE.2)IREPVIT=1 + IRET=0 + ENCORE=.TRUE. + NUMSEC=0 + DO WHILE(ENCORE) + + + NUMSEC=NUMSEC+1 + 750 WRITE(*,*)'On est dans la section numero ',NUMSEC + WRITE(*,*)'Donnez l''abscisse de la section' + WRITE(*,*)'-----> XSECT(',NUMSEC,') = ?' + READ (*,*) XSECT(NUMSEC) + +C Vérification + IF(XSECT(NUMSEC).LT.TMAIL(1).OR.XSECT(NUMSEC).GT.TMAIL(LM))THEN + WRITE(*,*)'ATTENTION: Section en dehors du domaine maille' + ENDIF + +C Entrée des données initiales dans la section + WRITE(*,*)'Donnez le tirant d''eau initial (=10000. si retenue)' + WRITE(*,*)'YINIT pour l''abscisse',XSECT(NUMSEC),'?' + READ(*,*) YINIT0(NUMSEC) + IF(YINIT0(NUMSEC).GT.9999.)THEN + WRITE(*,*)'Le fichier geom.etude doit etre defini.' + WRITE(*,*)'En amont et aval de retenue doivent figurer' + WRITE(*,*)'2 sections a la meme abscisse' + IF(NUMSEC.NE.1.AND.IRET.EQ.0 + & .AND.XSECT(NUMSEC).NE.XSECT(NUMSEC-1)) GOTO 750 + WRITE(*,*)'Donnez la cote initiale dans la retenue' + WRITE(*,*)'ZINIT pour l''abscisse',XSECT(NUMSEC) + READ(*,*)HINIT0(NUMSEC) + IRET=1 + ELSE + IF(IRET.EQ.1.AND.YINIT0(NUMSEC-1).GT.9999. + & .AND.XSECT(NUMSEC-1).NE.XSECT(NUMSEC))THEN + WRITE(*,*)'ERREUR: abscisse differente de la section precedente' + GOTO 750 + ENDIF + ENDIF + IF(IREPVIT.EQ.1)THEN + WRITE(*,*)'Donnez la vitesse initiale' +c WRITE(*,*)'Vous pouvez aussi donner le debit initial: dans ce ' +c & ,'cas rentrer ce debit + 1000' + WRITE(*,*)'VINIT pour l''abscisse',XSECT(NUMSEC),'?' + READ(*,*) VINIT0(NUMSEC) + ELSE + WRITE(*,*)'Donnez le debit initial' + WRITE(*,*)'QINIT pour l''abscisse',XSECT(NUMSEC),'?' + READ(*,*) VINIT0(NUMSEC) + VINIT0(NUMSEC)=VINIT0(NUMSEC)+1000. +C fin du if sur vitesse ou debit + ENDIF + IF(NUMSEC.GT.1)THEN + IF(VINIT0(NUMSEC).GT.500..AND.VINIT0(NUMSEC-1).LT.500.)THEN + IF(XSECT(NUMSEC).NE.XSECT(NUMSEC-1))THEN + WRITE(*,*)'ATTENTION les 2 dernieres abscisses ne sont ' + & ,'pas egales alors qu''on passe de VINIT a QINIT.' + WRITE(*,*)'L''interpolation sera mauvaise' + ENDIF + ELSEIF(VINIT0(NUMSEC-1).GT.500..AND.VINIT0(NUMSEC).LT.500.)THEN + IF(XSECT(NUMSEC).NE.XSECT(NUMSEC-1))THEN + WRITE(*,*)'ATTENTION les 2 dernieres abscisses ne sont ' + & ,'pas egales alors qu''on passe de QINIT a VINIT.' + WRITE(*,*)'L''interpolation sera mauvaise' + ENDIF + ENDIF + ENDIF + +C Fin de la saisie pour la section + WRITE(*,*)'Y a-t-il d''autres sections ? (O/N)' + READ(*,'(A1)')REP + IF((REP.EQ.'N').OR.(REP.EQ.'n')) ENCORE=.FALSE. + ENDDO + NBSECT=NUMSEC + +C Ecriture dans 'condi0.etude' + WRITE(*,*)' ' + WRITE(*,*)'Voulez-vous sauvegarder dans un fichier condi0.' + & ,ETUDE,' ? (O/N)' + READ(*,'(A1)')REP + IF((REP.EQ.'O').OR.(REP.EQ.'o'))THEN + NOMFIC='condi0.'//ETUDE + OPEN(32,FILE=NOMFIC,STATUS='UNKNOWN') + DO J=1,NBSECT + WRITE(32,*) XSECT(J),YINIT0(J),VINIT0(J),HINIT0(J) + ENDDO + CLOSE(32) + ENDIF + +C Interpolation dans 'condin.etude' +C----------------------------------------------------------------------- +C Introduction + WRITE(*,*)' ' + WRITE(*,*)'Voulez-vous interpoler dans un fichier condin.' + & ,ETUDE,' ? (O/N)' + READ(*,'(A1)')REP + IF((REP.EQ.'N').OR.(REP.EQ.'n')) GOTO 30 +413 CONTINUE + +C Lecture des données par zone + IRET=0 + NOMFIC='condi0.'//ETUDE + OPEN(52,FILE=NOMFIC,STATUS='OLD',ERR=1000) + NBSECT=0 + NUMSEC=0 + DO WHILE(.TRUE.) + NUMSEC=NUMSEC+1 + IF(NUMSEC.GT.NSMAX)THEN + WRITE(*,*)'LE FICHIER CONDI0 CONTIENT PLUS DE',NSMAX,'POINTS' + WRITE(*,*)'LES POINTS SUPPLEMENTAIRES NE SONT PAS PRIS' + GOTO 441 + ENDIF + READ(52,*,END=441) XSECT(NUMSEC),YINIT0(NUMSEC),VINIT0(NUMSEC) + & ,HINIT0(NUMSEC) + ENDDO +441 CONTINUE + NBSECT=NUMSEC-1 + CLOSE(52) + DO NUMSEC=1,NBSECT + IF(YINIT0(NUMSEC).GT.9999.) IRET=1 + ENDDO + +C Interpolation aux centremailles + DO J=1,NBSECT-1 + IF(XSECT(J).GT.XSECT(J+1))THEN + WRITE(*,*)'ABSCISSES NON CROISSANTES DANS condi0' + STOP + ENDIF + ENDDO + CALL INTERP(XSECT,NBSECT,YINIT,YINIT0) + CALL INTERP(XSECT,NBSECT,VINIT,VINIT0) + IF(IRET.EQ.1) CALL INTERP(XSECT,NBSECT,HINIT,HINIT0) + +C Écriture dans condin.etu + N=23 + NOMFIC='condin.'//ETUDE + OPEN(N,FILE=NOMFIC,STATUS='UNKNOWN') + WRITE(*,*)LM,' centremailles' + WRITE(N,*)'0. ',LM + IF(IRET.EQ.1)THEN + N2=21 + NOMFIC='geomac-i.'//ETUDE + OPEN(N2,FILE=NOMFIC,STATUS='OLD') + READ(N2,*)LL + DO J=1,LL + READ(N2,*)II,XX,NC + XCTDF(J)=9999. + DO I=1,NC + READ(N2,'(A1,1X,F11.5,1X,F11.5)')AA,XX,XZCOU + IF(XZCOU.LT.XCTDF(J)) XCTDF(J)=XZCOU + ENDDO + ENDDO + IF(YINIT(1).GT.9999.)THEN + YINIT(1)=HINIT(1)-XCTDF(1) + IF(YINIT(1).LT.0.) YINIT(1)=0. + ENDIF + DO J=2,LM-1 + IF(YINIT(J).GT.9999.)THEN + YINIT(J)=HINIT(J)-.5*(XCTDF(J-1)+XCTDF(J)) + IF(YINIT(J).LT.0.) YINIT(J)=0. + ENDIF + ENDDO + IF(YINIT(LM).GT.9999.)THEN + YINIT(LM)=HINIT(LM)-XCTDF(LL) + IF(YINIT(LM).LT.0.) YINIT(LM)=0. + ENDIF + CLOSE(N2) + ENDIF + DO I=1,LM + WRITE(N,*)I,YINIT(I),VINIT(I) + ENDDO + CLOSE(N) + GOTO 30 + +C Saisie d'un fichier 'condis0.etude' +C----------------------------------------------------------------------- +C Saisie +414 CONTINUE + ENCORE=.TRUE. + NUMSEC=0 + DO WHILE(ENCORE) + NUMSEC=NUMSEC+1 + 751 WRITE(*,*)'On est dans la section numero ',NUMSEC + WRITE(*,*)'Donnez l''abscisse de la section' + WRITE(*,*)'-----> XSECT(',NUMSEC,') = ?' + READ (*,*) XSECT(NUMSEC) + +C Vérification + IF(XSECT(NUMSEC).LT.TMAIL(1).OR.XSECT(NUMSEC).GT.TMAIL(LM))THEN + WRITE(*,*)'ATTENTION: section en dehors du domaine maille' + ENDIF + +C Entrée des données initiales dans la section + WRITE(*,*)'Donnez le debit solide massique (kg/s)' + WRITE(*,*)'QSINIT pour l''abscisse',XSECT(NUMSEC),'?' + READ(*,*) QSINIT0(NUMSEC) +c IF(QSINIT0(NUMSEC).LT.0.)THEN +c WRITE(*,*)'ERREUR: la valeur doit etre positive. Recommencez. +c GOTO 751 +c ENDIF + + WRITE(*,*)'Donnez le diametre representatif (m)' + WRITE(*,*)'DINIT pour l''abscisse',XSECT(NUMSEC),'?' + READ(*,*) DINIT0(NUMSEC) + IF(DINIT0(NUMSEC).LT.0.)THEN + WRITE(*,*)'ERREUR: la valeur doit etre positive. Recommencez.' + GOTO 751 + ENDIF + + WRITE(*,*)'Donnez le parametre d''etendue granulometrique (m/m)' + WRITE(*,*)'SINIT pour l''abscisse',XSECT(NUMSEC),'?' + READ(*,*) SINIT0(NUMSEC) + IF(SINIT0(NUMSEC).LT.0.)THEN + WRITE(*,*)'ERREUR: la valeur doit etre positive. Recommencez.' + GOTO 751 + ENDIF + +C Fin de la saisie pour la section + WRITE(*,*)'Y a-t-il d''autres sections ? (O/N)' + READ(*,'(A1)')REP + IF((REP.EQ.'N').OR.(REP.EQ.'n')) ENCORE=.FALSE. + ENDDO + NBSECT=NUMSEC + +C Ecriture dans condis0.etu +C-------------------------- + WRITE(*,*)' ' + WRITE(*,*)'Voulez-vous sauvegarder dans un fichier condis0.' + & ,ETUDE,' ? (O/N)' + READ(*,'(A1)')REP + IF((REP.EQ.'O').OR.(REP.EQ.'o'))THEN + NOMFIC='condis0.'//ETUDE + OPEN(32,FILE=NOMFIC,STATUS='UNKNOWN') + DO J=1,NBSECT + WRITE(32,*)XSECT(J),QSINIT0(J),DINIT0(J),SINIT0(J) + & ,' X(m) Qs(kg/s) D(m) S(m/m)' + ENDDO + CLOSE(32) + ENDIF + +C Interpolation dans 'condins.etude' +C----------------------------------------------------------------------- +C Introduction + WRITE(*,*)' ' + WRITE(*,*)'Voulez-vous interpoler dans un fichier condins.' + & ,ETUDE,' ? (O/N)' + READ(*,'(A1)')REP + IF((REP.EQ.'N').OR.(REP.EQ.'n')) GOTO 30 +415 CONTINUE + +C Lecture des données par zone + N=52 + NOMFIC='condis0.'//ETUDE + OPEN(N,FILE=NOMFIC,STATUS='OLD',ERR=1000) + NBSECT=0 + NUMSEC=0 + DO WHILE(.TRUE.) + NUMSEC=NUMSEC+1 + IF(NUMSEC.GT.NSMAX)THEN + WRITE(*,*)'LE FICHIER CONDIS0 CONTIENT PLUS DE',NSMAX,'POINTS' + WRITE(*,*)'LES POINTS SUPPLEMENTAIRES NE SONT PAS PRIS' + GOTO 443 + ENDIF + READ(N,*,END=443)XSECT(NUMSEC),QSINIT0(NUMSEC),DINIT0(NUMSEC) + & ,SINIT0(NUMSEC) + ENDDO +443 NBSECT=NUMSEC-1 + CLOSE(N) + +C Interpolation aux intermailles + DO J=1,NBSECT-1 + IF(XSECT(J).GT.XSECT(J+1))THEN + WRITE(*,*)'ABSCISSES NON CROISSANTES DANS condis0' + STOP + ENDIF + ENDDO + CALL INTER2(XSECT,NBSECT,QSINIT,QSINIT0) + CALL INTER2(XSECT,NBSECT,DINIT,DINIT0) + CALL INTER2(XSECT,NBSECT,SINIT,SINIT0) + +C Ecriture dans condins.etu + N=23 + NOMFIC='condins.'//ETUDE + OPEN(N,FILE=NOMFIC,STATUS='UNKNOWN') + WRITE(*,*)LM-1,' intermailles' + WRITE (N,*)' 0. NoIM Qs(kg/s) D(m) S(m/m)' + DO I=1,LM-1 + WRITE(N,*)I,QSINIT(I),DINIT(I),SINIT(I) + ENDDO + CLOSE(N) + GOTO 30 + +C Traitement des erreurs +C----------------------------------------------------------------------- + 1000 CONTINUE + WRITE(*,*)' ' + WRITE(*,*)'ERREUR sur le fichier ',NOMFIC + WRITE(*,*)'Le fichier n''existe pas ou est illisible' + WRITE(*,*)'Tapez <entree>' + READ(*,*) + RETURN + END + + + +C-----------------------------------------------------------C + SUBROUTINE DXCONS +C-----------------------------------------------------------C +C SON ROLE : selection d'un maillage de pas constant C +C-----------------------------------------------------------C +C IMPLICIT NONE + INTEGER LMAX + PARAMETER (LMAX=3000) + + INTEGER I,LM,CHOIXM,N + CHARACTER*38 NOMFIC,ETUDE*20 + DOUBLE PRECISION DX,TMAIL(LMAX),XZERO,XTMAIL(LMAX) + + COMMON/TMAIL/TMAIL,XTMAIL + COMMON/NBMA/LM + COMMON/ETUDE/ETUDE + + 5000 WRITE (*,*) 'DONNEZ LE PAS D ESPACE DX' + WRITE (*,*) '----> DX = ?' + READ (*,*) DX + + WRITE (*,*) 'DONNEZ LE NOMBRE DE POINTS DE CALCUL LM' + WRITE (*,*) '( LA DISTANCE TOTALE EST:(LM-2)*DX )' + WRITE (*,*) '----> LM = ?' + READ (*,*) LM + IF(LM.GT.LMAX)THEN + WRITE(*,*)'LE NOMBRE DE MAILLES EST LIMITE A',LMAX + GO TO 5000 + ENDIF + +C -- SAISIE DE L'ABSCISSE INITIALE + WRITE (*,*) 'DONNEZ L ABSCISSE DU PREMIER POINT' + WRITE (*,*) '----> XZERO = ?' + READ (*,*) XZERO + +C -- DOUBLE PRECISIONISATION DU TABLEAU TMAIL DE DIMENSION LM ET CONTENA +C ---- LES ABSCISSES DES POINTS DE CALCUL + + TMAIL(1)=XZERO + XTMAIL(1)=XZERO + DO 10 I=2,LM-1 + TMAIL(I)=DX*(FLOAT(I)-1.5)+XZERO + XTMAIL(I)=DX*(FLOAT(I)-1.)+XZERO +10 CONTINUE + TMAIL(LM)=XTMAIL(LM-1) +C TMAIL(LM)=FLOAT(LM-2)*DX+XZERO + WRITE(*,*)'LE DERNIER POINT EST D''ABSCISSE',TMAIL(LM) + +C -- ECRITURE DU FICHIER MAIL0.ETUDE +C--------------------------------------- + + WRITE(*,*) 'VOULEZ VOUS SAUVEGARDER DANS UN FICHIER mail0.' + +,ETUDE,'?' + WRITE(*,*) ' OUI --> 1 NON --> 0' + READ (*,*) CHOIXM + + IF (CHOIXM.EQ.1) THEN + N=30 + NOMFIC='mail0.'//ETUDE + OPEN(N,FILE=NOMFIC,STATUS='UNKNOWN') + + WRITE(N,*) XZERO,DX,DX + WRITE(N,*) TMAIL(LM),DX,DX + + CLOSE(N) + ENDIF + +C -- ECRITURE DU FICHIER MAIL.ETUDE + CALL ECRIMA + + END + + +C-------------------------------------------------------------C + SUBROUTINE DXVARE +C-------------------------------------------------------------C +C SON ROLE : selection d'un maillage à pas variables C +C de pas d'espace variant lineairement entre C +C deux sections, une de debut et une de fin C +C-------------------------------------------------------------C +C IMPLICIT NONE + INTEGER LMAX,NSMAX + + PARAMETER (LMAX=3000,NSMAX=3000) + + INTEGER ENCORE,N,NBSECT,NPAS,NUMSEC + + DOUBLE PRECISION DXSECT(NSMAX),LONGSE,DXSEC2(NSMAX) + DOUBLE PRECISION XSECT(NSMAX) + + CHARACTER ETUDE*20,NOMFIC*38 + + COMMON/ETUDE/ETUDE + + N=30 + NOMFIC='mail0.'//ETUDE + OPEN(N,FILE=NOMFIC,STATUS='UNKNOWN') +C 1)-->ENTREE DES SECTIONS ET DU PAS D'ESPACE CORRESPONDANT +C--------------------------------------------------------------- +C -------------- NBSECT = NOMBRE DE SECTEURS ------------------C +C--------------- NUMSEC = NUMERO DU SECTEUR -------------------C + + WRITE (*,*) 'DONNEZ L ABSCISSE DE DEPART' + WRITE (*,*) '----> XSECT(1) = ?' + READ (*,*) XSECT(1) + NUMSEC=0 +10 NUMSEC=NUMSEC+1 + WRITE (*,*) 'ON EST DANS LE SECTEUR NUMERO ',NUMSEC + WRITE (*,*) 'DONNEZ L ABSCISSE DE L EXTREMITE AVAL DU SECTEUR' + WRITE (*,*) '----> XSECT(',NUMSEC + 1,') = ?' + READ (*,*) XSECT(NUMSEC+1) + +C ---- VERIFICATION ABSCISSE + IF(XSECT(NUMSEC+1).LE.XSECT(NUMSEC)) THEN + WRITE(*,*) 'XSECT EST TROP PETIT' + WRITE(*,*) 'RECOMMENCEZ' + NUMSEC=NUMSEC-1 + GOTO 10 + ENDIF + +20 WRITE(*,*) 'DONNEZ LE PAS D ESPACE DX DESIRE AMONT SECTEUR' + WRITE(*,*) '----> DXSECT(',NUMSEC,') = ?' + READ (*,*) DXSECT(NUMSEC) +C ---- VERIFICATION PAS D'ESPACE + IF(DXSECT(NUMSEC).GT.(XSECT(NUMSEC+1)-XSECT(NUMSEC))) THEN + WRITE(*,*) 'DXSECT EST TROP GRAND' + WRITE (*,*) 'RECOMMENCEZ' + GOTO 20 + ENDIF + 21 WRITE(*,*) 'DONNEZ LE PAS D ESPACE DX DESIRE AVAL SECTEUR' + WRITE(*,*) '----> DXSEC2(',NUMSEC,') = ?' + READ (*,*) DXSEC2(NUMSEC) +C ---- VERIFICATION PAS D'ESPACE + IF(DXSEC2(NUMSEC).GT.(XSECT(NUMSEC+1)-XSECT(NUMSEC))) THEN + WRITE(*,*) 'DXSEC2 EST TROP GRAND' + WRITE (*,*) 'RECOMMENCEZ' + GOTO 21 + ENDIF + WRITE(N,*) XSECT(NUMSEC),DXSECT(NUMSEC),DXSEC2(NUMSEC) + + +11 WRITE(*,*) 'Y A T IL D AUTRES SECTEURS ?' + WRITE(*,*) ' OUI --> 1 NON --> 0' + READ (*,*) ENCORE + IF (ENCORE.EQ.1)THEN + GOTO 10 + ELSE IF(ENCORE.NE.0)THEN + WRITE(*,*) 'ERREUR DE REPONSE' + GO TO 11 + ENDIF + NBSECT=NUMSEC + WRITE(N,'(3F15.3)')XSECT(NBSECT+1),DXSECT(NBSECT),DXSEC2(NBSECT) + +C 2)--> ON CALCULE LE NOMBRE DE MAILLES ENTIER +C--------------------------------------------------------------- + + WRITE(*,*) 'VOUS AVEZ RENTRE ',NBSECT,' SECTEURS' + WRITE(*,*) 'CALCUL DU NOMBRE DE MAILLES' + + DO 30 NUMSEC=1,NBSECT + LONGSE=XSECT(NUMSEC+1)-XSECT(NUMSEC) + NPAS=NINT(2.*LONGSE/(DXSECT(NUMSEC)+DXSEC2(NUMSEC))) +C DXSECT(NUMSEC)=LONGSE/FLOAT(NPAS) + WRITE(*,*) 'SECTEUR NUMERO',NUMSEC, + :' DEBUT EN',XSECT(NUMSEC),' FIN EN',XSECT(NUMSEC+1), + : ' PAS D''ESPACE MOYEN ',LONGSE/FLOAT(NPAS), + : ' NOMBRE DE MAILLES ',NPAS +30 CONTINUE + +C 3)--> ECRITURE DU FICHIER MAIL0.ETUDE +C--------------------------------------- + +C WRITE(*,*) 'VOULEZ VOUS SAUVEGARDER DANS UN FICHIER MAIL0.' +C +,ETUDE,'?' +C WRITE(*,*) ' OUI --> 1 NON --> 0' +C READ (*,*) CHOIXM + + +C IF (CHOIXM.EQ.1) THEN +C N=30 +C NOMFIC='MAIL0.'//ETUDE +C OPEN(N,FILE=NOMFIC,STATUS='UNKNOWN') +C DO 40 J=1,NBSECT +C WRITE(N,*) XSECT(J),DXSECT(J),DXSEC2(J) +C40 CONTINUE +C WRITE(N,*) XSECT(NBSECT+1),DXSECT(NBSECT),DXSEC2(NBSECT) + + CLOSE(N) +C ENDIF + +C 4)--> DOUBLE PRECISIONISATION DU MAILLAGE +C-------------------------------- + + CALL RELTMA(XSECT,DXSECT,DXSEC2,NBSECT) + CALL ECRIMA + + END + + +C----------------------------------------------------------------------- + SUBROUTINE DXVARL +C----------------------------------------------------------------------- +C SON ROLE : le fichier de maillage existant il ne reste plus +C qu'à interpoler +C----------------------------------------------------------------------- +C IMPLICIT NONE + INTEGER LMAX,NSMAX + + PARAMETER (LMAX=3000,NSMAX=3000) + + INTEGER N,NBSECT,NUMSEC + + DOUBLE PRECISION DXSECT(NSMAX),DXSEC2(NSMAX) + DOUBLE PRECISION XSECT(NSMAX) + + CHARACTER ETUDE*20,NOMFIC*38 + + COMMON/ETUDE/ETUDE + +C 1)--> LECTURE DE MAIL0.ETUDE ET RECUPERATION DES VARIABLES +C------------------------------------------------------------ + + N=30 + NOMFIC='mail0.'//ETUDE + OPEN(N,FILE=NOMFIC,STATUS='OLD') + + NBSECT=0 + NUMSEC=0 +10 NUMSEC=NUMSEC+1 +C READ(N,'(A80)',END=20)CHAIN +C READ(CHAIN,'(3F15.3)')XSECT(NUMSEC),DXSECT(NUMSEC),DXSEC2(NUMSEC + READ(N,*,END=20)XSECT(NUMSEC),DXSECT(NUMSEC),DXSEC2(NUMSEC) +C IF(DXSEC2(NUMSEC).EQ.0.)DXSEC2(NUMSEC)=DXSECT(NUMSEC) + GOTO 10 +20 NBSECT=NUMSEC-2 + + CLOSE(N) + +C 2)-->INTERPOLATION +C--------------------- + + CALL RELTMA(XSECT,DXSECT,DXSEC2,NBSECT) + CALL ECRIMA + + END + + +C------------------------------------------------------------------C + SUBROUTINE ECRIMA +C------------------------------------------------------------------C +C SON ROLE : ecriture du maillage dans le fichier mail.etude C +C------------------------------------------------------------------C +C IMPLICIT NONE + INTEGER LMAX + PARAMETER(LMAX=3000) + + INTEGER I,LM,N + DOUBLE PRECISION TMAIL(LMAX),XTMAIL(LMAX) + CHARACTER ETUDE*20,NOMFIC*38 + + COMMON/ETUDE/ETUDE + COMMON/TMAIL/TMAIL,XTMAIL + COMMON/NBMA/LM + +10 N=20 + IF(LM.GT.LMAX)THEN + WRITE(*,*)'LE NOMBRE DE MAILLES EST LIMITE A',LMAX + WRITE(*,*)'RECOMMENCEZ LA SAISIE DU MAILLAGE' + RETURN + ENDIF + NOMFIC='mail.'//ETUDE + OPEN(N,FILE=NOMFIC,STATUS='UNKNOWN') +C WRITE (*,*) LM +C WRITE (*,*) (TMAIL(I),I=1,LM) + WRITE (N,*) LM + WRITE (N,*) (TMAIL(I),I=1,LM) + WRITE (N,*) (XTMAIL(I),I=1,LM-1) + CLOSE(N) + RETURN + END + +C----------------------------------------------------------------------- + SUBROUTINE FROTTE +C----------------------------------------------------------------------- +C Menu relatif aux frottements +C----------------------------------------------------------------------- + IMPLICIT NONE + INTEGER CHOIX + CHARACTER ETUDE*20,NOMFIC0*40,NOMFIC*40,TYPLIT*10 + + COMMON/ETUDE/ETUDE + +C Affichage du menu +C----------------------------------------------------------------------- +30 CONTINUE + WRITE(*,*)' ' + WRITE(*,*)' ' + WRITE(*,*)'--------------------------------------------------' + WRITE(*,*)' MENU DE SAISIE DES FROTTEMENTS (STRICKLER) ' + WRITE(*,*)'--------------------------------------------------' + WRITE(*,*)'Choix 1: saisie par zones des coefficients de ' + WRITE(*,*)' Strickler du lit mineur dans frot0 ' + WRITE(*,*)'Choix 2: saisie par zones des coefficients de ' + WRITE(*,*)' Strickler du lit moyen dans frot20 ' + WRITE(*,*)'Choix 3: interpolation des coefficients de ' + WRITE(*,*)' Strickler du lit mineur dans frot ' + WRITE(*,*)'Choix 4: interpolation des coefficients de ' + WRITE(*,*)' Strickler du lit moyen dans frot2 ' + WRITE(*,*)'Choix 0: retour au menu principal ' + WRITE(*,*)'--------------------------------------------------' + WRITE(*,*)' ' + WRITE(*,*)' ' + WRITE(*,*)'Votre choix:' + READ(*,*)CHOIX + +C Ventilation +C----------------------------------------------------------------------- + IF(CHOIX.EQ.1)THEN + NOMFIC0='frot0.'//ETUDE + NOMFIC='frot.'//ETUDE + TYPLIT='lit mineur' + CALL FROTT0(TYPLIT,NOMFIC0,NOMFIC) + GOTO 30 + ELSEIF(CHOIX.EQ.2)THEN + NOMFIC0='frot20.'//ETUDE + NOMFIC='frot2.'//ETUDE + TYPLIT='lit moyen' + CALL FROTT0(TYPLIT,NOMFIC0,NOMFIC) + GOTO 30 + ELSEIF(CHOIX.EQ.3)THEN + NOMFIC0='frot0.'//ETUDE + NOMFIC='frot.'//ETUDE + TYPLIT='lit mineur' + CALL FROTT(TYPLIT,NOMFIC0,NOMFIC) + GOTO 30 + ELSEIF(CHOIX.EQ.4)THEN + NOMFIC0='frot20.'//ETUDE + NOMFIC='frot2.'//ETUDE + TYPLIT='lit moyen' + CALL FROTT(TYPLIT,NOMFIC0,NOMFIC) + GOTO 30 + ELSEIF(CHOIX.EQ.0)THEN + RETURN + ENDIF + WRITE(*,*) 'MAUVAIS CHOIX, RECOMMENCEZ' + GOTO 30 + END + + +C----------------------------------------------------------------------- + SUBROUTINE FROTT0(TYPLIT,NOMFIC0,NOMFIC) +C----------------------------------------------------------------------- +C Saisie des frottements par zones +C----------------------------------------------------------------------- +C TYPLIT indique le type de lit (mineur ou moyen) +C NOMFIC0 le nom du fichier de sauvegarde de la saisie par zones +C NOMFIC le nom du fichier de sauvegarde des données interpolées +C----------------------------------------------------------------------- + IMPLICIT NONE + INTEGER NSMAX + PARAMETER (NSMAX=3000) + LOGICAL ENCORE + INTEGER I,NBSECT + DOUBLE PRECISION XSECT(NSMAX),FROT0(NSMAX) + CHARACTER TYPLIT*10,NOMFIC0*40,NOMFIC*40,REP*1 + +C Initialisation +C----------------------------------------------------------------------- + ENCORE=.TRUE. + I=0 + WRITE(*,*)' ' + WRITE(*,*)'SAISIE PAR ZONES DES COEFFICIENTS DE STRICKLER' + WRITE(*,*)'On est dans le ',TYPLIT + WRITE(*,*)' ' + +C Saisie des largeurs actives par zones +C----------------------------------------------------------------------- + WRITE(*,*)' ' + WRITE(*,*)'ATTENTION: Les abscisses doivent etre croissantes.' + DO WHILE(ENCORE) + I=I+1 + WRITE(*,*)' ' + 1001 CONTINUE + WRITE(*,*)'Entrez le couple abscisse (m) - Strickler (m(1/3)/s)' + & ,' numero ',I + READ(*,*)XSECT(I),FROT0(I) + IF((I.GT.1).AND.(XSECT(I).LE.XSECT(I-1)))THEN + WRITE(*,*)'ATTENTION: abscisse non croissante. Recommencez.' + GOTO 1001 + ENDIF + IF(FROT0(I).LT.0.)THEN + WRITE(*,*)'ATTENTION: le Strickler ne peut pas etre negatif. ' + & ,'Recommencez.' + GOTO 1001 + ENDIF + WRITE(*,*)'Y-a-il un autre couple ? (O/N)' + READ(*,'(A1)')REP + IF((REP.EQ.'N').OR.(REP.EQ.'n')) ENCORE=.FALSE. + ENDDO + NBSECT=I + +C Écriture du fichier de données par zones +C----------------------------------------------------------------------- + OPEN(20,FILE=NOMFIC0,STATUS='UNKNOWN') + DO I=1,NBSECT + WRITE(20,120)XSECT(I),FROT0(I) + ENDDO + CLOSE(20) + WRITE(*,*)' ' + WRITE(*,*)'Ecriture du fichier ',NOMFIC0 + +C Interpolation éventuelle +C----------------------------------------------------------------------- + WRITE(*,*)' ' + WRITE(*,*)'Voulez-vous interpoler pour le ',TYPLIT,' ? (O/N)' + READ(*,'(A1)')REP + IF((REP.EQ.'O').OR.(REP.EQ.'o')) CALL FROTT(TYPLIT,NOMFIC0,NOMFIC) + + RETURN + 120 FORMAT(1X,F11.3,1X,F11.5) + END + + +C----------------------------------------------------------------------- + SUBROUTINE FROTT(TYPLIT,NOMFIC0,NOMFIC1) +C----------------------------------------------------------------------- +C Interpolation des frottements +C----------------------------------------------------------------------- +C TYPLIT indique le type de lit (mineur ou moyen) +C NOMFIC0 le nom du fichier de sauvegarde de la saisie par zones +C NOMFIC le nom du fichier de sauvegarde des données interpolées + IMPLICIT NONE + INTEGER LMAX,NSMAX + PARAMETER(LMAX=3000,NSMAX=3000) + INTEGER I,LM,NBSECT,NUMSEC + DOUBLE PRECISION XSECT(NSMAX),FROT(LMAX),FROT0(NSMAX) + DOUBLE PRECISION TMAIL(LMAX),XTMAIL(LMAX) + CHARACTER ETUDE*20,TYPLIT*10,NOMFIC*40,NOMFIC0*40,NOMFIC1*40 + + COMMON/ETUDE/ETUDE + COMMON/TMAIL/TMAIL,XTMAIL + COMMON/NBMA/LM + +C Lecture du fichier de maillage +C----------------------------------------------------------------------- + NOMFIC='mail.'//ETUDE + OPEN(20,FILE=NOMFIC,STATUS='OLD',ERR=1000) + READ(20,*)LM + READ(20,*)(TMAIL(I),I=1,LM) + READ(20,*)(XTMAIL(I),I=1,LM-1) + CLOSE(20) + +C Lecture du fichier de frottements par zones +C----------------------------------------------------------------------- + NOMFIC=NOMFIC0 + OPEN(30,FILE=NOMFIC,STATUS='OLD',ERR=1000) + NUMSEC=1 + DO WHILE(.TRUE.) + READ(30,*,END=300)XSECT(NUMSEC),FROT0(NUMSEC) + NUMSEC=NUMSEC+1 + ENDDO + 300 CONTINUE + NBSECT=NUMSEC-1 + CLOSE(30) + +C Interpolation +C----------------------------------------------------------------------- + CALL INTERP(XSECT,NBSECT,FROT,FROT0) + +C Écriture du fichier interpolé +C----------------------------------------------------------------------- + NOMFIC=NOMFIC1 + OPEN(20,FILE=NOMFIC,STATUS='UNKNOWN') + WRITE(20,131)LM + DO I=1,LM + WRITE(20,132)I,FROT(I) + ENDDO + CLOSE(20) + WRITE(*,*)' ' + WRITE(*,*)'Pour le ',TYPLIT,', ecriture du fichier ',NOMFIC + RETURN + +C Traitement des erreurs +C----------------------------------------------------------------------- + 1000 CONTINUE + WRITE(*,*)' ' + WRITE(*,*)'ERREUR sur le fichier ',NOMFIC + WRITE(*,*)'Le fichier n''existe pas ou est illisible' + WRITE(*,*)'Tapez <entree>' + READ(*,*) + RETURN + + 131 FORMAT(1X,I4) + 132 FORMAT(1X,I4,1X,F11.5) + END + + +C------------------------------------------------------------------ + SUBROUTINE INTERP(XS,NS,Y,Y0) +C------------------------------------------------------------------ +C SON ROLE : interpoler y0 (-->y) entre deux sections C +C correspondant aux points de maillage XS C +C entrees : C +C C +C ---- LM EST LE NOMBRE DE MAILLE C +C ---- NS LE NOMBRE DES SECTIONS DE DONNEE C +C ---- TMAIL LES ABSCISSES DES POINTS DU MAILLAGE C +C ---- XS LES ABSCISSES DES SECTIONS DE DONNEE C +C ---- Y0 VALEUR AUX SECTIONS DE LA VARIABLE A INTERPOLER C +C C +C sorties : C +C C +C ---- Y VALEUR AUX POINTS DE MAILLAGE DE LA VARIABLE C +C A INTERPOLER C +C C +C-----------------------------------------------------------------C +C IMPLICIT NONE + + INTEGER LMAX,NSMAX + PARAMETER(LMAX=3000,NSMAX=3000) + + INTEGER J,LM,N,NS,N0,N3 + + DOUBLE PRECISION TMAIL(LMAX),XS(NSMAX),Y(LMAX),Y0(NSMAX) + :,XTMAIL(LMAX) + + COMMON/TMAIL/TMAIL,XTMAIL + COMMON/NBMA/LM + + IF (NS.EQ.1)THEN + DO 7 J=1,LM + Y(J)=Y0(1) +7 CONTINUE + ELSE + N3=1 + DO 8 J=1,LM + N0=N3 + DO 9 N=N0,NS + IF (TMAIL(J).LT.XS(N)) THEN + IF(N.EQ.1)THEN + Y(J)=Y0(1) + ELSE + Y(J)=Y0(N-1)+(TMAIL(J)-XS(N-1))*(Y0(N)-Y0(N-1))/(XS(N)-XS(N-1)) + ENDIF + N3=N + GO TO 8 + ENDIF +9 CONTINUE + Y(J)=Y0(NS) + N3=NS+1 +8 CONTINUE + + + ENDIF + RETURN + END + + + +C------------------------------------------------------------------ + SUBROUTINE INTER2(XS,NS,Y,Y0) +C------------------------------------------------------------------ +C SON ROLE : interpoler y0 (-->y) entre deux sections C +C correspondant aux points de maillage XS C +C entrees : C +C C +C ---- LM EST LE NOMBRE DE MAILLES C +C ---- NS LE NOMBRE DES SECTIONS DE DONNEE C +C ---- XTMAIL LES ABSCISSES DES INTERMAILLES C +C ---- XS LES ABSCISSES DES SECTIONS DE DONNEE C +C ---- Y0 VALEUR AUX SECTIONS DE LA VARIABLE A INTERPOLER C +C C +C sorties : C +C C +C ---- Y VALEUR DE LA VARIABLE A INTERPOLER C +C AUX POINTS DE MAILLAGE (INTERMAILLES) C +C C +C-----------------------------------------------------------------C +C IMPLICIT NONE + + INTEGER LMAX,NSMAX + PARAMETER(LMAX=3000,NSMAX=3000) + + INTEGER J,LM,N,NS,N0,N3 + + DOUBLE PRECISION TMAIL(LMAX),XS(NSMAX),Y(LMAX),Y0(NSMAX) + :,XTMAIL(LMAX) + + COMMON/TMAIL/TMAIL,XTMAIL + COMMON/NBMA/LM + + IF (NS.EQ.1)THEN + DO 7 J=1,LM-1 + Y(J)=Y0(1) +7 CONTINUE + ELSE + N3=1 + DO 8 J=1,LM-1 + N0=N3 + DO 9 N=N0,NS + IF (XTMAIL(J).LT.XS(N)) THEN + IF(N.EQ.1)THEN + Y(J)=Y0(1) + ELSE + Y(J)=Y0(N-1)+(XTMAIL(J)-XS(N-1))*(Y0(N)-Y0(N-1))/(XS(N)-XS(N-1)) + ENDIF + N3=N + GO TO 8 + ENDIF +9 CONTINUE + Y(J)=Y0(NS) + N3=NS+1 +8 CONTINUE + + + ENDIF + RETURN + END + + + +C------------------------------------------------------------------ + SUBROUTINE INTER3(XS,NS,Y,Y0) +C------------------------------------------------------------------ +C SON ROLE : interpoler y0 (-->y) entre deux sections C +C correspondant aux points de maillage XS C +C INTERPOLATION LISSEE (SPLINE) AU LIEU DE LINEAIRE +C entrees : C +C C +C ---- LM EST LE NOMBRE DE MAILLES C +C ---- NS LE NOMBRE DES SECTIONS DE DONNEE C +C ---- XTMAIL LES ABSCISSES DES INTERMAILLES C +C ---- XS LES ABSCISSES DES SECTIONS DE DONNEE C +C ---- Y0 VALEUR AUX SECTIONS DE LA VARIABLE A INTERPOLER C +C C +C sorties : C +C C +C ---- Y VALEUR DE LA VARIABLE A INTERPOLER C +C AUX POINTS DE MAILLAGE (INTERMAILLES) C +C C +C-----------------------------------------------------------------C +C IMPLICIT NONE + + INTEGER LMAX,NSMAX + PARAMETER(LMAX=3000,NSMAX=3000) + + INTEGER J,LM,N,NS,N0,N3 + + DOUBLE PRECISION TMAIL(LMAX),XS(NSMAX),Y(LMAX),Y0(NSMAX) + :,XTMAIL(LMAX) + DOUBLE PRECISION H(LMAX),U(LMAX),A,B,C,H1(LMAX),H2(LMAX) + :,H3(LMAX) + COMMON/TMAIL/TMAIL,XTMAIL + COMMON/NBMA/LM + + IF (NS.EQ.1)THEN + DO 7 J=1,LM-1 + Y(J)=Y0(1) +7 CONTINUE + ELSE +C CALCUL DES COEFFICIENTS DES FONCTIONS SPLINES + DO 11 N=1,NS-1 + H(N)=XS(N+1)-XS(N) + 11 CONTINUE + DO 12 N=1,NS-2 + H1(N)=(H(N)+H(N+1))/3. + H2(N)=H(N+1)/6. + H3(N)=(Y0(N+2)-Y0(N+1))/H(N+1)-(Y0(N+1)-Y0(N))/H(N) + 12 CONTINUE + DO 13 N=2,NS-2 + C=H2(N-1)/H1(N-1) + H1(N)=H1(N)-H2(N-1)*C + H3(N)=H3(N)-H3(N-1)*C + 13 CONTINUE + U(NS-1)=H3(NS-2)/H1(NS-2) + U(1)=0. + U(NS)=0. + DO 14 N=NS-2,2,-1 + U(N)=(H3(N-1)-H2(N-1)*U(N+1))/H1(N-1) + 14 CONTINUE +C UTILISATION DES FONCTIONS SPLINES + N3=1 + DO 8 J=1,LM-1 + N0=N3 + DO 9 N=N0,NS + IF (XTMAIL(J).LT.XS(N)) THEN + IF(N.EQ.1)THEN + Y(J)=Y0(1) + ELSE +C Y(J)=Y0(N-1)+(XTMAIL(J)-XS(N-1))*(Y0(N)-Y0(N-1))/(XS(N)-XS(N-1)) + A=(XS(N)-XTMAIL(J))/H(N-1) + B=1.-A + Y(J)=H(N-1)**2*(A*(A**2-1.)*U(N-1)+B*(B**2-1.)*U(N))/6. + Y(J)=Y(J)+A*Y0(N-1)+B*Y0(N) + ENDIF + N3=N + GO TO 8 + ENDIF +9 CONTINUE + Y(J)=Y0(NS) + N3=NS+1 +8 CONTINUE + + + ENDIF + RETURN + END + + + +C----------------------------------------------------------------------- + + +C----------------------------------------------------------------C + SUBROUTINE MAILLA +C----------------------------------------------------------------C +C SON ROLE : saisie du maillage C +C----------------------------------------------------------------C +C IMPLICIT NONE + +C PARAMETER (LMAX=3000,NSMAX=3000) + + INTEGER CHOIXM,I +C DOUBLE PRECISION TMAIL(LMAX),XTMAIL(LMAX) + + CHARACTER ETUDE*20 + LOGICAL TESTCH + + COMMON/ETUDE/ETUDE + +11 WRITE(*,*) ' ' + WRITE(*,*) ' ' + WRITE(*,*) '---------------------------------------------------' + WRITE(*,*) ' MENU D APPEL DES MAILLEURS' + WRITE(*,*) '---------------------------------------------------' + WRITE(*,*) 'CHOIX 1 : MAILLAGE DE PAS CONSTANT' + WRITE(*,*) 'CHOIX 2 : MAILLAGE VARIABLE ET ECRITURE D UN', + :' FICHIER mail0.', ETUDE + WRITE(*,*) 'CHOIX 3 : MAILLAGE VARIABLE PAR LECTURE D UN', + :' FICHIER mail0.',ETUDE + WRITE(*,*) '---------------------------------------------------' + WRITE(*,*) ' ' + WRITE(*,*) 'DONNEZ VOTRE CHOIX' + READ (*,*) CHOIXM + +C ---- TEST DU CHOIX + + TESTCH=.FALSE. + DO 101 I=1,3 + TESTCH=TESTCH.OR.(CHOIXM.EQ.I) +101 CONTINUE + IF (.NOT.TESTCH) THEN + WRITE(*,*) 'VOUS AVEZ DONNE UN MAUVAIS CHOIX' + WRITE(*,*) 'RECOMMENCEZ' + GOTO 11 + ENDIF + + GOTO (12,13,14),CHOIXM + +C 1)--> MAILLEUR A PAS CONSTANT +12 CALL DXCONS + RETURN + +C 2)--> MAILLEUR PAS VARIABLE ET ECRITURE FICHIER MAIL0.ETUDE +13 CALL DXVARE + RETURN + +C 3)--> MAILLEUR PAS VARIABLE PAR LECTURE FICHIER MAIL0.ETUDE +14 CALL DXVARL + RETURN + + END + + +C------------------------------------------------------------------C + SUBROUTINE RELTMA(XSECT,DXSECT,DXSEC2,NBSECT) +C------------------------------------------------------------------C +C SON ROLE : DOUBLE PRECISIONiser un tableau TMAIL de LM elements +C contenant les abscisses des points a C +C calculer C +C C +C ---- ON DEFINIT LES CARACTERISTIQUES DU MAILLAGE DANS LE SECTEUR C +C NUMSEC C +C ---- DXE = TAILLE EFFECTIVE DE LA MAILLE C +C ---- DXS = TAILLE DE MAILLE SOUHAITEE DANS NUMSEC C +C ---- JDEBUT = INDICE DE LA PREMIERE INTERFACE A CALCULER C +C ---- JFIN = INDICE DU DERNIER MILIEU DE MAILLE CALCULE C +C ---- LMSEC = NOMBRE DE MAILLES DANS LE SECTEUR C +C ---- XDEBUT = ABSCISSE DU DEBUT C +C ---- XFIN = ABSCISSE DE FIN C +C------------------------------------------------------------------C +C IMPLICIT NONE + INTEGER LMAX,NSMAX + + PARAMETER (LMAX=3000,NSMAX=3000) + + INTEGER I,J,JDEBUT,JFIN,LM,NBSECT,NUMSEC,LMSEC + + DOUBLE PRECISION DXS,DXSECT(NSMAX),TMAIL(LMAX),DXE,DXSEC2(NSMAX) + DOUBLE PRECISION XDEBUT,XFIN,XSECT(NSMAX),XTMAIL(LMAX),DEL,DXB + + COMMON/TMAIL/TMAIL,XTMAIL + COMMON/NBMA/LM + + NUMSEC=0 + JFIN=1 + +130 NUMSEC=NUMSEC+1 + IF(NUMSEC.LE.NBSECT) THEN + + + DXS =0.5*(DXSECT(NUMSEC)+DXSEC2(NUMSEC)) + XDEBUT=XSECT(NUMSEC) + XFIN=XSECT(NUMSEC+1) + LMSEC=NINT((XFIN-XDEBUT)/DXS) + DXE = (XFIN-XDEBUT)/FLOAT(LMSEC) + IF(LMSEC.GT.1)THEN + DEL=(DXSEC2(NUMSEC)-DXSECT(NUMSEC))/FLOAT(LMSEC-1) + ELSEIF(LMSEC.LT.1)THEN + WRITE(*,*)'ERREUR DANS MAIL0,SECTEUR NUMERO ',NUMSEC + STOP + ENDIF + DXB=DXE-0.5*FLOAT(LMSEC-1)*DEL +C -- CREATION DU TABLEAU DES COORDONNEES DES INTERFACES + JDEBUT=JFIN + XTMAIL(JDEBUT)=XDEBUT + DO 131 I=1,LMSEC + XTMAIL(JDEBUT+I)=XTMAIL(JDEBUT)+DXB* + + FLOAT(I)+0.5*DEL*FLOAT(I*(I-1)) +C XTMAIL(JDEBUT+I)=XTMAIL(JDEBUT)+(XFIN-XDEBUT)* +C + FLOAT(I)/FLOAT(LMSEC) +131 CONTINUE + JFIN=JDEBUT+LMSEC + GOTO 130 + ELSE + LM=JFIN+1 + ENDIF + +C -- REMPLISSAGE DE TMAIL + + TMAIL(1)=XTMAIL(1) + DO 140 J=2,LM-1 + TMAIL(J)=(XTMAIL(J)+XTMAIL(J-1))/2. +140 CONTINUE + TMAIL(LM)=XTMAIL(LM-1) + +C DO 1 J=1,LM +C WRITE(*,*)XTMAIL(J),TMAIL(J) +C1 CONTINUE + + END + + +C--------------------------------------------------------------C + SUBROUTINE SAIDEV +C--------------------------------------------------------------C +C SON ROLE : saisie du deversement lateral C +C--------------------------------------------------------------C +C IMPLICIT NONE + + INTEGER NSMAX,LMAX + PARAMETER(LMAX=3000,NSMAX=3000) + + INTEGER CHOIX,ENCORE,I,J,IODEV,LM,NBDEV,N1(NSMAX),N2(NSMAX) + :,N3(NSMAX),IMAX,IX,N + + DOUBLE PRECISION MU0(NSMAX),XDEV(NSMAX),YD0(NSMAX),EXPOS0(NSMAX) + DOUBLE PRECISION MU(LMAX),TMAIL(LMAX),XTMAIL(LMAX),YD(LMAX) + :,EXPOS(LMAX) + DOUBLE PRECISION QMU(NSMAX,NSMAX),TMU(NSMAX,NSMAX),X1(NSMAX) + :,X2(NSMAX),DMU(NSMAX),SMU(NSMAX) + :,QSMU(NSMAX,NSMAX),TSMU(NSMAX,NSMAX) + CHARACTER ETUDE*20,NOMFIC*38,CH1*1 + + COMMON/ETUDE/ETUDE + COMMON/TMAIL/TMAIL,XTMAIL + COMMON/NBMA/LM + +1000 WRITE(*,*)'VOULEZ VOUS CARACTERISER DU DEVERSEMENT LATERAL ?' +C WRITE (*,*)' OUI --> 1 NON --> 0' +C READ(*,*) IODEV + +C IF (IODEV.EQ.1) THEN + WRITE(*,*)'PAR SAISIE D''UN FICHIER dever0 : CHOIX 1' + WRITE(*,*)'PAR LECTURE D''UN FICHIER dever0 : CHOIX 2' + WRITE(*,*)'PAR SAISIE D''UN FICHIER hydev0 : CHOIX 3' + WRITE(*,*)'PAR LECTURE D''UN FICHIER hydev0 : CHOIX 4' + WRITE(*,*)'NE RIEN FAIRE : CHOIX 5' + READ(*,*) CHOIX + GOTO (1,2,3,4,5) CHOIX + +C 1) SAISIE PAR ECRITURE DU FICHIER DEVER0 +C ---------------------------------------- + +C 11)SAISIE +C---------- +C1 ENCORE = 1 +C 12)SAUVEGARDE DANS LE FICHIER DEVER0 +C------------------------------------------- + +C WRITE(*,*)'VOULEZ VOUS SAUVEGARDER DANS UN FICHIER ?' +C WRITE(*,*)' OUI --> 1 NON --> 0' +C READ (*,*) ENCORE +C IF (ENCORE.EQ.1) THEN +C WRITE(25,*) NBDEV +C DO 14 I=1,NBDEV +C WRITE(25,*)XDEV(I),YD0(I),MU0(I),EXPOS0(I) +C14 CONTINUE + + 1 I = 1 + NOMFIC='dever0.'//ETUDE + OPEN(25,FILE=NOMFIC,FORM='FORMATTED',STATUS='UNKNOWN') +C IF (ENCORE.EQ.1) THEN + WRITE(*,*)'LES PARAMETRES RENTRES SONT INTERPOLES' + WRITE(*,*)'LINEAIREMENT AUX CENTRES DE MAILLE.' + WRITE(*,*)'POUR UN DEVERSEMENT NUL SUR UNE ZONE' + WRITE(*,*)'IL FAUT RENTRER UN COEFFICIENT MU NUL' + WRITE(*,*)'AUX 2 EXTREMITES DE LA ZONE' + write(*,*)'ENTREZ DEUX FOIS MEME ABSCISSE POUR SAUT DE MU' + WRITE(*,*)'ABSCISSE AMONT ZONE 1 = AMONT MODELE' + WRITE(*,*)'ABSCISSE AVAL DERNIERE ZONE = AVAL MODELE' + 12 WRITE(*,*)'ENTREZ L''ABSCISSE AVAL DE LA ZONE DE DEVERSEMENT :' + READ (*,*)XDEV(I) + WRITE(*,*)'ENTREZ LA COTE DE DEVERSEMENT PUIS' + WRITE(*,*)'LE COEFFICIENT MU' + READ (*,*)YD0(I),MU0(I) + WRITE(*,*)'VOULEZ VOUS RENTRER UNE PUISSANCE AUTRE QUE 1.5?' + WRITE(*,*)' OUI --> 1 NON --> 0 OU AUTRE' + READ (*,'(A1)') CH1 + IF(CH1.EQ.'1')THEN + WRITE(*,*)'RENTREZ L''EXPOSANT' + READ(*,*)EXPOS0(I) + ELSE + EXPOS0(I)=1.5 + ENDIF + WRITE(25,*)XDEV(I),YD0(I),MU0(I),EXPOS0(I) + WRITE(*,*)'AVEZ VOUS FINI LA SAISIE DES DEVERSEMENTS ?' + WRITE(*,*)' OUI --> 1 NON --> 0 OU AUTRE' + READ (*,'(A1)') CH1 +C ENDIF + IF(CH1.NE.'1')THEN + I = I+1 + GOTO 12 + ENDIF + NBDEV = I + CLOSE(25) + GOTO 99 + +C 2)-->SAISIE PAR LECTURE DU FICHIER DEVER0 +C ------------------------------------------------ + +2 NOMFIC = 'dever0.'//ETUDE + OPEN(25,FILE=NOMFIC,FORM='FORMATTED',STATUS='OLD') +C READ (25,*)NBDEV + DO 22 I=1,LMAX + READ(25,*,END=722)XDEV(I),YD0(I),MU0(I),EXPOS0(I) +22 CONTINUE + 722 CLOSE(25) + NBDEV=I-1 +C 3)--> CHOIX D'UNE INTERPOLATION +C ----------------------------- + +99 WRITE(*,*)'VOULEZ VOUS INTERPOLER ?' + WRITE(*,*)' OUI --> 1 NON --> 0' + READ (*,*) ENCORE + IF (ENCORE.EQ.1) THEN + NOMFIC = 'devers.'//ETUDE + OPEN(26,FILE=NOMFIC,FORM='FORMATTED',STATUS='UNKNOWN') + DO 398 J=1,NBDEV-1 + IF(XDEV(J).GT.XDEV(J+1))THEN + WRITE(*,*)'ABSCISSES NON CROISSANTES DANS DEVER0' + STOP + ENDIF +398 CONTINUE + NOMFIC='mail.'//ETUDE + OPEN(20,FILE=NOMFIC,STATUS='OLD') + READ (20,*) LM + READ (20,*) (TMAIL(I),I=1,LM) + READ (20,*) (XTMAIL(I),I=1,LM-1) + CLOSE(20) + + CALL INTERP(XDEV,NBDEV,YD,YD0) + CALL INTERP(XDEV,NBDEV,MU,MU0) + CALL INTERP(XDEV,NBDEV,EXPOS,EXPOS0) + WRITE(26,*)LM + DO 24 I=1,LM + WRITE(26,*)I,YD(I),MU(I),EXPOS(I) +24 CONTINUE + CLOSE (26) + ENDIF +C ENDIF + GO TO 1000 +C RETURN +C SAISIE DU FICHIER HYDEV0 + 3 OPEN(26,FILE='hydev0.'//ETUDE,STATUS='UNKNOWN') + I=0 + 759 I=I+1 + WRITE(*,*)'DONNEZ POUR LE SECTEUR NUMERO',I + WRITE(*,*)'LES ABSCISSES AMONT ET AVAL' + WRITE(*,*)'ET LE NOMBRE DE POINTS DE L''HYDROGRAMME' + READ(*,*)X1(I),X2(I),N3(I) + write(*,*)'donnez le diametre et etendue sediments' + read(*,*)dmu(i),smu(i) +cliq dmu(i)=0.1 +cliq smu(i)=1. + WRITE(26,*)X1(I),X2(I),N3(I),dmu(i),smu(i) + WRITE(*,*)'DONNEZ LES COUPLES (Q,T)DANS L''ORDRE CHRONOLOGIQUE' + DO J=1,N3(I) + WRITE(*,*)J,'eme couple' + READ(*,*)QMU(I,J),TMU(I,J) + ENDDO + WRITE(*,*)'Donnez les couples (Qs,t) dans l''ordre chronologique' + DO J=1,N3(I) + WRITE(*,*)J,'eme couple' + READ(*,*)QSMU(I,J),TSMU(I,J) +cliq qsmu(i,j)=0. +cliq tsmu(i,j)=tmu(i,j) + ENDDO + DO J=1,N3(I) + WRITE(26,*)QMU(I,J),TMU(I,J),QSMU(I,J),TSMU(I,J) + ENDDO + WRITE(*,*)'VOULEZ-VOUS UN SECTEUR DE PLUS ?' + WRITE(*,*)'OUI --->1 NON --->0' + READ(*,*)IODEV + IF(IODEV.EQ.1)GO TO 759 + CLOSE(26) + IMAX=I + GO TO 798 +C LECTURE DANS HYDEV0 + 4 OPEN(26,FILE='hydev0.'//ETUDE,STATUS='OLD') + DO 3758 I=1,NSMAX + READ(26,*,END=799)X1(I),X2(I),N3(I),dmu(i),smu(i) + DO 4758 J=1,N3(I) + READ(26,*)QMU(I,J),TMU(I,J),QSMU(I,J),TSMU(I,J) + 4758 CONTINUE + 3758 CONTINUE + 799 CLOSE (26) + IMAX=I-1 +C INTERPOLATION DANS HYDEVS + + 798 WRITE(*,*)'VOULEZ-VOUS INTERPOLER DANS UN FICHIER hydevs' + WRITE(*,*)'OUI ---> 1 NON ---> 0' + READ(*,*)ENCORE + IF(ENCORE.EQ.1)THEN + OPEN(26,FILE='hydevs.'//ETUDE,STATUS='UNKNOWN') + NOMFIC='mail.'//ETUDE + OPEN(20,FILE=NOMFIC,STATUS='OLD') + READ (20,*) LM + READ (20,*) (TMAIL(I),I=1,LM) + READ (20,*) (XTMAIL(I),I=1,LM-1) + CLOSE(20) + DO 5558 I=1,IMAX +C CALCUL DES NUMEROS DE SECTION A PARTIR DES ABSCISSES + DO 5559 IX=3,LM-1 + IF(XTMAIL(IX).GE.X1(I))THEN + N1(I)=IX + GO TO 5560 + ENDIF + N1(I)=LM-1 + 5559 CONTINUE + 5560 DO 5561 IX=3,LM-1 + IF(XTMAIL(IX).GE.X2(I))THEN + N2(I)=IX + GO TO 5562 + ENDIF + N2(I)=LM-1 + 5561 CONTINUE + 5562 IF(N1(I).GT.N2(I))THEN + WRITE(*,*)'SECTEUR NUMERO',I, ' ERREUR' + WRITE(*,*)'ABSCISSE AMONT =',X1(I),' > ABSCISSE AVAL' + WRITE(*,*)'ABSCISSE AVAL =',X2(I) + WRITE(*,*)'ON INVERSE AMONT ET AVAL' + N=N1(I) + N1(I)=N2(I) + N2(I)=N +c ELSEIF(N1(I).EQ.N2(I))THEN +c WRITE(*,*)'SECTEUR NUMERO',I, ' ERREUR' +c WRITE(*,*)'PAS DE CENTRE DE MAILLE DANS LE SECTEUR' +c PAUSE +c STOP + ENDIF + WRITE(26,*)N1(I),N2(I),N3(I),dmu(i),smu(i) + DO 5758 J=1,N3(I) +C WRITE(26,*)QMU(I,J),TMU(I,J),0.,TMU(I,J) + WRITE(26,*)QMU(I,J),TMU(I,J),QSMU(I,J),TSMU(I,J) + 5758 CONTINUE + 5558 CONTINUE + CLOSE (26) + ENDIF +C RETOUR AU MENU + GO TO 1000 + 5 RETURN + END + +C*********************************************************************** + SUBROUTINE SAIOUV +C SAISIE DES CARACTERISTIQUES DES OUVRAGES +C*********************************************************************** +C NOMBRE MAXI DE MAILLES ETC + + INTEGER LMAX + PARAMETER(LMAX=3000) + INTEGER NOUMAX,NOEMAX + PARAMETER (NOUMAX=50,NOEMAX=10) + DOUBLE PRECISION XIA1,XIA2,ZORI + INTEGER IOUV,IDON,NREF,I,J,IREP + CHARACTER ETUDE*20,FICH*40,RIEN*9 + LOGICAL TROUVE + INTEGER IA1(NOUMAX),IA2(NOUMAX) + : ,NOUV(NOUMAX),NBOUV + :,NBCOUP,K,NB1(noumax),nb2(noumax),nbi + DOUBLE PRECISION LONG,ZDEV + : ,COEF + : ,ZOUV,COEFIN,TRUP + : ,ZFERM,ZCOUP(NOEMAX*NOUMAX),QCOUP(NOEMAX*NOUMAX) + CHARACTER*1 TYPOUV,LIGNE*80 + + COMMON/ETUDE/ETUDE + + TROUVE=.FALSE. + + IDON=21 + WRITE(*,*)'VOULEZ-VOUS SAISIR LES OUVRAGES' + WRITE(*,*)'EN ALLONGEANT UN FICHIER ouvrag.etude EXISTANT ---> 1' + WRITE(*,*)'OU CREER UN FICHIER ouvrag.etude NOUVEAU --> 0' + READ(*,*)IREP +C WRITE(*,*)'DONNEZ LA DISTANCE DE PRECISION SUR OX ET OY' +C WRITE(*,*)'QUI PERMET DE SAVOIR SI LES COORDONNEES SONT EXACTES' +C READ(*,*)XDIST + IOUV=0 + + IF(IREP.EQ.1)THEN +C LECTURE DES OUVRAGES + FICH='ouvrag.'//ETUDE + + OPEN(IDON,FILE=FICH,STATUS='OLD',ERR=1) + + DO 3 IOUV=1,NOUMAX +C NREF :REFERENCE DES INTERFACES +C NREF=-1:LE DEBIT DE L'OUVRAGE SE RAJOUTE AU DEBIT SAINT-VENANT +C NREF=-2: LE SEUL DEBIT EST LE DEBIT DE L'OUVRAGE + READ(IDON,'(F11.3,1X,I4,1X,I4)',ERR=5,END=8)XIA1,NREF + :,NB1(iouv) + WRITE(*,*)'LECTURE DE L''OUVRAGE',IOUV + CALL TRXYIA(XIA1,IA1(IOUV),TROUVE) + IF(TROUVE)THEN + TROUVE=.FALSE. + ELSE + WRITE(*,*)'LES COORDONNÉES DE L''INTERFACE AMONT', + :' SONT FAUSSES' + STOP + ENDIF +C NOUV NOMBRE D'OUVRAGES ELEMENTAIRES + READ (IDON,'(F11.3,1X,I4,1X,I4)',ERR=5)XIA2,NOUV(IOUV) + :,NB2(IOUV) + IF(NOUV(IOUV).GT.NOEMAX)THEN + WRITE(*,*)'TROP D''OUVRAGES ELEMENTAIRES : ', + :'NOMBRE LIMITE A',NOEMAX + ENDIF + CALL TRXYIA(XIA2,IA2(IOUV),TROUVE) + IF(TROUVE)THEN + TROUVE=.FALSE. + ELSE + WRITE(*,*)'LES COORDONNÉES DE L''INTERFACE AVAL', + :' NE CORRESPONDENT PAS A UNE INTERFACE' + STOP + ENDIF +C DO 7 I=IA1(IOUV),IA2(IOUV),1 +C NREFA(I)=NREF +C 7 CONTINUE +C LECTURE DES CARACTERISTIQUES DES OUVRAGES + DO 4 J=1,NOUV(IOUV) +C FORMAT FLUVIA + READ(IDON,'(A1,A9,F10.0,F10.0,F10.0,F10.0)',ERR=5) + :TYPOUV,RIEN,LONG,ZDEV,ZORI + :,COEF + IF(TYPOUV.EQ.'D'.OR.TYPOUV.EQ.'d')THEN +C TYPOUV='D' +C O correspond au meme ouvrage que D +C mais avec une longueur et en circulaire + ELSEIF(TYPOUV.EQ.'O'.OR.TYPOUV.EQ.'o')THEN +c TYPOUV(IOUV,J)='O' + ELSEIF(TYPOUV.EQ.'Y'.OR.TYPOUV.EQ.'y')THEN +C TYPOUV='Y' + READ(IDON,*)COEFIN,ZOUV,ZFERM + ELSEIF(TYPOUV.EQ.'Z'.OR.TYPOUV.EQ.'z')THEN + READ(RIEN,'(I9)')NBCOUP + IF(NBCOUP.LT.1.OR.NBCOUP.GT.NOUMAX*NOEMAX) + :THEN + WRITE(*,*)'OUVRAGE DE TYPE Z' + WRITE(*,*)'ERREUR DANS LE NOMBRE DE COUPLES' + WRITE(*,*)'LE NOMBRE DE COUPLES EST: ',NBCOUP + WRITE(*,*)'ALORS QUE LE NOMBRE MAXIMAL PERMIS EST :', + :NOUMAX*NOEMAX + STOP + ENDIF + DO 9 K=1,NBCOUP + READ(IDON,*,ERR=5)ZCOUP(K),QCOUP(K) + 9 CONTINUE + ELSEIF(TYPOUV.EQ.'B'.OR.TYPOUV.EQ.'b')THEN + READ(IDON,'(4F10.2)',ERR=5) LONG,ZDEV,ZORI,COEF + READ(IDON,'(2F10.2)',ERR=5)LONG,ZDEV + READ(IDON,'(2F6.2,I2,I4)',ERR=5) LONG,ZDEV,K,NBCOUP +c ELSEIF(TYPOUV.EQ.'T'.OR.TYPOUV.EQ.'t')THEN +c READ(IDON,'(4F10.2)',ERR=5) LONG,ZDEV,ZORI,COEF +c READ(IDON,'(2F10.2)',ERR=5)LONG,ZDEV +c READ(IDON,'(2F6.2,I2,I4)',ERR=5) LONG,ZDEV,K,NBCOUP + ELSE + WRITE(*,*)'ERREUR DANS LE TYPE D''OUVRAGE' + ENDIF +C HAUT(IOUV,J)=ZORI-ZDEV(IOUV,J) + 4 CONTINUE + 3 CONTINUE + WRITE(*,*)'ATTENTION' + WRITE(*,*)'LE NOMBRE MAXIMAL D''OUVRAGES ',NOUMAX,' A ETE LU' + 8 NBOUV=IOUV-1 + GO TO 6 + 1 WRITE(*,*)'LE FICHIER ouvrag.',ETUDE,' N''EXISTE PAS' + NBOUV=0 + GO TO 6 + 5 WRITE (*,*)'ERREUR DANS LA LECTURE DU FICHIER ouvrag.',ETUDE + STOP + 6 CONTINUE + WRITE(*,*)'VOULEZ-VOUS RENTREZ UN OUVRAGE SUPPLEMENTAIRE' + WRITE(*,*)'OUI ---> 1 NON --->0' + READ(*,*)IREP + IF(IREP.EQ.1)THEN +C ON VA A LA SAISIE + GO TO 120 + ENDIF +C ON VA EN FIN DE PROGRAMME + GO TO 110 +C SAISIE DES OUVRAGES + ELSEIF(IREP.EQ.0)THEN + FICH='ouvrag.'//ETUDE + OPEN(IDON,FILE=FICH,STATUS='UNKNOWN') + ENDIF + 120 IOUV=IOUV+1 + IF(IOUV.GE.NOUMAX)THEN + GO TO 110 + ELSE + WRITE(*,*)'OUVRAGE ',IOUV + 130 WRITE(*,*)'DONNEZ LES COORDONNEES DE L''ABSCISSE AMONT' + WRITE(*,*)'XIA1 ?' + READ(*,*)XIA1 + CALL TRXYIA(XIA1,IA1(IOUV),TROUVE) + IF(TROUVE)THEN + TROUVE=.FALSE. + ELSE + WRITE(*,*)'L''ABSCISSE AMONT EST FAUSSE' + GO TO 130 + ENDIF + 1130 WRITE(*,*)'DONNEZ LES COORDONNEES DE L''ABSCISSE AVAL' + WRITE(*,*)'XIA2 ?' + READ(*,*)XIA2 + CALL TRXYIA(XIA2,IA2(IOUV),TROUVE) + IF(TROUVE)THEN + TROUVE=.FALSE. + IF(XIA1.GT.XIA2)THEN + WRITE(*,*)'L''ABSCISSE AVAL EST INFERIEURE A L''AMONT' + GO TO 1130 + ENDIF + ELSEIF(ABS(XIA2-999999.999).LT.0.0001)THEN + WRITE(*,*)'L''OUVRAGE DONNE A L''EXTERIEUR' + ELSE + WRITE(*,*)'L''ABSCISSE AVAL EST FAUSSE' + GO TO 1130 + ENDIF + 102 WRITE(*,*)'DONNEZ LA REFERENCE DE L''OUVRAGE : -1 OU -2' + WRITE(*,*)'-1 SIGNIFIE LE DEBIT S''AJOUTE A SAINT-VENANT' + WRITE(*,*)'-2 SIGNIFIE : SEUL LE DEBIT DE L''OUVRAGE EST PRIS' + READ(*,*)NREF + IF(NREF.NE.-1.AND.NREF.NE.-2) GO TO 102 + write(*,*)'donnez le numero de bief abscisse amont', + :' (touche entree si sans objet)' + read(*,*)ligne + If (ligne(1:1).eq.' ')then + WRITE(IDON,'(F11.3,1X,I4,A5)')XIA1,NREF,' ' + else + read(ligne,*)nbi + WRITE(IDON,'(F11.3,1X,I4,1X,I4)')XIA1,NREF,nbi + endif + + WRITE(*,*)'DONNEZ LE NOMBRE D''OUVRAGES ELEMENTAIRES' + READ(*,*)NOUV(IOUV) + if(nouv(iouv).gt.noemax)then + write(*,*)'nombre ouvrages elementaires limite a ',noemax + nouv(iouv)=10 + endif + write(*,*)'donnez le numero de bief abscisse aval', + :' (touche entree si sans objet)' + read(*,*)ligne + If (ligne(1:1).eq.' ')then + WRITE(IDON,'(F11.3,1X,I4,A5)')XIA2,NOUV(IOUV),' ' + else + read(ligne,*)nbi + WRITE(IDON,'(F11.3,1X,I4,1X,I4)')XIA2,NOUV(IOUV),nbi + endif +C WRITE(IDON,*)XIA2,NOUV(IOUV) + DO 108 I=1,NOUV(IOUV) + WRITE(*,*)'DONNEZ LE TYPE D''OUVRAGE' + WRITE(*,*) 'B : SIGNIFIE DIGUE ERODABLE BRECHE ' + WRITE(*,*) 'D : SIGNIFIE DEVERSOIR ORIFICE' + WRITE(*,*) 'O : SIGNIFIE ORIFICE CRCULAIRE' + WRITE(*,*) 'Y : SIGNIFIE DEVERSOIR ORIFICE MOBILE' + WRITE(*,*) 'Z : SIGNIFIE LOI DEBIT COTE DONNEE' +c WRITE(*,*) 'T : SIGNIFIE DIGUE ERODABLE BRECHE TRAPEZE' + + 109 READ(*,'(A1)')TYPOUV + IF (TYPOUV.NE.'D'.AND.TYPOUV.NE.'d'.AND. + : TYPOUV.NE.'Z'.AND.TYPOUV.NE.'z'.AND. + : TYPOUV.NE.'Q'.AND.TYPOUV.NE.'q'.AND. + : TYPOUV.NE.'B'.AND.TYPOUV.NE.'b'.AND. + : TYPOUV.NE.'O'.AND.TYPOUV.NE.'o'.AND. +c : TYPOUV.NE.'T'.AND.TYPOUV.NE.'T'.AND. + : TYPOUV.NE.'Y'.AND.TYPOUV.NE.'y')THEN + WRITE(*,*)'OUVRAGE INCONNU OU NON DISPONIBLE' + GO TO 109 + ENDIF + IF(TYPOUV.EQ.'Y'.OR.TYPOUV.EQ.'y')THEN + TYPOUV='Y' + WRITE(*,*)'DONNEZ LA LONGUEUR DE SEUIL' + READ(*,*)LONG + WRITE(*,*)'DONNEZ LA COTE DE SEUIL' + READ(*,*)ZDEV + WRITE(*,*)'DONNEZ LA COTE DE MISE EN CHARGE' + READ(*,*)ZORI + WRITE(*,*)'DONNEZ LE COEFFICIENT DE DEBIT' + READ(*,*)COEF + WRITE(IDON,'(A1,9X,4F10.3)')TYPOUV,LONG,ZDEV,ZORI,COEF + WRITE(*,*)'DONNEZ LE COEFFICIENT INITIAL' + READ(*,*)COEFIN + WRITE(*,*)'DONNEZ LA COTE D''OUVERTURE' + READ(*,*)ZOUV + WRITE(*,*)'DONNEZ LA COTE DE FERMETURE' + READ(*,*)ZFERM + WRITE(IDON,*)COEFIN,ZOUV,ZFERM + ELSEIF(TYPOUV.EQ.'D'.OR.TYPOUV.EQ.'d')THEN + TYPOUV='D' + WRITE(*,*)'DONNEZ LA LONGUEUR DE SEUIL' + READ(*,*)LONG + WRITE(*,*)'DONNEZ LA COTE DE SEUIL' + READ(*,*)ZDEV + WRITE(*,*)'DONNEZ LA COTE DE MISE EN CHARGE' + READ(*,*)ZORI + WRITE(*,*)'DONNEZ LE COEFFICIENT DE DEBIT' + READ(*,*)COEF + WRITE(IDON,'(A1,9X,4F10.3)')TYPOUV,LONG,ZDEV,ZORI,COEF +C O correspond au meme ouvrage que D mais +C avec une longueur et en circulaire + ELSEIF(TYPOUV.EQ.'O'.OR.TYPOUV.EQ.'o')THEN + TYPOUV='O' + WRITE(*,*)'DONNEZ LA LONGUEUR DE CONDUITE' + READ(*,*)LONG + WRITE(*,*)'DONNEZ LA COTE INFERIEURE' + READ(*,*)ZDEV + WRITE(*,*)'DONNEZ LE DIAMETRE DE LA CONDUITE' + READ(*,*)ZORI + WRITE(*,*)'DONNEZ LE COEFFICIENT DE DEBIT' + READ(*,*)COEF + WRITE(IDON,'(A1,9X,4F10.3)')TYPOUV,LONG,ZDEV,ZORI,COEF + ELSEIF(TYPOUV.EQ.'Z'.OR.TYPOUV.EQ.'z')THEN + TYPOUV='Z' + 7000 WRITE(*,*)'DONNEZ LE NOMBRE DE COUPLES' + READ(*,*)NBCOUP + IF(NBCOUP.GT.NOEMAX*NOUMAX)THEN + WRITE(*,*)'TROP DE COUPLES' + WRITE(*,*)'DONNEZ UN NOMBRE PLUS FAIBLE' + GO TO 7000 + ENDIF + WRITE(IDON,'(A1,I9,4F10.3)')TYPOUV,NBCOUP,0.,0.,0.,0. + WRITE(*,*)'ATTENTION : LES COTES DOIVENT AUGMENTER' + DO K=1,NBCOUP + WRITE(*,*)'DONNEZ LE COUPLE(Z,Q)',K + READ(*,*)ZCOUP(K),QCOUP(K) + WRITE(IDON,'(2F10.3)')ZCOUP(K),QCOUP(K) + ENDDO + ELSEIF(TYPOUV.EQ.'Q'.OR.TYPOUV.EQ.'q')THEN + TYPOUV='Q' + 7001 WRITE(*,*)'DONNEZ LE NOMBRE DE COUPLES' + READ(*,*)NBCOUP + IF(NBCOUP.GT.NOEMAX*NOUMAX)THEN + WRITE(*,*)'TROP DE COUPLES' + WRITE(*,*)'DONNEZ UN NOMBRE PLUS FAIBLE' + GO TO 7001 + ENDIF + WRITE(IDON,'(A1,I9,4F10.3)')TYPOUV,NBCOUP,0.,0.,0.,0. + WRITE(*,*)'ATTENTION : LES COTES DOIVENT AUGMENTER' + DO K=1,NBCOUP + WRITE(*,*)'DONNEZ LE COUPLE(T,Q)',K + READ(*,*)ZCOUP(K),QCOUP(K) + WRITE(IDON,'(2F10.3)')ZCOUP(K),QCOUP(K) + ENDDO + ELSEIF(TYPOUV.EQ.'B'.OR.TYPOUV.EQ.'b')THEN + TYPOUV='B' + WRITE(*,*)'DONNEZ LA COTE DE CRETE' + READ(*,*)LONG + WRITE(*,*)'DONNEZ LE temps de debut de rupture' + READ(*,*)TRUP + WRITE(*,*)'DONNEZ LA COTE DE PIED' + READ(*,*)ZDEV + WRITE(*,*)'DONNEZ LA LARGEUR EN CRETE' + READ(*,*)ZORI + WRITE(*,*)'DONNEZ LA LARGEUR EN PIED' + READ(*,*)COEF + WRITE(IDON,'(A1,1x,F8.0,4F10.3)') + :TYPOUV,TRUP,LONG,ZDEV,ZORI,COEF + WRITE(*,*)'DONNEZ LE D50 (en mm)' + READ(*,*)LONG + WRITE(*,*)'DONNEZ LE STRICKLER DE BRECHE' + READ(*,*)ZDEV + WRITE(*,*)'DONNEZ LA MASSE VOLUMIQUE (en KG/M3)' + READ(*,*)ZORI + WRITE(*,*)'DONNEZ LA POROSITE (<1)' + READ(*,*)COEF + WRITE(IDON,'(4F10.2)')LONG,ZDEV,ZORI,COEF + WRITE(*,*)'DONNEZ LA COTE DE FOND DE BRECHE INITIALE' + READ(*,*)LONG + WRITE(*,*)'DONNEZ LA LARGEUR DE BRECHE INITIALE(mm)' + WRITE(*,*)'RAYON OU LARGEUR' + READ(*,*)ZDEV + WRITE(*,*)'DONNEZ LA LARGEUR DE BRECHE MAXIMALE(m)' + READ(*,*)ZORI + WRITE(IDON,'(3F10.2)')LONG,ZDEV,ZORI + WRITE(*,*)'DONNEZ LE PAS DE TEMPS DE STOCKAGE' + WRITE(*,*)'DES RESULTATS SUR LA BRECHE' + READ(*,*)LONG + WRITE(*,*)'DONNEZ LE COEFFICIENT DE PERTE DE CHARGE' + WRITE(*,*)'AMONT DE LA BRECHE (<0.5)' + READ(*,*)ZDEV + WRITE(*,*)'DONNEZ LE TYPE DE RUPTURE' + WRITE(*,*)'RENARD ---> 0' + WRITE(*,*)'SURVERSE--->-1' + READ(*,*)K + WRITE(*,*)'DONNEZ LE NOMBRE MAXIMAL DE PAS DE TEMPS' + WRITE(*,*)'DES RESULTATS SUR LA BRECHE (<9000)' + READ(*,*)NBCOUP + WRITE(IDON,'(2F6.2,I2,I4)') LONG,ZDEV,K,NBCOUP +c ELSEIF(TYPOUV.EQ.'T'.OR.TYPOUV.EQ.'t')THEN +c TYPOUV='T' +c WRITE(*,*)'DONNEZ LA COTE DE CRETE' +c READ(*,*)LONG +c WRITE(*,*)'DONNEZ LA COTE DE PIED' +c READ(*,*)ZDEV +c WRITE(*,*)'DONNEZ LA LARGEUR EN CRETE' +c READ(*,*)ZORI +c WRITE(*,*)'DONNEZ LA LARGEUR EN PIED' +c READ(*,*)COEF +c WRITE(IDON,'(A1,9X,4F10.3)')TYPOUV,LONG,ZDEV,ZORI,COEF +c WRITE(*,*)'DONNEZ LE D50 (en mm)' +c READ(*,*)LONG +c WRITE(*,*)'DONNEZ LE STRICKLER DE BRECHE' +c READ(*,*)ZDEV +c WRITE(*,*)'DONNEZ LA MASSE VOLUMIQUE (en KG/M3)' +c READ(*,*)ZORI +c WRITE(*,*)'DONNEZ LA POROSITE (<1)' +c READ(*,*)COEF +c WRITE(IDON,'(4F10.2)')LONG,ZDEV,ZORI,COEF +c WRITE(*,*)'DONNEZ LA COTE DE FOND DE BRECHE INITIALE' +c READ(*,*)LONG +c WRITE(*,*)'DONNEZ LA LARGEUR DE BRECHE INITIALE(mm)' +c WRITE(*,*)'RAYON OU LARGEUR' +c READ(*,*)ZDEV +c WRITE(IDON,'(2F10.2)')LONG,ZDEV +c WRITE(*,*)'DONNEZ LE PAS DE TEMPS DE STOCKAGE' +c WRITE(*,*)'DES RESULTATS SUR LA BRECHE' +c READ(*,*)LONG +c WRITE(*,*)'DONNEZ LE COEFFICIENT DE PERTE DE CHARGE' +c WRITE(*,*)'AMONT DE LA BRECHE (<0.5)' +c READ(*,*)ZDEV +c WRITE(*,*)'DONNEZ LE TYPE DE RUPTURE' +c WRITE(*,*)'RENARD ---> 0' +c WRITE(*,*)'SURVERSE--->-1' +c READ(*,*)K +c WRITE(*,*)'DONNEZ LE NOMBRE MAXIMAL DE PAS DE TEMPS' +c WRITE(*,*)'DES RESULTATS SUR LA BRECHE (<1999)' +c READ(*,*)NBCOUP +c WRITE(IDON,'(2F6.2,I2,I4)') LONG,ZDEV,K,NBCOUP +C fin du if sur le type d'ouvrage + ENDIF + 108 CONTINUE + WRITE(*,*)'VOULEZ-VOUS RENTREZ UN NOUVEL OUVRAGE' + WRITE(*,*)'OUI ---> 1 NON --->0' + READ(*,*)IREP + IF(IREP.EQ.1)THEN + GO TO 120 + ENDIF +C FIN DU IF SUR NOUMAX DEPASSE + ENDIF + 110 CLOSE(IDON) + RETURN + END + + +C------------------------------------------------------------------C + SUBROUTINE SAISAV +C------------------------------------------------------------------C +C SON ROLE : ecriture des fichiers contenant les parametres C +C de sauvegarde C +C------------------------------------------------------------------C +C maille ---> abscisses de sauvegarde des hydrogrammes C +C limnigrammes C +C vitigrammes C +C tsor -----> temps de sauvegarde des profils de debit C +C hauteur C +C vitesse C +C------------------------------------------------------------------C + +C IMPLICIT NONE + + INTEGER J,NBSSAV,NTSOR + DOUBLE PRECISION MAILLE(100),TSOR(100) + + CHARACTER *20 ETUDE,NOMFIC*38 + + COMMON/ETUDE/ETUDE + + + WRITE(*,*)'ENTREZ LE NOMBRE D''HYDROGRAMMES DESIRES(MAX=100)' + READ(*,*) NBSSAV + IF ((NBSSAV.GT.0).AND.(NBSSAV.LE.100)) THEN + NOMFIC='abshyd.'//ETUDE + OPEN(75,FILE=NOMFIC,STATUS='UNKNOWN') + WRITE(75,*) NBSSAV + DO 10 J=1,NBSSAV + WRITE(*,*)J,'IEME ABSCISSE :' + READ(*,*) MAILLE(J) + WRITE(75,'(I4,1X,F11.3,1X,I4)')J,MAILLE(J),1 +10 CONTINUE + CLOSE(75) + ENDIF + + WRITE(*,*)'ENTREZ LE NOMBRE DE PROFILS DESIRES(MAX=100)' + READ(*,*) NTSOR + IF ((NTSOR.GT.0).AND.(NTSOR.LE.100)) THEN + NOMFIC='tnprof.'//ETUDE + OPEN(76,FILE=NOMFIC,STATUS='UNKNOWN') + WRITE(76,*)NTSOR + DO 20 J=1,NTSOR + WRITE(*,*)J,'IEME TEMPS DE SAUVEGARDE :' + READ(*,*)TSOR(J) + WRITE(76,*)J,TSOR(J) +20 CONTINUE + CLOSE(76) + ENDIF + + RETURN + END + + +C********************************************************************** + SUBROUTINE TRXYIA (X,I,TROUVE) +C---------------------------------------------------------------------C +C VERIFIE QUE LES COORDONNEES DES INTERFACES D'UN OUVRAGE SONT BONNES +C ENTREE: X DE L'INTERFACE +C SORTIE: NUMERO DE L'INTERFACE +C LA VARIABLE LOGIQUE TROUVE INDIQUE SI L'INTERFACE EST TROUVEE +C=====================================================================C + INTEGER LMAX,LM + PARAMETER (LMAX=3000) + DOUBLE PRECISION TMAIL(LMAX),XTMAIL(LMAX) + CHARACTER ETUDE*20,NOMFIC*38 + INTEGER I,N + DOUBLE PRECISION X + LOGICAL TROUVE + + COMMON/ETUDE/ETUDE + COMMON/TMAIL/TMAIL,XTMAIL + COMMON/NBMA/LM + +C -----------------LECTURE DU FICHIER MAIL------------------------C + + N=20 + NOMFIC='mail.'//ETUDE + OPEN(N,FILE=NOMFIC,STATUS='OLD') + READ (N,*) LM + READ (N,*) (TMAIL(I),I=1,LM) + READ (N,*) (XTMAIL(I),I=1,LM-1) + CLOSE(N) + +C recherche du xtmail correspondant + DO 1 I=1,LM-1 +C 0.006 CAR LES COORDONNEES SONT PRECISES AU CM + IF(ABS(X-XTMAIL(I)).LT.0.006)THEN + TROUVE=.TRUE. + GO TO 2 + ENDIF + 1 CONTINUE + 2 RETURN + END +C------------------------------------------------- + DOUBLE PRECISION FUNCTION DETL(Y,I) +C-------------------------------------------------- +C DETERMINATION DE LA LARGEUR L(Y) +C-------------------------------------------------- +C IMPLICIT NONE + + INTEGER NSMAX,NCMAX,I,N,IJ,IE + + PARAMETER(NSMAX=3000,NCMAX=300) + + INTEGER NC0(NSMAX),IDPARS + + CHARACTER*20 ETUDE + + DOUBLE PRECISION Y,EPS,YI,LI, + + LISEC0(NCMAX,NSMAX),YISEC0(NCMAX,NSMAX),CTDF0(NSMAX) + + COMMON/NC0/NC0 + COMMON/REEL/YISEC0,LISEC0 + COMMON/CTD/CTDF0 + COMMON/ETUDE/ETUDE + COMMON/CONST/IDPARS,IE + COMMON/EPSI/EPS + + DO 2 N=2,NC0(I) + IF (Y.LT.YISEC0(N,I)) THEN + IJ = N-1 + GO TO 3 + ENDIF +2 CONTINUE + IJ = NC0(I) +3 YI=YISEC0(IJ,I) + LI=LISEC0(IJ,I) + IF((Y-YI).GT.EPS)THEN + DETL = LI+(Y-YI)*(LISEC0(IJ+1,I)-LI)/(YISEC0(IJ+1,I)-YI) + ELSE + DETL=LI + ENDIF + RETURN + END +C----------------------------------------------------------------------- + SUBROUTINE GEOMET +C----------------------------------------------------------------------- +C Menu relatif à la saisie de la géométrie +C----------------------------------------------------------------------- +C geomac-i00: donnees de topographie + marques de lignes directrices +Csi elles existent +C geomac-i0 : topographie aux intermailles + +Cmarques de lignes directrices si elles existent +C geomac-i : topographie aux intermailles +C + marques directrices + description sédimentaire +C----------------------------------------------------------------------- + IMPLICIT NONE + INTEGER CHOIX + +C Affichage du menu de saisie de la géométrie +C----------------------------------------------------------------------- +30 CONTINUE + WRITE(*,*)' ' + WRITE(*,*)' ' + WRITE(*,*)'--------------------------------------------------' + WRITE(*,*)' MENU DE SAISIE DE LA GEOMETRIE ' + WRITE(*,*)'--------------------------------------------------' + WRITE(*,*)'Choix 1: pour les topographies simples, saisie de ' + WRITE(*,*)' la geometrie en abscisse-cote puis ' + WRITE(*,*)' interpolation lineaire dans geomac-i0 ' +cliq WRITE(*,*)' interpolation lineaire dans geomac-i ' + WRITE(*,*)' (le maillage doit pre-exister) ' + WRITE(*,*)'Choix 2: pour les topographies plus complexes, ' + WRITE(*,*)' ecriture de geomac-i0 a partir d''un ' +cliq WRITE(*,*)' ecriture de geomac-i a partir d''un ' + WRITE(*,*)' fichier topographique au format Mocahy ' + WRITE(*,*)'Choix 3: saisie des parametres sedimentaires pour ' + WRITE(*,*)' complement de geomac-i0 en geomac-i ' + WRITE(*,*)'Choix 4: saisie des largeurs actives par zones ' + WRITE(*,*)'Choix 0: retour au menu principal ' + WRITE(*,*)'--------------------------------------------------' + WRITE(*,*)' ' + WRITE(*,*)' ' + WRITE(*,*)'Votre choix:' + READ(*,*)CHOIX + +C Ventilation +C----------------------------------------------------------------------- + IF(CHOIX.EQ.1)THEN + CALL SAITOPO + GOTO 30 + ELSEIF(CHOIX.EQ.2)THEN + CALL TRMOCRUBE + GOTO 30 + ELSEIF(CHOIX.EQ.3)THEN + CALL SAISED + RETURN + ELSEIF(CHOIX.EQ.4)THEN + CALL SAILACT + RETURN + ELSEIF(CHOIX.EQ.0)THEN + RETURN + ENDIF + WRITE(*,*) 'MAUVAIS CHOIX, RECOMMENCEZ' + GOTO 30 + END +C----------------------------------------------------------------------- + SUBROUTINE SAITOPO +C----------------------------------------------------------------------- +C Saisie abscisse-cote de la topographie (hors paramètres sédimentaires) +C Écriture dans geomac-i00 +C----------------------------------------------------------------------- + IMPLICIT NONE + INTEGER LMAX,NSMAX,NCMAX + PARAMETER (LMAX=3000,NCMAX=300,NSMAX=3000) + INTEGER I,LM + INTEGER NUMCOU,NUMSEC,DERCOU + INTEGER NCOU(0:NSMAX) + DOUBLE PRECISION TMAIL(LMAX),XTMAIL(LMAX),XSECT(NSMAX) + DOUBLE PRECISION YCOU(NCMAX*NSMAX),ZCOU(NCMAX*NSMAX) + & ,YPERMUT,ZPERMUT + CHARACTER*1 CCOU(NCMAX*NSMAX),CPERMUT,INDIC + CHARACTER ETUDE*20,NOMFIC*40,REP*1 + LOGICAL EXISTG,EXISTD + LOGICAL ENCORE,ENCOR2,ENCOR3 + + COMMON/ETUDE/ETUDE + COMMON/TMAIL/TMAIL,XTMAIL + COMMON/NBMA/LM + +C Vérification: lecture du fichier mail +C----------------------------------------------------------------------- + NOMFIC='mail.'//ETUDE + OPEN(20,FILE=NOMFIC,STATUS='OLD',ERR=1000) + READ(20,*)LM + READ(20,*)(TMAIL(I),I=1,LM) + READ(20,*)(XTMAIL(I),I=1,LM-1) + CLOSE(20) + +C Preambule +C----------------------------------------------------------------------- + WRITE(*,*)' ' + WRITE(*,*)'SAISIE DE LA TOPOGRAPHIE EN ABSCISSE-COTE --->1' + WRITE(*,*)'ou lecture fichier geomac-i00.etude --->0' + Write(*,*)' entrez 0 ou 1' + Read (*,*)indic + IF(indic.eq.'0')then + CALL INTLINTOPO + RETURN + ENDIF + WRITE(*,*)' ' + WRITE(*,*)'ATTENTION1: dans l''etape d''interpolation lineaire, ' + & ,'les sections seront interpolees point a point; il faut donc ' + & ,'au moins qu''il y ait le meme nombre de points par section.' + WRITE(*,*)' ' + WRITE(*,*)'ATTENTION2: les section doivent être entrées de' + & ,' l''amont vers l''aval et avec des abscisses croissantes' + & ,' (eventuellement negatives).' + WRITE(*,*)' ' + NOMFIC='geomac-i00.'//ETUDE + OPEN(24,FILE=NOMFIC,STATUS='UNKNOWN',FORM='FORMATTED') + NUMSEC=0 + NCOU(0)=0 + ENCORE=.TRUE. + +C Abscisse de la section +C----------------------------------------------------------------------- + 2003 IF(ENCORE)THEN + NUMSEC=NUMSEC+1 + 2004 WRITE(*,*)' ' + WRITE(*,*)'On est dans la section numero ',NUMSEC + WRITE(*,*)'Donnez son abscisse XSECT(',NUMSEC,') = ?' + READ(*,*) XSECT(NUMSEC) + IF(NUMSEC.GE.2.AND.XSECT(NUMSEC).LE.XSECT(NUMSEC-1))THEN + WRITE(*,*)'ABSCISSE NON CROISSANTE, RECOMMENCEZ' + GOTO 2004 + ENDIF + IF((XSECT(NUMSEC).LT.TMAIL(1)).OR. + & (XSECT(NUMSEC).GT.TMAIL(LM)))THEN + WRITE(*,*)'ATTENTION, section en dehors du domaine maille' + ENDIF + +C Entree des donnees geometriques pour la section +C----------------------------------------------------------------------- + NUMCOU=NCOU(NUMSEC-1) + ENCOR2=.TRUE. + ENCOR3=.FALSE. + EXISTG=.FALSE. + EXISTD=.FALSE. + WRITE(*,*)'ATTENTION: les points abscisse-cote seront reordonnes ' + & ,'selon des abscisses croissantes de la rive GAUCHE vers la ' + & ,'rive DROITE (eventuellement negatives).' + WRITE(*,*)' ' + 222 IF(ENCOR2)THEN + NUMCOU=NUMCOU+1 + 223 WRITE(*,*)'Abscisse du ',NUMCOU-NCOU(NUMSEC-1),'ieme point' + & ,' dans la section = ?' + READ(*,*) YCOU(NUMCOU) + WRITE(*,*)'Cote du ',NUMCOU-NCOU(NUMSEC-1),'ieme point' + & ,' dans la section = ?' + READ(*,*) ZCOU(NUMCOU) + CCOU(NUMCOU)=' ' + IF(.NOT.EXISTG)THEN + WRITE(*,*)'Ce point est-il la limite mineur/Moyen en rive' + & ,' gauche ? (O/N)' + READ(*,*) REP + IF(REP.EQ.'O'.OR.REP.EQ.'o')THEN + CCOU(NUMCOU)='G' + EXISTG=.TRUE. + ENDIF + ELSEIF(.NOT.EXISTD)THEN + WRITE(*,*)'Ce point est-il la limite mineur/Moyen en rive' + & ,' droite ? (O/N)' + READ(*,*) REP + IF(REP.EQ.'O'.OR.REP.EQ.'o')THEN + CCOU(NUMCOU)='D' + EXISTD=.TRUE. + ENDIF + ENDIF + IF(NUMCOU-NCOU(NUMSEC-1).EQ.NCMAX)THEN + WRITE(*,*)'C''etait le dernier point possible.' + WRITE(*,*)'Si la section n''est pas complete, ' + & ,'recommencez en limitant le nombre de points a ',NCMAX + ENCOR2=.FALSE. + GOTO 222 + ENDIF + IF(NUMCOU-NCOU(NUMSEC-1).GT.3)THEN + WRITE(*,*)'Y a-t-il d''autres points ? (O/N)' + READ(*,*) REP + IF(REP.EQ.'O'.OR.REP.EQ.'o')THEN + ENCOR2=.TRUE. + ELSE + ENCOR2=.FALSE. + ENDIF + ENDIF + GOTO 222 + ENDIF + NCOU(NUMSEC)=NUMCOU + +C Modification éventuelle de la section +C----------------------------------------------------------------------- + WRITE(*,*)' ' + 224 WRITE(*,*)'Voulez-vous modifier des points ? (O/N)' + READ(*,*) REP + IF(REP.EQ.'O'.OR.REP.EQ.'o')THEN + ENCOR3=.TRUE. + ELSE + ENCOR3=.FALSE. + ENDIF + IF(ENCOR3)THEN + WRITE(*,*)'Numero du point a modifier ?' + READ(*,*)NUMCOU + NUMCOU=NUMCOU+NCOU(NUMSEC-1) + IF(NUMCOU.GE.NCOU(NUMSEC-1)+1.AND.NUMCOU.LE.NCOU(NUMSEC))THEN + WRITE(*,*)'Abscisse du ',NUMCOU-NCOU(NUMSEC-1),'ieme point' + & ,' dans la section = ?' + READ(*,*) YCOU(NUMCOU) + WRITE(*,*)'Cote du ',NUMCOU-NCOU(NUMSEC-1),'ieme point' + & ,' dans la section = ?' + READ(*,*) ZCOU(NUMCOU) + ELSE + WRITE(*,*)'MAUVAIS CHOIX, RECOMMENCEZ' + ENDIF + GOTO 224 + ENDIF + +C Réarrangement des couples par abscisse croissante dans la section +C----------------------------------------------------------------------- + DO DERCOU=NCOU(NUMSEC)-1,NCOU(NUMSEC-1)+1,-1 + DO NUMCOU=NCOU(NUMSEC-1)+1,DERCOU + IF(YCOU(NUMCOU).GT.YCOU(NUMCOU+1))THEN + YPERMUT=YCOU(NUMCOU+1) + ZPERMUT=ZCOU(NUMCOU+1) + CPERMUT=CCOU(NUMCOU+1) + YCOU(NUMCOU+1)=YCOU(NUMCOU) + ZCOU(NUMCOU+1)=ZCOU(NUMCOU) + CCOU(NUMCOU+1)=CCOU(NUMCOU) + YCOU(NUMCOU)=YPERMUT + ZCOU(NUMCOU)=ZPERMUT + CCOU(NUMCOU)=CPERMUT + ENDIF + ENDDO + ENDDO + +C Ajout des limites mineur/Moyen si absentes +C----------------------------------------------------------------------- + EXISTG=.FALSE. + EXISTD=.FALSE. + DO NUMCOU=NCOU(NUMSEC-1)+1,NCOU(NUMSEC) + IF((.NOT.EXISTG).AND.(CCOU(NUMCOU).EQ.'G'))THEN + EXISTG=.TRUE. + ELSEIF((.NOT.EXISTD).AND.(CCOU(NUMCOU).EQ.'D'))THEN + EXISTD=.TRUE. + ELSE + CCOU(NUMCOU)=' ' + ENDIF + ENDDO + IF(.NOT.EXISTG) CCOU(NCOU(NUMSEC-1)+1)='G' + IF(.NOT.EXISTD) CCOU(NCOU(NUMSEC))='D' + +C Sauvegarde de la section entrée +C----------------------------------------------------------------------- + WRITE(24,9992) NUMSEC,XSECT(NUMSEC),NCOU(NUMSEC)-NCOU(NUMSEC-1) + DO NUMCOU=NCOU(NUMSEC-1)+1,NCOU(NUMSEC) + WRITE(24,9991) CCOU(NUMCOU),YCOU(NUMCOU),ZCOU(NUMCOU) + ENDDO + +C Passage à la section suivante +C----------------------------------------------------------------------- + IF(NUMSEC.GT.1)THEN + WRITE(*,*)' ' + WRITE(*,*)'Y a-t-il d''autres sections ? (O/N)' + READ(*,*) REP + IF(REP.EQ.'O'.OR.REP.EQ.'o')THEN + ENCORE=.TRUE. + ELSE + ENCORE=.FALSE. + ENDIF + ENDIF + GOTO 2003 + ENDIF + +C Fin et sortie +C----------------------------------------------------------------------- + CLOSE(24) + CALL INTLINTOPO + RETURN + +C Traitement des erreurs +C----------------------------------------------------------------------- + 1000 CONTINUE + WRITE(*,*)' ' + WRITE(*,*)'ERREUR sur le fichier ',NOMFIC + WRITE(*,*)'Le fichier n''existe pas ou est illisible' + WRITE(*,*)'Tapez <entree>' + READ(*,*) + RETURN + + 9992 FORMAT(I4,1X,F11.3,1X,I2) + 9991 FORMAT(A1,1X,F11.5,1X,F11.5) + END + + +C----------------------------------------------------------------------- + SUBROUTINE INTLINTOPO +C----------------------------------------------------------------------- +C Interpolation linéaire de la geometrie en abscisse-cote dans geomac-i0 +C Si des informations sur les compartiments sédimentaires existent, +C on les interpole +C----------------------------------------------------------------------- + IMPLICIT NONE + INTEGER LMAX,NSMAX,NCMAX,CSMAX + PARAMETER (LMAX=3000,NCMAX=300,NSMAX=3000,CSMAX=10) + INTEGER I,J,LM,II + INTEGER NUMCOU,NCOUAV,NCOUAP,NUMSEC,NUMCS,NBSEC + INTEGER NCOU(0:NSMAX),NC2(0:LMAX) + DOUBLE PRECISION TMAIL(LMAX),XTMAIL(LMAX),XSECT(NSMAX) + INTEGER NBCS(NCMAX*NSMAX) + DOUBLE PRECISION YCOU(NCMAX*NSMAX),ZCOU(NCMAX*NSMAX) + CHARACTER*1 CCOU(NCMAX*NSMAX) + DOUBLE PRECISION ZCS(NCMAX*NSMAX,CSMAX),DCS(NCMAX*NSMAX,CSMAX) + & ,SCS(NCMAX*NSMAX,CSMAX),TMCS(NCMAX*NSMAX,CSMAX) + INTEGER XNBCS(NCMAX*LMAX) + DOUBLE PRECISION XYCOU(NCMAX*LMAX),XZCOU(NCMAX*LMAX) + CHARACTER*1 XCCOU(NCMAX*LMAX) + DOUBLE PRECISION XZCS(NCMAX*LMAX,CSMAX),XDCS(NCMAX*LMAX,CSMAX) + & ,XSCS(NCMAX*LMAX,CSMAX),XTMCS(NCMAX*LMAX,CSMAX) + CHARACTER ETUDE*20,NOMFIC*40,LIGNE*630,FINLIGNE*600 + CHARACTER*1 DESSEC + LOGICAL EXISTPB + + COMMON/ETUDE/ETUDE + COMMON/TMAIL/TMAIL,XTMAIL + COMMON/NBMA/LM + +C Vérification: lecture du fichier mail +C----------------------------------------------------------------------- + NOMFIC='mail.'//ETUDE + OPEN(20,FILE=NOMFIC,STATUS='OLD',ERR=1000) + READ(20,*)LM + READ(20,*)(TMAIL(I),I=1,LM) + READ(20,*)(XTMAIL(I),I=1,LM-1) + CLOSE(20) + +C Preambule +C----------------------------------------------------------------------- + WRITE(*,*)' ' + WRITE(*,*)'INTERPOLATION LINEAIRE DE LA TOPOGRAPHIE EN ' + & ,'ABSCISSE-COTE' + WRITE(*,*)' ' + WRITE(*,*)'ATTENTION: les sections seront interpolees point a ' + & ,'point; il faut donc au moins qu''elles aient le meme nombre ' + & ,'de points.' + WRITE(*,*)' ' + +C Lecture de geomac-i00 +C----------------------------------------------------------------------- + NOMFIC='geomac-i00.'//ETUDE + OPEN(24,FILE=NOMFIC,STATUS='OLD',ERR=1000) + NCOU(0)=0 + DESSEC=' ' + DO NUMSEC=1,NSMAX +C Lecture de la ligne d'en-tête de section + READ(24,'(A630)',END=221) LIGNE + READ(LIGNE,'(I4,1X,F11.3,1X,I2,1X,A600)') II,XSECT(NUMSEC) + & ,NCOU(NUMSEC),FINLIGNE +cliq & ,NCOU(NUMSEC) + NCOU(NUMSEC)=NCOU(NUMSEC)+NCOU(NUMSEC-1) + IF(NUMSEC.NE.II)THEN + WRITE(*,*)'ATTENTION, dans ',NOMFIC,', le numero de section ' + & ,II,' incoherent a la ',NUMSEC,'ieme maille est renumerote.' + ENDIF + IF(FINLIGNE(1:10).NE.' ')THEN + IF(DESSEC.EQ.' '.OR.DESSEC.EQ.'1')THEN + DESSEC='1' + ELSE + WRITE(*,*)'PROBLEME1 DE FORMAT SEDIMENTAIRE SECTION ',NUMSEC + STOP + ENDIF + ENDIF +cliq dessec=' ' +C Lecture des paramètres sédimentaires en format simplifié + IF(DESSEC.EQ.'1')THEN + READ(FINLIGNE,*,END=222)(ZCS(NUMSEC,NUMCS),DCS(NUMSEC,NUMCS) + & ,SCS(NUMSEC,NUMCS),TMCS(NUMSEC,NUMCS),NUMCS=1,CSMAX) + 222 CONTINUE + NBCS(NUMSEC)=NUMCS-1 + ENDIF + + DO NUMCOU=NCOU(NUMSEC-1)+1,NCOU(NUMSEC) + READ(24,'(A630)') LIGNE + READ(LIGNE,'(A1,1X,F11.5,1X,A180)') CCOU(NUMCOU) + & ,YCOU(NUMCOU),FINLIGNE +C Détermination / vérification du format + IF(FINLIGNE(12:22).NE.' ')THEN + IF(DESSEC.EQ.' '.OR.DESSEC.EQ.'2')THEN + DESSEC='2' + ELSE + WRITE(*,*)'PROBLEME2 DE FORMAT SEDIMENTAIRE SECTION ',NUMSEC + STOP + ENDIF + ELSE + IF(DESSEC.EQ.' '.OR.DESSEC.EQ.'0')THEN + DESSEC='0' + ELSEIF(DESSEC.EQ.'2')THEN + WRITE(*,*)'PROBLEME3 DE FORMAT SEDIMENTAIRE SECTION ',NUMSEC + STOP + ENDIF + ENDIF + + IF(DESSEC.EQ.'2')THEN +C Lecture de la ligne en format sédimentaire point par point + READ(FINLIGNE,*,END=224)(ZCS(NUMCOU,NUMCS),DCS(NUMCOU,NUMCS) + & ,SCS(NUMCOU,NUMCS),TMCS(NUMCOU,NUMCS),NUMCS=1,CSMAX) + 224 CONTINUE + NBCS(NUMCOU)=NUMCS-1 + ELSE + READ(FINLIGNE,*) ZCOU(NUMCOU) + ENDIF + + ENDDO + ENDDO + 221 CLOSE(24) + NBSEC=NUMSEC-1 + +C Confirmations + WRITE(*,*)'Lecture des ',NBSEC,' sections de donnees de' + & ,' geomac-i0.',ETUDE + IF(DESSEC.EQ.'1')THEN + WRITE(*,*)'Il existe une description sedimentaire globale' + & ,' par section; elle sera interpolee' + WRITE(*,*)' ' + ELSEIF(DESSEC.EQ.'2')THEN + WRITE(*,*)'Il existe une description sedimentaire' + & ,' point par point; elle sera interpolee' + WRITE(*,*)' ' + ELSE + WRITE(*,*)' ' + ENDIF + +C Interpolation des sections +C----------------------------------------------------------------------- + WRITE(*,*)'Interpolation des sections en abscisse-cote...' + NC2(0)=0 + NUMSEC=1 + EXISTPB=.FALSE. + DO I=1,LM-1 + +C Recherche des sections à interpoler + IF(XSECT(NUMSEC).LT.XTMAIL(I).AND.NUMSEC.LT.NBSEC)THEN + NUMSEC=NUMSEC+1 + ENDIF + +C Calcul des couples abscisse-cote + IF(XSECT(NUMSEC).EQ.XTMAIL(I))THEN +C WRITE(*,*)'Tombe pile pour I=',I +C Retrait de ce bloc le 27jul00 +C IF(DESSEC.EQ.'1')THEN +C XNBCS(I)=NBCS(NUMSEC) +C DO NUMCS=1,XNBCS(I) +C XZCS(I,NUMCS)=ZCS(NUMSEC,NUMCS) +C XDCS(I,NUMCS)=DCS(NUMSEC,NUMCS) +C XSCS(I,NUMCS)=SCS(NUMSEC,NUMCS) +C XTMCS(I,NUMCS)=TMCS(NUMSEC,NUMCS) +C ENDDO +C ENDIF +C Fin du bloc retiré le 27jul00 + + NC2(I)=NC2(I-1)+NCOU(NUMSEC)-NCOU(NUMSEC-1) + DO J=1,NCOU(NUMSEC)-NCOU(NUMSEC-1) + XYCOU(J+NC2(I-1))=YCOU(J+NCOU(NUMSEC-1)) + XZCOU(J+NC2(I-1))=ZCOU(J+NCOU(NUMSEC-1)) + XCCOU(J+NC2(I-1))=CCOU(J+NCOU(NUMSEC-1)) +C Ajout de ce bloc le 27jul00: description sédimentaire reconstituée +C en chaque point si une seule donnée pour la section + IF(DESSEC.EQ.'1')THEN + XNBCS(J+NC2(I-1))=NBCS(NUMSEC) + DO NUMCS=1,XNBCS(J+NC2(I-1)) + IF(NUMCS.EQ.1)THEN + XZCS(J+NC2(I-1),NUMCS)=XZCOU(J+NC2(I-1)) + ELSE + XZCS(J+NC2(I-1),NUMCS)=XZCS(J+NC2(I-1),NUMCS-1) + & -(ZCS(NUMSEC,NUMCS-1)-ZCS(NUMSEC,NUMCS)) + ENDIF + XDCS(J+NC2(I-1),NUMCS)=DCS(NUMSEC,NUMCS) + XSCS(J+NC2(I-1),NUMCS)=SCS(NUMSEC,NUMCS) + IF(TMCS(NUMSEC,NUMCS).LE.0.)THEN + XTMCS(J+NC2(I-1),NUMCS)=0.000D+00 + ELSEIF(TMCS(NUMSEC,NUMCS).GE.999.)THEN + XTMCS(J+NC2(I-1),NUMCS)=999.999D+00 + ELSE + XTMCS(J+NC2(I-1),NUMCS)=TMCS(NUMSEC,NUMCS) + ENDIF + ENDDO + ENDIF +C Fin du bloc ajouté le 27jul00 + IF(DESSEC.EQ.'2')THEN + NUMCOU=J+NCOU(NUMSEC-1) + XNBCS(J+NC2(I-1))=NBCS(NUMCOU) + DO NUMCS=1,XNBCS(J+NC2(I-1)) + XZCS(J+NC2(I-1),NUMCS)=ZCS(NUMCOU,NUMCS) + XDCS(J+NC2(I-1),NUMCS)=DCS(NUMCOU,NUMCS) + XSCS(J+NC2(I-1),NUMCS)=SCS(NUMCOU,NUMCS) + IF(TMCS(NUMCOU,NUMCS).LE.0.)THEN + XTMCS(J+NC2(I-1),NUMCS)=0.000D+00 + ELSEIF(TMCS(NUMCOU,NUMCS).GE.999.)THEN + XTMCS(J+NC2(I-1),NUMCS)=999.999D+00 + ELSE + XTMCS(J+NC2(I-1),NUMCS)=TMCS(NUMCOU,NUMCS) + ENDIF + ENDDO + ENDIF + ENDDO + + ELSE + IF(NUMSEC.EQ.1) NUMSEC=2 + IF((NCOU(NUMSEC)-NCOU(NUMSEC-1)) + & .NE.(NCOU(NUMSEC-1)-NCOU(NUMSEC-2)))THEN + WRITE(*,*)'INTEPOLATION IMPOSSIBLE, PAS LE MÊME NOMBRE DE' + & ,' COUPLES ENTRE LES SECTIONS ',NUMSEC-1,' ET ',NUMSEC + & ,' DANS geomac-i0' + STOP + ENDIF +C WRITE(*,*)'Interpolation pour I=',I +C Retrait de ce bloc le 27jul00 +C IF(DESSEC.EQ.'1')THEN +C XNBCS(I)=MIN(NBCS(NUMSEC-1),NBCS(NUMSEC)) +C DO NUMCS=1,XNBCS(I) +C XZCS(I,NUMCS)=ZCS(NUMSEC-1,NUMCS) +C & +(ZCS(NUMSEC,NUMCS)-ZCS(NUMSEC-1,NUMCS)) +C & *(XTMAIL(I)-XSECT(NUMSEC-1)) +C & /(XSECT(NUMSEC)-XSECT(NUMSEC-1)) +C XDCS(I,NUMCS)=DCS(NUMSEC-1,NUMCS) +C & +(DCS(NUMSEC,NUMCS)-DCS(NUMSEC-1,NUMCS)) +C & *(XTMAIL(I)-XSECT(NUMSEC-1)) +C & /(XSECT(NUMSEC)-XSECT(NUMSEC-1)) +C XSCS(I,NUMCS)=SCS(NUMSEC-1,NUMCS) +C & +(SCS(NUMSEC,NUMCS)-SCS(NUMSEC-1,NUMCS)) +C & *(XTMAIL(I)-XSECT(NUMSEC-1)) +C & /(XSECT(NUMSEC)-XSECT(NUMSEC-1)) +C IF((TMCS(NUMSEC-1,NUMCS).NE.0.) +C & .AND.(TMCS(NUMSEC,NUMCS).NE.0.))THEN +C XTMCS(I,NUMCS)=TMCS(NUMSEC-1,NUMCS) +C & +(TMCS(NUMSEC,NUMCS)-TMCS(NUMSEC-1,NUMCS)) +C & *(XTMAIL(I)-XSECT(NUMSEC-1)) +C & /(XSECT(NUMSEC)-XSECT(NUMSEC-1)) +C ELSE +C XTMCS(I,NUMCS)=0. +C ENDIF +C ENDDO +C ENDIF +C Fin du bloc retiré le 27jul00 + + NC2(I)=NC2(I-1)+NCOU(NUMSEC)-NCOU(NUMSEC-1) + DO J=1,NCOU(NUMSEC)-NCOU(NUMSEC-1) + XYCOU(J+NC2(I-1))=YCOU(J+NCOU(NUMSEC-2)) + & +(YCOU(J+NCOU(NUMSEC-1))-YCOU(J+NCOU(NUMSEC-2))) + & *(XTMAIL(I)-XSECT(NUMSEC-1)) + & /(XSECT(NUMSEC)-XSECT(NUMSEC-1)) + XZCOU(J+NC2(I-1))=ZCOU(J+NCOU(NUMSEC-2)) + & +(ZCOU(J+NCOU(NUMSEC-1))-ZCOU(J+NCOU(NUMSEC-2))) + & *(XTMAIL(I)-XSECT(NUMSEC-1)) + & /(XSECT(NUMSEC)-XSECT(NUMSEC-1)) + IF(CCOU(J+NCOU(NUMSEC-2)).EQ.CCOU(J+NCOU(NUMSEC-1)))THEN + XCCOU(J+NC2(I-1))=CCOU(J+NCOU(NUMSEC-2)) + ELSE + WRITE(*,*)'PROBLEME DE LIMITE MINEUR/MOYEN SECTION ',I + XCCOU(J+NC2(I-1))='?' + EXISTPB=.TRUE. + ENDIF + +C Ajout de ce bloc le 27jul00: description sédimentaire reconstituée +C en chaque point si une seule donnée pour la section + IF(DESSEC.EQ.'1')THEN + NCOUAV=NUMSEC-1 + NCOUAP=NUMSEC + XNBCS(J+NC2(I-1))=MIN(NBCS(NCOUAV),NBCS(NCOUAP)) + DO NUMCS=1,XNBCS(J+NC2(I-1)) + IF(NUMCS.EQ.1)THEN + XZCS(J+NC2(I-1),NUMCS)=XZCOU(J+NC2(I-1)) + ELSE + XZCS(J+NC2(I-1),NUMCS)=XZCS(J+NC2(I-1),NUMCS-1) + & -((ZCS(NCOUAV,NUMCS-1)-ZCS(NCOUAV,NUMCS)) + & +((ZCS(NCOUAP,NUMCS-1)-ZCS(NCOUAP,NUMCS)) + & -(ZCS(NCOUAV,NUMCS-1)-ZCS(NCOUAV,NUMCS))) + & *(XTMAIL(I)-XSECT(NUMSEC-1)) + & /(XSECT(NUMSEC)-XSECT(NUMSEC-1))) + ENDIF + XDCS(J+NC2(I-1),NUMCS)=DCS(NCOUAV,NUMCS) + & +(DCS(NCOUAP,NUMCS)-DCS(NCOUAV,NUMCS)) + & *(XTMAIL(I)-XSECT(NUMSEC-1)) + & /(XSECT(NUMSEC)-XSECT(NUMSEC-1)) + XSCS(J+NC2(I-1),NUMCS)=SCS(NCOUAV,NUMCS) + & +(SCS(NCOUAP,NUMCS)-SCS(NCOUAV,NUMCS)) + & *(XTMAIL(I)-XSECT(NUMSEC-1)) + & /(XSECT(NUMSEC)-XSECT(NUMSEC-1)) + IF((TMCS(NCOUAV,NUMCS).GT.999.) + & .AND.(TMCS(NCOUAP,NUMCS).GT.999.))THEN + XTMCS(J+NC2(I-1),NUMCS)=999.999D+00 + ELSEIF((TMCS(NCOUAV,NUMCS).GT.999.) + & .OR.(TMCS(NCOUAP,NUMCS).GT.999.))THEN + XTMCS(J+NC2(I-1),NUMCS)=MIN(TMCS(NCOUAV,NUMCS) + & ,TMCS(NCOUAP,NUMCS)) + ELSEIF((TMCS(NCOUAV,NUMCS).NE.0.) + & .AND.(TMCS(NCOUAP,NUMCS).NE.0.))THEN + XTMCS(J+NC2(I-1),NUMCS)=TMCS(NCOUAV,NUMCS) + & +(TMCS(NCOUAP,NUMCS)-TMCS(NCOUAV,NUMCS)) + & *(XTMAIL(I)-XSECT(NUMSEC-1)) + & /(XSECT(NUMSEC)-XSECT(NUMSEC-1)) + ELSE + XTMCS(J+NC2(I-1),NUMCS)=0.000D+00 + ENDIF + ENDDO + ENDIF +C Fin du bloc ajouté le 27jul00 + IF(DESSEC.EQ.'2')THEN + NCOUAV=J+NCOU(NUMSEC-2) + NCOUAP=J+NCOU(NUMSEC-1) + XNBCS(J+NC2(I-1))=MIN(NBCS(NCOUAV),NBCS(NCOUAP)) + DO NUMCS=1,XNBCS(J+NC2(I-1)) + XZCS(J+NC2(I-1),NUMCS)=ZCS(NCOUAV,NUMCS) + & +(ZCS(NCOUAP,NUMCS)-ZCS(NCOUAV,NUMCS)) + & *(XTMAIL(I)-XSECT(NUMSEC-1)) + & /(XSECT(NUMSEC)-XSECT(NUMSEC-1)) + XDCS(J+NC2(I-1),NUMCS)=DCS(NCOUAV,NUMCS) + & +(DCS(NCOUAP,NUMCS)-DCS(NCOUAV,NUMCS)) + & *(XTMAIL(I)-XSECT(NUMSEC-1)) + & /(XSECT(NUMSEC)-XSECT(NUMSEC-1)) + XSCS(J+NC2(I-1),NUMCS)=SCS(NCOUAV,NUMCS) + & +(SCS(NCOUAP,NUMCS)-SCS(NCOUAV,NUMCS)) + & *(XTMAIL(I)-XSECT(NUMSEC-1)) + & /(XSECT(NUMSEC)-XSECT(NUMSEC-1)) + IF((TMCS(NCOUAV,NUMCS).GT.999.) + & .AND.(TMCS(NCOUAP,NUMCS).GT.999.))THEN + XTMCS(J+NC2(I-1),NUMCS)=999.999D+00 + ELSEIF((TMCS(NCOUAV,NUMCS).GT.999.) + & .OR.(TMCS(NCOUAP,NUMCS).GT.999.))THEN + XTMCS(J+NC2(I-1),NUMCS)=MIN(TMCS(NCOUAV,NUMCS) + & ,TMCS(NCOUAP,NUMCS)) + ELSEIF((TMCS(NCOUAV,NUMCS).NE.0.) + & .AND.(TMCS(NCOUAP,NUMCS).NE.0.))THEN + XTMCS(J+NC2(I-1),NUMCS)=TMCS(NCOUAV,NUMCS) + & +(TMCS(NCOUAP,NUMCS)-TMCS(NCOUAV,NUMCS)) + & *(XTMAIL(I)-XSECT(NUMSEC-1)) + & /(XSECT(NUMSEC)-XSECT(NUMSEC-1)) + ELSE + XTMCS(J+NC2(I-1),NUMCS)=0.000D+00 + ENDIF + ENDDO + ENDIF + + ENDDO + ENDIF + + ENDDO + +C Ecriture de geomac-i0 +C----------------------------------------------------------------------- +C Retrait de ce bloc le 27jul00 +C IF(DESSEC.EQ.'1')THEN +CC Description sedimentaire globale par section +C WRITE(24,'(I4,1X,A1)')LM-1,DESSEC +C DO I=1,LM-1 +C WRITE(FINLIGNE,9995)(XZCS(I,NUMCS),XDCS(I,NUMCS) +C & ,XSCS(I,NUMCS),XTMCS(I,NUMCS),NUMCS=1,XNBCS(I)) +C WRITE(24,9991)I,XTMAIL(I),NC2(I)-NC2(I-1),FINLIGNE +C DO J=NC2(I-1)+1,NC2(I) +C WRITE(24,9992)XCCOU(J),XYCOU(J),XZCOU(J) +C ENDDO +C ENDDO +C ELSEIF(DESSEC.EQ.'2')THEN +C Fin du bloc retiré le 27jul00 (ajout de la ligne suivante) + IF((DESSEC.EQ.'1').OR.(DESSEC.EQ.'2'))THEN + NOMFIC='geomac-i.'//ETUDE + WRITE(*,*)' ' + WRITE(*,*)'Ecriture de ',NOMFIC + OPEN(24,FILE=NOMFIC,STATUS='UNKNOWN',FORM='FORMATTED') +C Description sedimentaire point par point +C WRITE(24,'(I4,1X,A1)')LM-1,DESSEC + WRITE(24,'(I4)')LM-1 + DO I=1,LM-1 + WRITE(24,9993)I,XTMAIL(I),NC2(I)-NC2(I-1) + DO J=NC2(I-1)+1,NC2(I) + WRITE(FINLIGNE,9995)(XZCS(J,NUMCS),XDCS(J,NUMCS) + & ,XSCS(J,NUMCS),XTMCS(J,NUMCS),NUMCS=1,XNBCS(J)) +C WRITE(24,999x)XCCOU(J),XYCOU(J),XZCOU(J),FINLIGNE + WRITE(24,9994)XCCOU(J),XYCOU(J),FINLIGNE + ENDDO + ENDDO + ELSE + NOMFIC='geomac-i0.'//ETUDE +cliq NOMFIC='geomac-i.'//ETUDE + WRITE(*,*)' ' + WRITE(*,*)'Ecriture de ',NOMFIC + OPEN(24,FILE=NOMFIC,STATUS='UNKNOWN',FORM='FORMATTED') +C Pas de description sedimentaire + WRITE(24,'(I4,1X,A1)')LM-1,DESSEC + + DO I=1,LM-1 + WRITE(24,9993)I,XTMAIL(I),NC2(I)-NC2(I-1) + DO J=NC2(I-1)+1,NC2(I) + WRITE(24,9992)XCCOU(J),XYCOU(J),XZCOU(J) +cliq WRITE(24,9996)XCCOU(J),XYCOU(J),XZCOU(J),0.1,1.,0. + ENDDO + ENDDO + ENDIF + CLOSE(24) + +C Traitement des erreurs +C----------------------------------------------------------------------- + IF(EXISTPB)THEN + WRITE(*,*)' ' + WRITE(*,*)'PROBLEME RENCONTRE LORS DE L''INTERPOLATION:' + WRITE(*,*)'Vous devez editer et modifier le fichier geomac-i' + WRITE(*,*)'Le caractère ''?'' indique l''endroit' + WRITE(*,*)'Tapez <entree>' + READ(*,*) + ENDIF + RETURN + + 1000 CONTINUE + WRITE(*,*)' ' + WRITE(*,*)'ERREUR sur le fichier ',NOMFIC + WRITE(*,*)'Le fichier n''existe pas ou est illisible' + WRITE(*,*)'Tapez <entree>' + READ(*,*) + RETURN + + 9991 FORMAT(I4,1X,F11.3,1X,I2,1X,A) + 9992 FORMAT(A1,1X,F11.5,F13.5) + 9993 FORMAT(I4,1X,F11.3,1X,I2) + 9994 FORMAT(A1,1X,F11.5,A) + 9995 FORMAT(10(F13.5,2F15.10,F15.5)) + 9996 FORMAT(A1,1X,F11.5,F13.5,2F15.10,F15.5) + + END + + +C----------------------------------------------------------------------- + SUBROUTINE TRMOCRUBE +C----------------------------------------------------------------------- +C À partir d'un fichier de topographie au format Mocahy, +C écrit un fichier de topographie geomac-i0, +C crée un fichier planimétrique 'm.etude' +C appelle l'extracteur de maillage +C----------------------------------------------------------------------- + IMPLICIT NONE + INTEGER LMAX,NCMAX,NPMAX + PARAMETER (LMAX=3000,NCMAX=300,NPMAX=500) + INTEGER LM,I,J,NSECT,NPT,INSECT,INPT + INTEGER JAG,JAD,NTAG,NTAGPL,NTAGCG,NTAGCD,NTAGAG,NTAGAD + INTEGER I1,I2,I3,I4,NBTAG,NBSECT,NBPT(LMAX),INBPT(LMAX) + LOGICAL PTREG,PROJ,ORDPL,ORDPT,ETIG,ETID + CHARACTER ETUDE*20,NOMFIC*40,NOMFIC2*40,LIGNE*50,REP*1 + CHARACTER NOMSECT(LMAX)*12,INOMSECT(LMAX)*12 + CHARACTER TAGP(LMAX,NPMAX)*3,ITAGP(LMAX,NPMAX)*3,TAG(0:NPMAX)*3 + CHARACTER CCOU(LMAX,NCMAX)*1 + DOUBLE PRECISION EPS,EPSX + DOUBLE PRECISION XP(LMAX,NPMAX),YP(LMAX,NPMAX),ZP(LMAX,NPMAX) + DOUBLE PRECISION IXP(LMAX,NPMAX),IYP(LMAX,NPMAX),IZP(LMAX,NPMAX) + DOUBLE PRECISION XSECT(LMAX),IXSECT(LMAX),YJ(LMAX,NCMAX) + DOUBLE PRECISION TMAIL(LMAX),XTMAIL(LMAX) + DOUBLE PRECISION XINIT,XPPREC,YPPREC + DOUBLE PRECISION NORM,XVU,YVU + DOUBLE PRECISION XV(NPMAX),YV(NPMAX) + + COMMON/ETUDE/ETUDE + COMMON/TMAIL/TMAIL,XTMAIL + COMMON/NBMA/LM + +C Initialisation +C----------------------------------------------------------------------- +C EPS est la tolérance en dessous de laquelle deux points X,Y,Z +C sont confondus +C EPSX est la tolérance le long du profil en long en dessous de +C laquelle deux sections sont confondues + EPS=0.0001 + EPSX=0.0001 + TAG(0)=' ' + WRITE(*,*)' ' + WRITE(*,*)'SAISIE DE LA TOPOGRAPHIE A PARTIR D''UN FICHIER MOCAHY' + WRITE(*,*)' ' + +C Lecture du fichier de géométrie type Mocahy *.m +C----------------------------------------------------------------------- + WRITE(*,*)'Quel est le nom du fichier de depart ? (*.m)' + READ(*,*)NOMFIC2 + OPEN(25,FILE=NOMFIC2,STATUS='OLD',ERR=1000) + +C Lecture de l'en-tête du fichier + 251 CONTINUE + READ(25,100)LIGNE + IF(LIGNE(1:1).EQ.'#') GOTO 251 + + NSECT=0 + NBTAG=0 + DO WHILE(.TRUE.) +C Lecture d'un en-tête de section + NSECT=NSECT+1 + NPT=0 + READ(LIGNE,101)I1,I2,I3,I4,XSECT(NSECT),NOMSECT(NSECT) + PTREG=.TRUE. + NTAG=1 + DO WHILE(PTREG) +C Lecture d'un point de données + READ(25,100,END=252)LIGNE + NPT=NPT+1 + READ(LIGNE,102)XP(NSECT,NPT),YP(NSECT,NPT),ZP(NSECT,NPT) + & ,TAGP(NSECT,NPT) +C Test du dernier point de la section + IF((ABS(XP(NSECT,NPT)-999.9990).LE.EPS) + & .AND.(ABS(YP(NSECT,NPT)-999.9990).LE.EPS))THEN + NBPT(NSECT)=NPT-1 + PTREG=.FALSE. + ENDIF +C Test des étiquettes de lignes directrices + IF(TAGP(NSECT,NPT).NE.' ')THEN + IF(I1.EQ.1)THEN + TAG(NTAG)=TAGP(NSECT,NPT) + NBTAG=NTAG + NTAG=NTAG+1 + ELSE + IF(TAGP(NSECT,NPT).NE.TAG(NTAG))THEN + WRITE(*,*)'PROBLEME avec la ligne directrice ' + & ,TAGP(NSECT,NPT),' a la section ',NSECT + ENDIF + IF(NTAG.GT.NBTAG)THEN + WRITE(*,*)'PROBLEME trop de lignes directrices' + & ,' a la section ',NSECT + ENDIF + NTAG=NTAG+1 + ENDIF + ENDIF + ENDDO + READ(25,100,END=252)LIGNE + ENDDO + 252 CONTINUE + NBSECT=NSECT +C au cas ou le fichier *.m se terminerait par des lignes blanches + IF(NPT.EQ.0)NBSECT=NBSECT-1 + CLOSE(25) + +C Affichages d'information et de contrôle sur le fichier lu +C----------------------------------------------------------------------- + WRITE(*,*)' ' + WRITE(*,*)'Lecture des ',NBSECT,' sections du fichier ',NOMFIC + IF(XSECT(1).LT.XSECT(NBSECT))THEN + ORDPL=.TRUE. + WRITE(*,'(A,F12.4,A,A)')' - section amont a ',XSECT(1) + & ,' m ',NOMSECT(1) + WRITE(*,'(A,F12.4,A,A)')' - section aval a ',XSECT(NBSECT) + & ,' m ',NOMSECT(NBSECT) + ELSE + ORDPL=.FALSE. + WRITE(*,'(A,F12.4,A,A)')' - section amont a ',XSECT(NBSECT) + & ,' m ',NOMSECT(NBSECT) + WRITE(*,'(A,F12.4,A,A)')' - section aval a ',XSECT(1) + & ,' m ',NOMSECT(1) + ENDIF + WRITE(*,*)' ' + WRITE(*,*)'Lecture des ',NBTAG,' lignes directrices' + WRITE(*,'(20(1X,I3))')(NTAG,NTAG=1,NBTAG) + WRITE(*,'(20(1X,A3))')(TAG(NTAG),NTAG=1,NBTAG) + +C Récupération des informations nécessaires; profil en long +C----------------------------------------------------------------------- + WRITE(*,*)' ' + WRITE(*,*)'Les abscisses du profil en long doivent etre ' + & ,'croissantes de l''amont vers l''aval.' + WRITE(*,*)'Voulez-vous changer les abscisses actuelles ? (O/N)' + READ(*,'(A1)')REP + IF((REP.EQ.'O').OR.(REP.EQ.'o'))THEN + WRITE(*,*)'Vous avez plusieurs possibilites pour la ' + & ,'modification des abscisses:' + WRITE(*,*)'- inverser l''ordre par changement de signe' + WRITE(*,*)'- recalculer les abscisses le long d''une directrice' + WRITE(*,*)'- saisir de nouvelles abscisses' + WRITE(*,*)' ' + WRITE(*,*)'Voulez-vous inverser le sens en changeant le signe ' + & ,'des abscisses en long ? (O/N)' + READ(*,'(A1)')REP + IF((REP.EQ.'O').OR.(REP.EQ.'o'))THEN +C Inversion des abscisses + ORDPL=.NOT.ORDPL + DO NSECT=1,NBSECT + XSECT(NSECT)=-XSECT(NSECT) + ENDDO + ELSE + WRITE(*,*)'Voulez-vous recalculer les abscisses en long le ' + & ,'long d''une ligne directrice ? (O/N)' + READ(*,'(A1)')REP + IF((REP.EQ.'O').OR.(REP.EQ.'o'))THEN +C Recalcul des abscisses + 261 CONTINUE + WRITE(*,*)'Quel est le numero de cette ligne directrice ?' + READ(*,*)NTAGPL + IF((NTAGPL.LT.1).OR.(NTAGPL.GT.NBTAG))THEN + WRITE(*,*)'PROBLEME de ligne directrice. Recommencez.' + GOTO 261 + ENDIF + WRITE(*,*)'Voulez-vous inverser le sens de parcours du ' + & ,'profil en long ? (O/N)' + READ(*,'(A1)')REP + IF((REP.EQ.'O').OR.(REP.EQ.'o'))THEN + ORDPL=.NOT.ORDPL + ENDIF + WRITE(*,*)'Quelle est l''abscisse de depart ? (m)' + READ(*,*)XINIT + IF(ORDPL)THEN + XSECT(1)=XINIT + NPT=1 + DO WHILE(TAGP(1,NPT).NE.TAG(NTAGPL)) + NPT=NPT+1 + ENDDO + XPPREC=XP(1,NPT) + YPPREC=YP(1,NPT) + DO NSECT=2,NBSECT + NPT=1 + DO WHILE(TAGP(NSECT,NPT).NE.TAG(NTAGPL)) + NPT=NPT+1 + ENDDO + XSECT(NSECT)=XSECT(NSECT-1)+((XP(NSECT,NPT)-XPPREC)**2. + & +(YP(NSECT,NPT)-YPPREC)**2.)**0.5 + XPPREC=XP(NSECT,NPT) + YPPREC=YP(NSECT,NPT) + ENDDO + ELSE + XSECT(NBSECT)=XINIT + NPT=1 + DO WHILE(TAGP(NBSECT,NPT).NE.TAG(NTAGPL)) + NPT=NPT+1 + ENDDO + XPPREC=XP(NBSECT,NPT) + YPPREC=YP(NBSECT,NPT) + DO NSECT=NBSECT-1,1,-1 + NPT=1 + DO WHILE(TAGP(NSECT,NPT).NE.TAG(NTAGPL)) + NPT=NPT+1 + ENDDO + XSECT(NSECT)=XSECT(NSECT+1)+((XP(NSECT,NPT)-XPPREC)**2. + & +(YP(NSECT,NPT)-YPPREC)**2.)**0.5 + XPPREC=XP(NSECT,NPT) + YPPREC=YP(NSECT,NPT) + ENDDO + ENDIF + ELSE + WRITE(*,*)'Voulez-vous saisir de nouvelles abscisses en ' + & ,'long ? (O/N)' + READ(*,'(A1)')REP + IF((REP.EQ.'O').OR.(REP.EQ.'o'))THEN +C Saisie de nouvelles abscisses + WRITE(*,*)'Voulez-vous inverser le sens de parcours du ' + & ,'profil en long ? (O/N)' + READ(*,'(A1)')REP + IF((REP.EQ.'O').OR.(REP.EQ.'o'))THEN + ORDPL=.NOT.ORDPL + ENDIF + IF(ORDPL)THEN + DO NSECT=1,NBSECT + WRITE(*,*)'Section ',NSECT,', ancienne abscisse ' + & ,XSECT(NSECT),' m ',NOMSECT(NSECT) + 262 CONTINUE + WRITE(*,*)'Quelle est la nouvelle abscisse ? (m)' + READ(*,*)XSECT(NSECT) + IF((NSECT.GT.1) + & .AND.(XSECT(NSECT).LE.XSECT(NSECT-1)))THEN + WRITE(*,*)'ATTENTION abscisse non croissante.' + & ,' Recommencez.' + GOTO 262 + ENDIF + ENDDO + ELSE + DO NSECT=NBSECT,1,-1 + WRITE(*,*)'Section ',NBSECT-NSECT+1 + & ,', ancienne abscisse ',XSECT(NSECT),' m ' + & ,NOMSECT(NSECT) + 263 CONTINUE + WRITE(*,*)'Quelle est la nouvelle abscisse ? (m)' + READ(*,*)XSECT(NSECT) + IF((NSECT.LT.NBSECT) + & .AND.(XSECT(NSECT).LE.XSECT(NSECT+1)))THEN + WRITE(*,*)'ATTENTION abscisse non croissante.' + & ,' Recommencez.' + GOTO 263 + ENDIF + ENDDO + ENDIF + ELSE + WRITE(*,*)'Bon, ben finalement, on ne fait rien...' + ENDIF + ENDIF + ENDIF + ENDIF + +C Remise en ordre éventuelle des sections +C----------------------------------------------------------------------- + IF(.NOT.ORDPL)THEN +C Inversion dans les variables temporaires + DO NSECT=1,NBSECT + INSECT=NBSECT-NSECT+1 + IXSECT(INSECT)=XSECT(NSECT) + INOMSECT(INSECT)=NOMSECT(NSECT) + INBPT(NSECT)=NBPT(NSECT) + DO NPT=1,NBPT(NSECT) + IXP(INSECT,NPT)=XP(NSECT,NPT) + IYP(INSECT,NPT)=YP(NSECT,NPT) + IZP(INSECT,NPT)=ZP(NSECT,NPT) + ITAGP(INSECT,NPT)=TAGP(NSECT,NPT) + ENDDO + ENDDO + +C Retour aux variables initiales + DO NSECT=1,NBSECT + XSECT(NSECT)=IXSECT(NSECT) + NOMSECT(NSECT)=INOMSECT(NSECT) + NBPT(NSECT)=INBPT(NSECT) + DO NPT=1,INBPT(NSECT) + XP(NSECT,NPT)=IXP(NSECT,NPT) + YP(NSECT,NPT)=IYP(NSECT,NPT) + ZP(NSECT,NPT)=IZP(NSECT,NPT) + TAGP(NSECT,NPT)=ITAGP(NSECT,NPT) + ENDDO + ENDDO + WRITE(*,*)'Inversion de l''ordre des sections' + ENDIF + +C Récupération des informations nécessaires; orientation des sections +C----------------------------------------------------------------------- + 270 CONTINUE + WRITE(*,*)' ' + WRITE(*,*)'Les sections en travers doivent etre parcourues de la ' + & ,'rive gauche a la rive droite.' + WRITE(*,*)'Voulez-vous changer le sens des sections ? (O/N)' + READ(*,'(A1)')REP + IF((REP.EQ.'O').OR.(REP.EQ.'o'))THEN + ORDPT=.FALSE. + ELSE + ORDPT=.TRUE. + ENDIF + +C Remise en ordre éventuelle des points des sections +C----------------------------------------------------------------------- + IF(.NOT.ORDPT)THEN +C Inversion dans les variables temporaires + DO NSECT=1,NBSECT + DO NPT=1,NBPT(NSECT) + INPT=NBPT(NSECT)-NPT+1 + IXP(NSECT,INPT)=XP(NSECT,NPT) + IYP(NSECT,INPT)=YP(NSECT,NPT) + IZP(NSECT,INPT)=ZP(NSECT,NPT) + ITAGP(NSECT,INPT)=TAGP(NSECT,NPT) + ENDDO + ENDDO + +C Retour aux variables initiales + DO NSECT=1,NBSECT + DO NPT=1,NBPT(NSECT) + XP(NSECT,NPT)=IXP(NSECT,NPT) + YP(NSECT,NPT)=IYP(NSECT,NPT) + ZP(NSECT,NPT)=IZP(NSECT,NPT) + TAGP(NSECT,NPT)=ITAGP(NSECT,NPT) + ENDDO + ENDDO + WRITE(*,*)'Inversion de l''ordre des points des sections' + ENDIF + +C Récupération des informations nécessaires; limites du lit mineur +C----------------------------------------------------------------------- + WRITE(*,*)' ' + WRITE(*,*)'Pour un lit compose, les lignes directrices limites ' + & ,'entre les lits mineur et moyen doivent etre choisies. Si ' + & ,'elles ne le sont pas, seul un lit mineur est considere.' + 271 CONTINUE + WRITE(*,*)'Quel est le numero de la limite gauche ? (0 si rien)' + READ(*,*)NTAGCG + IF((NTAGCG.LT.0).OR.(NTAGCG.GT.NBTAG))THEN + WRITE(*,*)'PROBLEME de ligne directrice. Recommencez.' + GOTO 271 + ENDIF + 272 CONTINUE + WRITE(*,*)'Quel est le numero de la limite droite ? (0 si rien)' + READ(*,*)NTAGCD + IF((NTAGCD.LT.0).OR.(NTAGCD.GT.NBTAG))THEN + WRITE(*,*)'PROBLEME de ligne directrice. Recommencez.' + GOTO 272 + ENDIF + IF((NTAGCG.NE.0).AND.(NTAGCD.NE.0).AND.(NTAGCG.EQ.NTAGCD))THEN + WRITE(*,*)'PROBLEME lignes directrices confondues. Recommencez.' + GOTO 271 + ENDIF + IF((NTAGCG.NE.0).AND.(NTAGCD.NE.0) + & .AND.(NTAGCG.GT.NTAGCD).AND.ORDPT)THEN + WRITE(*,*)'PROBLEME orientation de la section incompatible avec' + & ,' le choix des lignes directrices. Recommencez.' + GOTO 270 + ENDIF + +C Récupération des informations nécessaires; limites du lit actif +C----------------------------------------------------------------------- + 280 CONTINUE + WRITE(*,*)' ' + WRITE(*,*)'Vous pouvez choisir les lignes directrices delimitant ' + & ,'le lit actif. Par defaut, le lit actif est confondu avec le ' + & ,'lit mineur.' + WRITE(*,*)'CONSEIL: vous pouvez aussi utiliser le menu de saisie ' + & ,'de la geometrie qui permet de rentrer les largeurs actives ' + & ,'par zones.' + 281 CONTINUE + WRITE(*,*)'Quel est le numero de la limite gauche ? (0 si rien)' + READ(*,*)NTAGAG + IF((NTAGAG.LT.0).OR.(NTAGAG.GT.NBTAG))THEN + WRITE(*,*)'PROBLEME de ligne directrice. Recommencez.' + GOTO 281 + ENDIF + 282 CONTINUE + WRITE(*,*)'Quel est le numero de la limite droite ? (0 si rien)' + READ(*,*)NTAGAD + IF((NTAGAD.LT.0).OR.(NTAGAD.GT.NBTAG))THEN + WRITE(*,*)'PROBLEME de ligne directrice. Recommencez.' + GOTO 282 + ENDIF + IF((NTAGAG.NE.0).AND.(NTAGAD.NE.0) + & .AND.(NTAGAG.GT.NTAGAD).AND.ORDPT)THEN + WRITE(*,*)'PROBLEME orientation de la section incompatible avec' + & ,' le choix des lignes directrices. Recommencez.' + GOTO 280 + ENDIF + +C Récupération des informations nécessaires; aplanissement des sections +C----------------------------------------------------------------------- + WRITE(*,*)' ' + WRITE(*,*)'La section en travers n''est pas forcement plane; ' + & ,'pour le calcul monodimensionnel, il est possible de la ' + & ,'projeter sur le plan vertical passant par ses extremites ou ' + & ,'de la deplier comme un accordeon.' + WRITE(*,*)'Voulez-vous projeter la section ? (O/N)' + READ(*,'(A1)')REP + IF((REP.EQ.'O').OR.(REP.EQ.'o'))THEN + PROJ=.TRUE. + ELSE + PROJ=.FALSE. + ENDIF + + IF(PROJ)THEN +C Calcul des points des sections en travers; cas section projetée +C----------------------------------------------------------------------- +C Le plan de projection passe par les premier +C et dernier points de la section. +C L'abscisse latérale YJ, qui correspond à l'abscisse latérale projetée +C est le produit scalaire du vecteur d'un point par rapport à l'origine +C par le vecteur de projection unitaire. +C XV,YV coordonnées des vecteurs entre le premier point et le point n +C XVU,YVU coordonnées du vecteur unitaire +C entre les premier et dernier points + DO NSECT=1,NBSECT + XV(NBPT(NSECT))=XP(NSECT,NBPT(NSECT))-XP(NSECT,1) + YV(NBPT(NSECT))=YP(NSECT,NBPT(NSECT))-YP(NSECT,1) + NORM=(XV(NBPT(NSECT))**2+YV(NBPT(NSECT))**2)**0.5 + If(norm.lT.eps)then + write(*,*)'attention section ',nsect + write(*,*)'premiers et derniers points de memes coordonnees' + write(*,*)'leur distance doit etre > 0.1 mm' + stop + endif + XVU=XV(NBPT(NSECT))/NORM + YVU=YV(NBPT(NSECT))/NORM +C WRITE(*,*)' NORM=',NORM,' XVU=',XVU,' YVU=',YVU + YJ(NSECT,1)=0. + DO NPT=2,NBPT(NSECT)-1 + XV(NPT)=XP(NSECT,NPT)-XP(NSECT,1) + YV(NPT)=YP(NSECT,NPT)-YP(NSECT,1) + YJ(NSECT,NPT)=XV(NPT)*XVU+YV(NPT)*YVU +C WRITE(*,*)'YJ(',NSECT,',',NPT,')=',YJ(NSECT,NPT) +C On recalcule maintenant les nouvelles coordonnées +C (après projection sur le plan) des points de départ + XP(NSECT,NPT)=XP(NSECT,1)+YJ(NSECT,NPT)*XVU + YP(NSECT,NPT)=YP(NSECT,1)+YJ(NSECT,NPT)*YVU + ENDDO + YJ(NSECT,NBPT(NSECT))=NORM + ENDDO +C Remarque: il existe un risque d'inversion de l'ordre des points +C après projection (YJ non partout croissants) +C Ce cas peu probable n'est pas traité dans la version actuelle, +C mais c'est ici qu'il faudrait faire le tri des YJ,XP,YP,ZP +C par XJ croissants +C pas souhaitable si section presque fermee + + ELSE +C Calcul des points des sections en travers; cas section dépliée +C----------------------------------------------------------------------- + DO NSECT=1,NBSECT + YJ(NSECT,1)=0. + DO NPT=2,NBPT(NSECT) + YJ(NSECT,NPT)=YJ(NSECT,NPT-1) + & +((XP(NSECT,NPT)-XP(NSECT,NPT-1))**2. + & +(YP(NSECT,NPT)-YP(NSECT,NPT-1))**2.)**0.5 + ENDDO + ENDDO +C fin du if sur proj + ENDIF + WRITE(*,*)' ' + WRITE(*,*)'Calcul des sections en travers' + +C Élimination des informations superflues +C----------------------------------------------------------------------- +C NSECT (1..NBSECT),NPT (1..NBPT(NSECT)) indices +C des informations exhaustives +C I (1..LM-1),J (1..NBCOU) indices des informations triées + I=0 + DO NSECT=1,NBSECT +C Élimination des sections confondues + IF((NSECT.GT.1) + & .AND.(ABS(XSECT(NSECT)-XSECT(NSECT-1)).LE.EPSX))THEN + WRITE(*,*)'ATTENTION: la section de donnees ',NSECT-1 + & ,' a ete supprimee car trop proche de la suivante.' + ELSE + I=I+1 + ENDIF + XSECT(I)=XSECT(NSECT) + NOMSECT(I)=NOMSECT(NSECT) + J=0 + DO NPT=1,NBPT(NSECT) +C Élimination des points dont les abscisses latérales sont confondues... +C modif sairube2: on elimine que les points strictement confondus +C (en outre eps est passe de 1 mm à 0,1 mm) + IF((NPT.GT.1) + & .AND.(ABS(YJ(NSECT,NPT)-YJ(NSECT,NPT-1)).LE.EPS) + : .AND.(ABS(ZP(NSECT,NPT)-ZP(NSECT,NPT-1)).LE.EPS))THEN + WRITE(*,*)'ATTENTION: section ',NSECT,', le point ',NPT-1 + & ,' a ete supprime car trop proche du suivant.' +C ... mais on garde alors les étiquettes intéressantes + IF((TAGP(NSECT,NPT-1).EQ.TAG(NTAGCG)) + & .AND.(TAGP(NSECT,NPT).EQ.TAG(NTAGCD)))THEN + TAGP(NSECT,NPT)=' ' + ELSEIF(TAGP(NSECT,NPT-1).EQ.TAG(NTAGCG))THEN + TAGP(NSECT,NPT)=TAGP(NSECT,NPT-1) + ELSEIF(TAGP(NSECT,NPT-1).EQ.TAG(NTAGCD))THEN + TAGP(NSECT,NPT)=TAGP(NSECT,NPT-1) + ELSEIF((TAGP(NSECT,NPT-1).EQ.TAG(NTAGAG)) + & .AND.(TAGP(NSECT,NPT).EQ.TAG(NTAGAD)))THEN + TAGP(NSECT,NPT)=' ' + ELSEIF(TAGP(NSECT,NPT-1).EQ.TAG(NTAGAG))THEN + TAGP(NSECT,NPT)=TAGP(NSECT,NPT-1) + ELSEIF(TAGP(NSECT,NPT-1).EQ.TAG(NTAGAD))THEN + TAGP(NSECT,NPT)=TAGP(NSECT,NPT-1) + ENDIF + ELSE + J=J+1 + ENDIF + XP(I,J)=XP(NSECT,NPT) + YP(I,J)=YP(NSECT,NPT) + ZP(I,J)=ZP(NSECT,NPT) + TAGP(I,J)=TAGP(NSECT,NPT) + YJ(I,J)=YJ(NSECT,NPT) + ENDDO + NBPT(I)=J + ENDDO + LM=I+1 + WRITE(*,*)' ' + WRITE(*,*)'Tri des points superflus' + +C Gestion des étiquettes de lignes directrices +C----------------------------------------------------------------------- + DO I=1,LM-1 +C Pour TAGP, les superflues sont éliminées +C Pour CCOU, elles sont ajoutées si elles n'existent pas +C ETIG,ETID marques de l'existence de G et D + ETIG=.FALSE. + ETID=.FALSE. + DO J=1,NBPT(I) + IF((NTAGCG.NE.0).AND.(TAGP(I,J).EQ.TAG(NTAGCG)))THEN + CCOU(I,J)='G' + ETIG=.TRUE. + ELSEIF((NTAGCD.NE.0).AND.(TAGP(I,J).EQ.TAG(NTAGCD)))THEN + CCOU(I,J)='D' + ETID=.TRUE. + ELSEIF((NTAGAG.NE.0).AND.(TAGP(I,J).EQ.TAG(NTAGAG)))THEN + CCOU(I,J)='g' + ELSEIF((NTAGAD.NE.0).AND.(TAGP(I,J).EQ.TAG(NTAGAD)))THEN + CCOU(I,J)='d' + ELSE + TAGP(I,J)=' ' + CCOU(I,J)=' ' + ENDIF + ENDDO + IF(.NOT.ETIG) CCOU(I,1)='G' + IF(.NOT.ETID) CCOU(I,NBPT(I))='D' + ENDDO + +C Écriture de 'geomac-i0.etude' +C----------------------------------------------------------------------- + NOMFIC='geomac-i0.'//ETUDE +cliq NOMFIC='geomac-i.'//ETUDE + OPEN(10,FILE=NOMFIC,STATUS='UNKNOWN') + WRITE(10,110)LM-1 + DO I=1,LM-1 + WRITE(10,111)I,XSECT(I),NBPT(I) + DO J=1,NBPT(I) + WRITE(10,112)CCOU(I,J),YJ(I,J),ZP(I,J) +cliq WRITE(10,113)CCOU(I,J),YJ(I,J),ZP(I,J),0.1,1.,0. + ENDDO + ENDDO + WRITE(*,*)' ' + WRITE(*,*)'Ecriture du fichier ',NOMFIC + CLOSE(10) + +C Écriture de 'm.etude' +C----------------------------------------------------------------------- + NOMFIC='m.'//ETUDE + OPEN(25,FILE=NOMFIC,STATUS='UNKNOWN') + DO I=1,LM-1 + WRITE(25,101)I,I,0,NBPT(I),XSECT(I),NOMSECT(I) + DO J=1,NBPT(I) + WRITE(25,102)XP(I,J),YP(I,J),ZP(I,J),TAGP(I,J) + ENDDO + WRITE(25,102)999.9990,999.9990,0.0000,' ' + ENDDO + CLOSE(25) + WRITE(*,*)' ' + WRITE(*,*)'Ecriture du fichier ',NOMFIC + +C Écriture du fichier de maillage 'mail.etude' +C----------------------------------------------------------------------- + NOMFIC='geomac-i0.'//ETUDE +cliq NOMFIC='geomac-i.'//ETUDE + CALL EXTMAIL(NOMFIC) + WRITE(*,*)' ' + WRITE(*,*)'Ecriture du fichier mail.',ETUDE + +C Écriture de 'litactif.etude' +C----------------------------------------------------------------------- +C JAG,JAD indices des marques de lit actif à gauche 'g' et à droite 'd' + NOMFIC='litactif.'//ETUDE + OPEN(20,FILE=NOMFIC,STATUS='UNKNOWN') + DO I=1,LM-1 + JAG=1 + ETIG=.TRUE. + JAD=NBPT(I) + ETID=.TRUE. + DO J=1,NBPT(I) + IF(ETIG)THEN + IF(CCOU(I,J).EQ.'g')THEN + JAG=J + ETIG=.FALSE. + ELSEIF(CCOU(I,J).EQ.'G')THEN + JAG=J + ENDIF + ENDIF + IF(ETID)THEN + IF(CCOU(I,J).EQ.'d')THEN + JAD=J + ETID=.FALSE. + ELSEIF(CCOU(I,J).EQ.'D')THEN + JAD=J + ENDIF + ENDIF + ENDDO +C WRITE(20,120) XSECT(I),ABS(YJ(I,JAD)-YJ(I,JAG)) + WRITE(20,120) XSECT(I) + :,ABS(0.5*(YJ(I,JAD)+YJ(I,JAD-1))-0.5*(YJ(I,JAG)+YJ(I,JAG+1))) + ENDDO + CLOSE(20) + WRITE(*,*)' ' + WRITE(*,*)'Ecriture du fichier ',NOMFIC + + RETURN + +C Traitement des erreurs +C----------------------------------------------------------------------- + 1000 CONTINUE + WRITE(*,*)' ' + WRITE(*,*)'ERREUR sur le fichier ',NOMFIC2 + WRITE(*,*)'Le fichier n''existe pas ou est illisible' + WRITE(*,*)'Tapez <entree>' + READ(*,*) + + 100 FORMAT(A50) + 101 FORMAT(4I6,F13.4,1X,A42) + 102 FORMAT(3f13.4,1X,A3) + 110 FORMAT(I4) + 111 FORMAT(I4,1X,F11.3,1X,I4) + 112 FORMAT(A1,1X,F11.5,F13.5) + 113 FORMAT(A1,1X,F11.5,F13.5,2F15.10,f15.5) + 120 FORMAT(1X,F11.3,1X,F11.5) + + RETURN + END + + +C----------------------------------------------------------------------- + SUBROUTINE SAISED +C----------------------------------------------------------------------- +C Saisie des paramètres sédimentaires par tronçon pour compléter +C 'geomac-i0.etude' en 'geomac-i.etude' +C----------------------------------------------------------------------- + IMPLICIT NONE + INTEGER LMAX,NCMAX,CSMAX + PARAMETER(LMAX=3000,NCMAX=300,CSMAX=10) + LOGICAL ENCOREZONE,ENCORECS,EPCS(LMAX,CSMAX) + INTEGER I,N,NBSECT,NZONE,NBZONE + INTEGER J,NCOU(LMAX) + INTEGER K,NCS,NBCS(LMAX),NBCSZONE(LMAX) + CHARACTER ETUDE*20,NOMFIC*40,FINLIGNE*600,REP*1 + CHARACTER*1 CCOU(LMAX,NCMAX) + DOUBLE PRECISION EPSX,ZERO + DOUBLE PRECISION YCOU(LMAX,NCMAX),ZCOU(LMAX,NCMAX) + DOUBLE PRECISION XSECT(LMAX),ZCS(LMAX,NCMAX,CSMAX) + & ,DCS(LMAX,NCMAX,CSMAX),SCS(LMAX,NCMAX,CSMAX) + & ,TMCS(LMAX,NCMAX,CSMAX) + DOUBLE PRECISION XZONE(LMAX),ZEZONE(LMAX,CSMAX),DZONE(LMAX,CSMAX) + & ,SZONE(LMAX,CSMAX),TMZONE(LMAX,CSMAX) + + COMMON/ETUDE/ETUDE + +C Initialisation +C----------------------------------------------------------------------- +C EPSX est la tolérance le long du profil en long en dessous de +C laquelle deux sections sont confondues + EPSX=0.001 + ZERO=0.0000000000 + NOMFIC='geomac-i0.'//ETUDE + WRITE(*,*)' ' + WRITE(*,*)'SAISIE DES PARAMETRES SEDIMENTAIRES' + WRITE(*,*)'POUR COMPLEMENT DU FICHIER DE TOPOGRAPHIE ',NOMFIC + WRITE(*,*)' ' + +C Lecture de 'geomac-i0.etude' +C----------------------------------------------------------------------- + OPEN(24,FILE=NOMFIC,STATUS='OLD',ERR=1000) + READ(24,*,ERR=1001)NBSECT + DO I=1,NBSECT + READ(24,*,ERR=1001)N,XSECT(I),NCOU(I) + IF(N.NE.I) WRITE(*,*)'ATTENTION, la section ',N + & ,'est mal ordonee dans ',NOMFIC + DO J=1,NCOU(I) + READ(24,130,ERR=1001)CCOU(I,J),FINLIGNE + READ(FINLIGNE,*,ERR=1001)YCOU(I,J),ZCOU(I,J) + ENDDO + ENDDO + CLOSE(24) +C WRITE(*,*)'Lecture des ',NBSECT,' sections de donnees de ',NOMFIC + +C Saisie des donnee sedimentaires par zones +C----------------------------------------------------------------------- + WRITE(*,*)' ' + WRITE(*,*)'ATTENTION1: les abscisses des limites de zones doivent' + & ,' etre croissantes.' + WRITE(*,*)'ATTENTION2: les caracteristiques sedimentaires sont ' + & ,'constantes sur une zone (pas d''interpolation).' + WRITE(*,*)'ATTENTION3: dans une zone, il y a au maximum ',CSMAX + & ,' couches sedimentaires de caracteristiques differentes.' + ENCOREZONE=.TRUE. + NZONE=1 + DO WHILE(ENCOREZONE) + +C Abscisse de fin de zone + WRITE(*,*)' ' + IF(NZONE.GT.1) WRITE(*,*)'On est dans la zone ',NZONE + & ,' commencant a l''abscisse ',XZONE(NZONE-1),' m (exclus)' + 100 CONTINUE + WRITE(*,*)'Quelle est l''abscisse de fin de la zone ',NZONE + & ,'(inclus; prolonge en aval si derniere zone) ? (m)' + READ(*,*)XZONE(NZONE) + IF((NZONE.GT.1).AND.(XZONE(NZONE).LE.XZONE(NZONE-1)))THEN + WRITE(*,*)'ATTENTION: abscisse non croissante. Recommencez.' + GOTO 100 + ENDIF + +C Informations pour la strate superficielle + NCS=1 + WRITE(*,*)' ' + WRITE(*,*)'On est dans la strate 1 (superficielle) ' + & ,'de la zone',NZONE,'.' + WRITE(*,*)'- diametre representatif (m) ?' + READ(*,*)DZONE(NZONE,NCS) + WRITE(*,*)'- parametre d''etendue (m/m) ? [racine(D84/D16)]' + READ(*,*)SZONE(NZONE,NCS) + WRITE(*,*)'- contrainte critique de mise en mouvement (N/m2) ' + & ,'? [0.000 si calcul par Shields; 999.999 si inerodable]' + READ(*,*)TMZONE(NZONE,NCS) + IF(TMZONE(NZONE,NCS).GE.999.)THEN + TMZONE(NZONE,NCS)=999.9990D+00 + ENCORECS=.FALSE. + ELSE + IF(TMZONE(NZONE,NCS).LE.ZERO) TMZONE(NZONE,NCS)=0.D+00 + WRITE(*,*)'Dans cette zone, y a-t-il une autre strate ' + & ,'sedimentaire plus profonde ? (O/N)' + READ(*,*)REP + IF(REP.EQ.'O'.OR.REP.EQ.'o')THEN + ENCORECS=.TRUE. + EPCS(NZONE,NCS)=.TRUE. + NCS=NCS+1 + ELSE + ENCORECS=.FALSE. + ENDIF + ENDIF + + DO WHILE(ENCORECS) +C Type de caractérisation de la strate: epaisseur ou cote plancher +C EPCS(NZONE,NCS) et ZEZONE(NZONE,NCS) caractérisent la strate NCS-1 +C (son épaisseur ou son plancher) mais n'ont de sens +C que si la strate NCS existe +C EPCS(NZONE,1) et ZEZONE(NZONE,1) n'ont donc pas +C vraiment de sens physique + IF(EPCS(NZONE,NCS-1))THEN + WRITE(*,*)'La strate superieure peut etre caracterisee par ' + & ,'une epaisseur constante sur le profil en travers ou ' + & ,'par une cote de plancher (plafond de la strate ' + & ,'inferieure) constante.' + WRITE(*,*)'Voulez-vous saisir une epaisseur ? (O/N)' + READ(*,*)REP + IF(REP.EQ.'O'.OR.REP.EQ.'o')THEN + EPCS(NZONE,NCS)=.TRUE. + ELSE + EPCS(NZONE,NCS)=.FALSE. + ENDIF + ELSE + EPCS(NZONE,NCS)=.FALSE. + ENDIF + +C Saisie epaisseur ou cote plancher + IF(EPCS(NZONE,NCS))THEN + WRITE(*,*)'- epaisseur de la strate sedimentaire superieure' + & ,' (m) ?' + ELSE + WRITE(*,*)'- cote du plancher de la strate sedimentaire ' + & ,'superieure (m) ?' + ENDIF + READ(*,*)ZEZONE(NZONE,NCS) + +C Saisie de la strate sous-jacente: diametre, étendue, contrainte + WRITE(*,*)' ' + WRITE(*,*)'On est dans la strate ',NCS,' de la zone',NZONE,'.' + WRITE(*,*)'- diametre representatif (m) ?' + READ(*,*)DZONE(NZONE,NCS) + WRITE(*,*)'- parametre d''etendue (m/m) ? [racine(D84/D16)]' + READ(*,*)SZONE(NZONE,NCS) + WRITE(*,*)'- contrainte critique de mise en mouvement (N/m2) ' + & ,'? [0.000 si calcul par Shields; 999.999 si inerodable]' + READ(*,*)TMZONE(NZONE,NCS) + +C Passage à la saisie du compartiment sédimentaire suivant + IF(TMZONE(NZONE,NCS).GE.999.)THEN + TMZONE(NZONE,NCS)=999.9990D+00 + ENCORECS=.FALSE. + ELSEIF(NCS.EQ.CSMAX)THEN + ENCORECS=.FALSE. + ELSE + IF(TMZONE(NZONE,NCS).LE.ZERO) TMZONE(NZONE,NCS)=0.D+00 + WRITE(*,*)'Dans cette zone, y a-t-il une autre strate ' + & ,'sedimentaire plus profonde ? (O/N)' + READ(*,*)REP + IF(REP.EQ.'O'.OR.REP.EQ.'o')THEN + ENCORECS=.TRUE. + NCS=NCS+1 + ELSE + ENCORECS=.FALSE. + ENDIF + ENDIF + ENDDO + NBCSZONE(NZONE)=NCS + +C Passage à la saisie de la zone suivante + WRITE(*,*)' ' + WRITE(*,*)'Y a-t-il une autre zone ? (O/N)' + READ(*,*)REP + IF(REP.EQ.'O'.OR.REP.EQ.'o')THEN + ENCOREZONE=.TRUE. + NZONE=NZONE+1 + ELSE + ENCOREZONE=.FALSE. + ENDIF + ENDDO + NBZONE=NZONE + +C Interpolation des caractéristiques sédimentaires +C----------------------------------------------------------------------- + NZONE=1 + DO I=1,NBSECT +C Recherche de la zone de données à exploiter + DO WHILE((NZONE.LT.NBZONE).AND.(XZONE(NZONE).LE.XSECT(I)-EPSX)) + NZONE=NZONE+1 + ENDDO +C Interpolation en chaque point + DO J=1,NCOU(I) + DO K=1,NBCSZONE(NZONE) + IF(K.EQ.1)THEN + ZCS(I,J,K)=ZCOU(I,J) + ELSE + IF(EPCS(NZONE,K))THEN + ZCS(I,J,K)=ZCS(I,J,K-1)-ZEZONE(NZONE,K) + ELSE + ZCS(I,J,K)=ZEZONE(NZONE,K) + IF(ZCS(I,J,K).GT.ZCS(I,J,K-1)) ZCS(I,J,K)=ZCS(I,J,K-1) + ENDIF + ENDIF + DCS(I,J,K)=DZONE(NZONE,K) + SCS(I,J,K)=SZONE(NZONE,K) + TMCS(I,J,K)=TMZONE(NZONE,K) + ENDDO + ENDDO + NBCS(I)=NBCSZONE(NZONE) + ENDDO + WRITE(*,*)'Fin de l''interpolation' + +C Écriture de 'geomac-i.etude' +C----------------------------------------------------------------------- + NOMFIC='geomac-i.'//ETUDE + OPEN(24,FILE=NOMFIC,STATUS='UNKNOWN') + WRITE(24,110)NBSECT,0. + DO I=1,NBSECT + WRITE(24,111)I,XSECT(I),NCOU(I) + DO J=1,NCOU(I) + DO K=1,NBCS(I) + N=1+58*(K-1) + WRITE(FINLIGNE(N:),113)ZCS(I,J,K),DCS(I,J,K),SCS(I,J,K) + & ,TMCS(I,J,K) + ENDDO + WRITE(24,112)CCOU(I,J),YCOU(I,J),FINLIGNE + ENDDO + ENDDO + CLOSE(24) + WRITE(*,*)'Ecriture de ',NOMFIC + RETURN + +C Traitement des erreurs +C----------------------------------------------------------------------- + 1000 CONTINUE + WRITE(*,*)' ' + WRITE(*,*)'ERREUR sur le fichier ',NOMFIC + WRITE(*,*)'Le fichier n''existe pas ou est illisible' + WRITE(*,*)'Tapez <entree>' + READ(*,*) + RETURN + + 1001 CONTINUE + WRITE(*,*)' ' + WRITE(*,*)'ERREUR sur le fichier ',NOMFIC + WRITE(*,*)'Le format du fichier est incorrect' + WRITE(*,*)'Tapez <entree>' + READ(*,*) + RETURN + + + + 110 FORMAT(I4,1X,F12.3) + 111 FORMAT(I4,1X,F11.3,1X,I4) + 112 FORMAT(A1,1X,F11.5,A600) + 113 FORMAT(F13.5,F15.10,F15.10,F15.5) + 130 FORMAT(A1,1X,A) + END + + +C----------------------------------------------------------------------- + SUBROUTINE SAILACT +C----------------------------------------------------------------------- +C Saisie du fichier des largeurs actives 'litactif.etude' +C----------------------------------------------------------------------- + IMPLICIT NONE + INTEGER LMAX + PARAMETER (LMAX=3000) + INTEGER I,NBSECT + LOGICAL ENCORE + CHARACTER ETUDE*20,NOMFIC*40,REP*1 + DOUBLE PRECISION XSECT(LMAX),LACT(LMAX) + + COMMON/ETUDE/ETUDE + +C Initialisation +C----------------------------------------------------------------------- + NOMFIC='litactif.'//ETUDE + ENCORE=.TRUE. + I=0 + WRITE(*,*)' ' + WRITE(*,*)'SAISIE DES LARGEURS ACTIVES PAR ZONES' + WRITE(*,*)' ' + +C Test de l'existence préalable du fichier +C----------------------------------------------------------------------- + OPEN(20,FILE=NOMFIC,STATUS='OLD',ERR=1000) + WRITE(*,*)'Le fichier de largeurs actives ',NOMFIC + WRITE(*,*)'existe deja. Il a pu etre cree a partir du fichier ' + & ,'de topographie au format Mocahy.' + WRITE(*,*)'Voulez-vous reellement l''ecraser ? (O/N)' + READ(*,'(A1)')REP + IF((REP.EQ.'N').OR.(REP.EQ.'n')) RETURN + CLOSE(20) + 1000 CONTINUE + +C Saisie des largeurs actives par zones +C----------------------------------------------------------------------- + WRITE(*,*)' ' + WRITE(*,*)'ATTENTION: Les abscisses doivent etre croissantes.' + DO WHILE(ENCORE) + I=I+1 + WRITE(*,*)' ' + 1001 CONTINUE + WRITE(*,*)'Entrez le couple abscisse (m) - largeur active (m) ' + & ,'numero ',I + READ(*,*)XSECT(I),LACT(I) + IF((I.GT.1).AND.(XSECT(I).LE.XSECT(I-1)))THEN + WRITE(*,*)'ATTENTION: abscisse non croissante. Recommencez.' + GOTO 1001 + ENDIF + IF(LACT(I).LT.0.)THEN + WRITE(*,*)'ATTENTION: la largeur active ne peut pas etre ' + & ,'negative. Recommencez.' + GOTO 1001 + ENDIF + WRITE(*,*)'Y-a-il un autre couple ? (O/N)' + READ(*,'(A1)')REP + IF((REP.EQ.'N').OR.(REP.EQ.'n')) ENCORE=.FALSE. + ENDDO + NBSECT=I + +C Écriture de 'litactif.etude' +C----------------------------------------------------------------------- + OPEN(20,FILE=NOMFIC,STATUS='UNKNOWN') + DO I=1,NBSECT + WRITE(20,120)XSECT(I),LACT(I) + ENDDO + CLOSE(20) + WRITE(*,*)' ' + WRITE(*,*)'Ecriture du fichier ',NOMFIC + + RETURN + 120 FORMAT(1X,F11.3,1X,F11.5) + END + + + +C----------------------------------------------------------------------- + SUBROUTINE EXTMAIL(NOMFIC) +C----------------------------------------------------------------------- +C Extraction du maillage à partir du fichier de géométrie NOMFIC +C----------------------------------------------------------------------- + IMPLICIT NONE + INTEGER LMAX + PARAMETER(LMAX=3000) + CHARACTER NOMFIC*38 + INTEGER LM + INTEGER I,J,N,NBSEC,NBPT + DOUBLE PRECISION TMAIL(LMAX),XTMAIL(LMAX) + DOUBLE PRECISION EPSX,XSECT(LMAX) + + COMMON/TMAIL/TMAIL,XTMAIL + COMMON/NBMA/LM + +C Initialisation +C----------------------------------------------------------------------- +C EPSX est la tolérance en espace le long du profil en long +C en dessous de laquelle deux sections sont confondues + EPSX=0.01 + +C Lecture du fichier de géométrie +C----------------------------------------------------------------------- + OPEN(11,FILE=NOMFIC,STATUS='OLD',ERR=1000) + READ(11,*)NBSEC + DO I=1,NBSEC + READ(11,*,ERR=1001) N,XSECT(I),NBPT + IF(N.NE.I) WRITE(*,*)'ATTENTION, section ',N + & ,' mal numerotee dans le fichier ',NOMFIC + DO J=1,NBPT + READ(11,*,ERR=1001) + ENDDO + ENDDO + CLOSE(11) + +C Interpolation du maillage +C----------------------------------------------------------------------- + XTMAIL(1)=XSECT(1) + TMAIL(1)=XSECT(1) + DO I=2,NBSEC + XTMAIL(I)=XSECT(I) + TMAIL(I)=0.5*(XTMAIL(I)+XTMAIL(I-1)) + ENDDO + LM=NBSEC+1 + TMAIL(LM)=XTMAIL(LM-1) + +C Écriture du fichier mail.ETUDE +C----------------------------------------------------------------------- + CALL ECRIMA + RETURN + +C Traitement des erreurs +C----------------------------------------------------------------------- + 1000 CONTINUE + WRITE(*,*)' ' + WRITE(*,*)'ERREUR sur le fichier ',NOMFIC + WRITE(*,*)'Le fichier n''existe pas ou est illisible' + WRITE(*,*)'Tapez <entree>' + READ(*,*) + RETURN + + 1001 CONTINUE + WRITE(*,*)' ' + WRITE(*,*)'ERREUR sur le fichier ',NOMFIC + WRITE(*,*)'Le format du fichier est incorrect' + WRITE(*,*)'Tapez <entree>' + READ(*,*) + RETURN + + END +