C BANTOU SOURCE PV 09/03/12 21:15:33 6325 SUBROUTINE BANTOU # (TABCOR,TABVAL,LADIM,ZSIG,VALMOY,DELZET,OMMAX) C C----------------------------------------------------------------------- C Cet opérateur génère un champ aléatoire par la méthode des C bandes tournantes. C Renvoi un pointeur actif TABVAL sur la liste des valeurs C Les coordonnées en entrée ont été adimensionnées par Lambda, C c-à-d qu'on s'est ramené au cas isotrope avec lambda = 1 C----------------------------------------------------------------------- C C--------------------------- C Paramètres Entrée/Sortie : C--------------------------- C C E/ TABCOR : Pointeur sur la TABLE contenant les coordonnées des C points où l'on va générer les valeurs (il peut y avoir C répétition) C /S TABVAL : Pointeur actif sur la TABLE contenant les valeurs en ces C points C E/ LADIM : Indicateur de la dimension relative aux propriétés C aléatoires du champ à générer C E/ ZSIG : Ecart-type du champ aléatoire à générer C E/ DELZET : Incrément d'espace sur la bande (Pas de discrétisation) C E/ OMMAX : Vecteur d'onde de coupure C C-------------------------- C Variables internes : C-------------------------- C C NLINE : Nombre de bandes C XLDOM : Dimension maximale du domaine C DOMEGA : Incrément de vecteur d'onde C C--------------------------- C Ajouts intéressants C--------------------------- C C======================================================================= C IMPLICIT INTEGER(I-N) IMPLICIT REAL*8(A-H,O-Z) C -INC PPARAM -INC CCOPTIO -INC SMCOORD -INC SMCHAML -INC SMELEME -INC CCREEL C C TABLE DES COORDONNEES DES POINTS SUPPORTS SEGMENT TABCOR REAL*8 COR(NBL,3) ENDSEGMENT C TABLE DES VALEURS EN CES POINTS SEGMENT TABVAL REAL*8 VAL(NBL) ENDSEGMENT SEGMENT TH(NLINE) SEGMENT PHI(NLINE) SEGMENT ZETMIN(NLINE) SEGMENT ZETMAX(NLINE) SEGMENT XLINE(NZET) C C EPSILON SERVANT A DIFFERENTS TESTS C EPS=1.D-12 C C INITIALISATION DU CHAMP ALEATOIRE A ZERO C SEGACT TABCOR NBL = COR(/1) SEGINI TABVAL DO 20 I=1,NBL VAL(I) = 0.D0 20 CONTINUE C C =========================================================== C = Génération des angles décrivant chaque point des lignes = C =========================================================== C C 1D C ---- C IF (LADIM.EQ.1) THEN C Le champ aléatoire a des propriétés unidirectionnelles C On génère une seule bande (NLINE = 1) de direction (1 0 0) C On n'a pas besoin de TH ni de PHI NLINE=1 C C 2D C ---- C ELSEIF (LADIM.EQ.2) THEN C Le champ aléatoire a des propriétés bidimensionnelles C Générer des lignes de direction répartie régulièrement entre 0 C et 2*PI C NLINE est figé à une valeur fixe : 100 C NLINE=100 SEGINI TH C C THETA VARIE ENTRE 0 ET 2*PI C DO 1 I=1,NLINE TH(I) = 2.D0*XPI * FLOAT(I-1) / FLOAT(NLINE) 1 CONTINUE C C 3D C ---- C ELSEIF (LADIM.EQ.3) THEN C Le champ aléatoire a des propriétés tridimensionnelles C Générer des lignes de direction aléatoire répartie entre 0 et C 2*PI pour le site, et 0 et PI pour l'azimuth C NLINE est figé à une valeur fixe : 1000 C NLINE=1000 SEGINI TH SEGINI PHI C C THETA varie aléatoirement entre 0 et 2*PI, PHI entre 0 et PI C THETA et COS(PHI) suivent des lois uniformes C DO 2 I=1,NLINE CALL TDRAND(XRAN) TH(I)=XRAN*XPI*2.D0 CALL TDRAND(XRAN) PHI(I)=ACOS(1.D0-2.D0*XRAN) 2 CONTINUE ENDIF C C =========================================================== C = Détermination de la dimension maximale du domaine XLDOM = C = et des pas de discrétisation de l'espace dual DOMEGA = C =========================================================== C utile uniquement en dimension > 1 C XLDOM est le maximum sur toutes les bandes de l'intervalle des C valeurs algébriques des positions de la projection de chaque point C du maillage sur ces droites. SEGINI ZETMIN SEGINI ZETMAX XLDOM=-1.D0 C IF (LADIM.EQ.1) THEN L = 1 ZETMAX(L) = -1 * XGRAND ZETMIN(L) = XGRAND DO 9 I=1,NBL ZET = COR(I,1) ZETMIN(L) = MIN (ZETMIN(L), ZET) ZETMAX(L) = MAX (ZETMAX(L), ZET) 9 CONTINUE XLDOM = MAX (XLDOM, ZETMAX(L)-ZETMIN(L)) C ELSEIF (LADIM.EQ.2) THEN C DO 4 L=1,NLINE ZETMAX(L) = -1 * XGRAND ZETMIN(L) = XGRAND THETA = TH(L) XLI = COS(THETA) YLI = SIN(THETA) DO 5 I=1,NBL X = COR(I,1) Y = COR(I,2) ZET = X*XLI + Y*YLI ZETMIN(L) = MIN (ZETMIN(L), ZET) ZETMAX(L) = MAX (ZETMAX(L), ZET) 5 CONTINUE XLDOM = MAX (XLDOM, ZETMAX(L)-ZETMIN(L)) 4 CONTINUE C ELSE C DO 6 L=1,NLINE ZETMAX(L) = -1 * XGRAND ZETMIN(L) = XGRAND THETA = TH(L) FI = PHI(L) XLI = COS(THETA) * SIN(FI) YLI = SIN(THETA) * SIN(FI) ZLI = COS(FI) DO 7 I=1,NBL X = COR(I,1) Y = COR(I,2) Z = COR(I,3) ZET = X*XLI + Y*YLI + Z*ZLI ZETMIN(L) = MIN (ZETMIN(L), ZET) ZETMAX(L) = MAX (ZETMAX(L), ZET) 7 CONTINUE XLDOM = MAX (XLDOM, ZETMAX(L)-ZETMIN(L)) 6 CONTINUE C ENDIF C C DOMEGA doit être inférieur à pi / L DOMEGA = .9 * (XPI / XLDOM) C C =========================================================== C = Génération du champ aléatoire = C =========================================================== C Sommation sur toutes les bandes de la valeur trouvée sur la bande C en cours au point projeté du point considéré sur cette bande, C et ce, pour chaque point champ à créer. C Les valeurs en deux points confondus sont égales. C C 1D C ---- C IF (LADIM.EQ.1) THEN C Valeurs aléatoires sur la bande NZET = INT ((ZETMAX(1) - ZETMIN(1)) / DELZET) + 2 SEGINI XLINE ZETMIL = ZETMIN(1) CALL BANT1D(DOMEGA,OMMAX,DELZET,ZETMIL,XLINE) C C PROJECT LINE PROCESS TO GENERATE 2-D ARRAY C DO 8 I=1,NBL ZET = COR(I,1) INDEX = INT ((ZET - ZETMIN(1)) / DELZET + 0.5D0) + 1 VAL(I) = VAL(I) + XLINE(INDEX) 8 CONTINUE SEGSUP XLINE C C 2D C ---- C ELSEIF (LADIM.EQ.2) THEN C DO 12 L=1,NLINE C Valeurs aléatoires sur la bande NZET = INT ((ZETMAX(L) - ZETMIN(L)) / DELZET) + 2 SEGINI XLINE C ZETMIL = ZETMIN(L) CALL BANT2D(DOMEGA,OMMAX,DELZET,ZETMIL,XLINE) C C PROJECT LINE PROCESS TO GENERATE 2-D ARRAY C THETA = TH(L) XLI = COS(THETA) YLI = SIN(THETA) DO 13 I=1,NBL X = COR(I,1) Y = COR(I,2) ZET = X*XLI + Y*YLI INDEX = INT ((ZET - ZETMIN(L)) / DELZET + 0.5D0) + 1 VAL(I) = VAL(I) + XLINE(INDEX) 13 CONTINUE C SEGSUP XLINE C 12 CONTINUE SEGSUP TH C C 3D C ---- C ELSEIF (LADIM.EQ.3) THEN C DO 15 L=1,NLINE C Valeurs aléatoires sur la bande NZET = INT ((ZETMAX(L) - ZETMIN(L)) / DELZET) + 2 SEGINI XLINE ZETMIL = ZETMIN(L) CALL BANT3D(DOMEGA,OMMAX,DELZET,ZETMIL,XLINE) C C PROJECT LINE PROCESS TO GENERATE 3-D ARRAY C THETA = TH(L) FI = PHI(L) XLI = COS(THETA) * SIN(FI) YLI = SIN(THETA) * SIN(FI) ZLI = COS(FI) DO 16 I=1,NBL X = COR(I,1) Y = COR(I,2) Z = COR(I,3) ZET = X*XLI + Y*YLI + Z*ZLI INDEX = INT ((ZET - ZETMIN(L)) / DELZET + 0.5D0) + 1 VAL(I) = VAL(I) + XLINE(INDEX) 16 CONTINUE C SEGSUP XLINE C 15 CONTINUE SEGSUP TH SEGSUP PHI ENDIF C C.....DIVIDE BY SQRT(FLOAT(NLINE)) C et mise à la moyenne C XX1 = ZSIG / SQRT(FLOAT(NLINE)) DO 18 I=1,NBL VAL(I) = (VAL(I)*XX1) + VALMOY 18 CONTINUE C SEGSUP ZETMIN SEGSUP ZETMAX C RETURN END