m0n0lithic

lito.for

Jun 5th, 2014
271
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Fortran 79.92 KB | None | 0 0
  1.      El modulo principal del programa de litodinamica para la zona costera
  2. c
  3. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 2.2, 2001
  4. c
  5. c     Las ultimas correcciones:    18.07.01
  6. C     Mejoras:                     12.02.02
  7. c
  8. c---------------------------------------------------------------------------
  9.       INCLUDE 'COMML.FOR'
  10.       INCLUDE 'VARS.INC'
  11.  
  12.       OPEN (1,FILE=LITOP//'ENLACE.DAT')
  13.       READ(1,*)IEN
  14.       CLOSE (1)
  15.  
  16.       OPEN (1,FILE=LITOP//'IPSI.DAT')
  17.       READ(1,*)IPS
  18.       READ(1,*)ITER1
  19.       READ(1,*)PERC
  20.       CLOSE (1)
  21.  
  22.       OPEN (1,FILE=LITOP//'FORM.DAT')
  23.       READ(1,*)IFORM
  24.       READ(1,*)IFORMW
  25.       READ(1,*)IFORMT
  26.       CLOSE (1)
  27.  
  28.       IF(IEN.EQ.0)THEN
  29.  
  30. C     CALL INIC
  31.  
  32.       WRITE(*,*)'      MODELO DE LITODINAMICA DE LA ZONA COSTERA (LIZC)'
  33.       WRITE(*,*)' '
  34.       WRITE(*,*)'Centro de Investigaciones Oceanograficas e Hidrografica
  35.     &s (CIOH)'
  36.       WRITE(*,*)' '
  37.       WRITE(*,*)'              Version 2.2, 1999 - 2001 '
  38.       WRITE(*,*)' '
  39.       WRITE(*,*)' '
  40.  
  41.       ELSE
  42.       WRITE(*,*)' '
  43.       WRITE(*,*)' '
  44.       WRITE(*,*)'MODELO DE LITODINAMICA'
  45.       WRITE(*,*)' '
  46.       WRITE(*,*)'Continuaci�n. Enlace #  ',IEN
  47.       END IF
  48.  
  49.       CALL SWITCHE
  50. C------------------- GRID CONSTANTS ---------------
  51.       OPEN (1,FILE=LITOP//'PARAM1.DAT')
  52.       READ(1,*)HAG
  53.       READ(1,*)PF
  54.       READ(1,*)FI
  55.       READ(1,*)M
  56.       READ(1,*)N
  57.       READ(1,*)MM
  58.       READ(1,*)NN
  59.       READ(1,*)DMIN
  60.       READ(1,*)ICURV
  61.       READ(1,*)SCALE
  62.       READ(1,*)IXYP
  63.       READ(1,*)IBOUND
  64.       READ(1,*)XMIN
  65.       READ(1,*)YMIN
  66.       READ(1,*)XLIM
  67.       READ(1,*)YLIM
  68.       READ(1,*)MC,NC
  69.       READ(1,*)NHC
  70.       IF(NHC.GT.10)STOP'NO SE PERMITE LA CANTIDAD DE NODOS H(t) > 10'
  71.       DO K=1,NHC
  72.       READ(1,*)MCH(K),NCH(K)
  73.       END DO
  74.  
  75. C     IF(ICURV.NE.0)HAG=1.    ! puede ser en un caso especial
  76.  
  77.       YL=2.*7.29E-05*SIN(FI*3.14/180.)
  78.       M1=M+1
  79.       N1=N+1
  80.       CLOSE (1)
  81.  
  82.       OPEN (1,FILE=LITOP//'PARAM3.DAT')
  83.       READ(1,*)UNI
  84.       IF(UNI.NE.0.)THEN
  85.       READ(1,*)PF1
  86.       READ(1,*)PF2
  87.       READ(1,*)MREF
  88.       READ(1,*)NREF
  89.       OPEN (2,FILE=LITOP//'INDEX1.DAT')
  90.       DO J=1,N1
  91.       IF(IFORM.EQ.1)JJ=N1-J+1
  92.       IF(IFORM.EQ.0)JJ=J
  93.       READ(2,*)(ZNAK1(JJ,I),I=1,M1)
  94.       END DO
  95.       CLOSE (2)
  96.       ELSE
  97.       END IF
  98.  
  99.       CLOSE (1)
  100.  
  101. C------------------- STRUCTURES ------------
  102.       OPEN (1,FILE=LITOP//'PARAM4.DAT')
  103.       READ(1,*)PF3
  104.       CLOSE (1)
  105.       OPEN (2,FILE=LITOP//'STRUCT.DAT')
  106.  
  107.       DO J=1,N1
  108.       IF(IFORM.EQ.1)JJ=N1-J+1
  109.       IF(IFORM.EQ.0)JJ=J
  110.       READ(2,*)(ZNAK2(JJ,I),I=1,M1)
  111.       END DO
  112.       CLOSE (2)
  113. C------------------- DEPTH CALC. ------------------
  114.       OPEN (1,FILE=LITOP//'BOTTOM.DAT')
  115.       DO J=1,N1
  116.       IF(IFORM.EQ.1)JJ=N1-J+1
  117.       IF(IFORM.EQ.0)JJ=J
  118.       READ(1,*)(H(JJ,I),I=1,M1)
  119.       END DO
  120.       CLOSE (1)
  121.       OPEN (1,FILE=LITOP//'BOTTOM0.DAT')         !
  122.       DO J=1,N1                           !  changeable name
  123.       IF(IFORM.EQ.1)JJ=N1-J+1                           !
  124.       IF(IFORM.EQ.0)JJ=J                                !
  125.       READ(1,*)(H0(JJ,I),I=1,M1)          !
  126.       END DO                              !
  127.       CLOSE (1)                           !
  128.  
  129.       CALL CHECK
  130.  
  131.       CALL BOT
  132. C-----------------  PROFILES ---------------------------
  133.       OPEN (1,FILE=LITOP//'PERFIL.DAT')
  134.       READ(1,*)NPERF
  135.       IF(NPERF.GT.10)THEN
  136.       WRITE(*,*)'Cantidad de perfiles no puede ser mayor de 10'
  137.       STOP
  138.       ELSE
  139.       END IF
  140.  
  141.       DO II=1,NPERF
  142.       READ(1,*)MX(II),NY(II)
  143.       IF(MX(II).NE.0.AND.NY(II).NE.0)THEN
  144.       WRITE(*,*)'Coordenadas de los perfiles no son correctas'
  145.       STOP
  146.       ELSE
  147.       END IF
  148.       END DO
  149.  
  150.       READ(1,*)NPERF1
  151.       IF(NPERF1.GT.90)THEN
  152.       WRITE(*,*)'Cantidad de perfiles digital no puede ser mayor de 90'
  153.       STOP
  154.       ELSE
  155.       END IF
  156.       IF(NPERF1.EQ.0)THEN
  157.       CLOSE(1)
  158.       ELSE
  159.  
  160.  
  161.       READ(1,*)IAUTO
  162.       READ(1,*)RMIN0
  163.       READ(1,*)RMIN1
  164.       READ(1,*)L5
  165.  
  166.       DO II=1,NPERF1
  167.       READ(1,*)NP(II)
  168.       DO JJ=1,NP(II)
  169.       READ(1,*)XPP(II,JJ),YPP(II,JJ)
  170.       END DO
  171.       END DO
  172.       CLOSE (1)
  173.       END IF
  174. C------------------ INITIAL CONDS. ---------------------
  175.       CALL ZEROS
  176.  
  177.  
  178.       CALL PSINIT
  179.  
  180. C--------------- METRIC TENSOR COMPONENTS -------------
  181.       IF(ICURV.EQ.0)GO TO 5
  182.  
  183.       OPEN (9,FILE=RUTAP//'GRILLA/METRXY.OUT')
  184.       READ(9,*)((x(J,I),i=1,m),j=1,n)
  185.       READ(9,*)((y(J,I),i=1,m),j=1,n)
  186.       READ(9,*)((x0(J,I),i=1,m1),j=1,n1)
  187.       READ(9,*)((y0(J,I),i=1,m1),j=1,n1)
  188.       CLOSE (9)
  189. c------------------------------------------------------------------
  190.       OPEN (8,FILE=RUTAP//'GRILLA/METRI.OUT')
  191.       read(8,*)((HL1(J,I),I=1,M),J=1,N)
  192.       read(8,*)((HL2(J,I),I=1,M),J=1,N)
  193.       read(8,*)((HH1(J,I),I=1,M1),J=1,N1)
  194.       read(8,*)((HH2(J,I),I=1,M1),J=1,N1)
  195.       CLOSE (8)
  196.   5   CONTINUE
  197. C-------------- COMMON AND LITODYNAMIC PROPERTIES ----------------
  198.       OPEN(1,FILE=LITOP//'PARAM.DAT')
  199.       READ(1,*)TYPE1
  200.       READ(1,*)IDAY
  201.       READ(1,*)TTT
  202.       READ(1,*)D50
  203.       READ(1,*)D90
  204.       READ(1,*)ROS
  205.       READ(1,*)RO
  206.       READ(1,*)Z0
  207.       READ(1,*)POROZ
  208.       READ(1,*)ANU
  209.       READ(1,*)DRIPLE
  210.       READ(1,*)ICRIT
  211.       READ(1,*)LEYF
  212.       READ(1,*)UMOLIN
  213.      READ(1,*)IORB
  214.       READ(1,*)UORBM
  215.       READ(1,*)HACTIV
  216.       READ(1,*)TANTETA
  217.       TANTETA=TANTETA*3.1415/180.
  218.       GRAV=9.81
  219.       CLOSE (1)
  220.       IF(ROS.LE.RO)STOP'SEDIMENT DENSITY IS LESS THAN THE WATER ONE'
  221.       DCONST=((ROS/RO-1.)*GRAV/ANU/ANU)**(1./3.)*D50
  222.       DS=0.8*D50                     ! SUSPENDED PARTICLE SIZE
  223.       KSW=AMAX1(0.01,2.*DRIPLE)      ! WAVE-RELATED RIPPLE BED ROUGHNESS
  224.       Z0=AMAX1(0.01,Z0)              ! CURRENT-RELATED BED ROUGHNESS
  225.  
  226.       CALL FALL
  227.  
  228.       CALL SHIELD
  229.  
  230. c     ADEAN=2.25*(WG*WG/GRAV)**(1./3.)
  231.       ADEAN=0.067*(abs(WG)*100.)**0.44
  232.  
  233. c---------------------------------RESIDUAL TENSIONS ---------------
  234.       IF(IRTF.EQ.0)GO TO 14
  235.  
  236.       OPEN(1,FILE=LITOP//'RESIDS.DAT')
  237.       DO J=1,N
  238.       IF(IFORMT.EQ.1)JJ=N-J+1
  239.       IF(IFORMT.EQ.0)JJ=J
  240.       READ(1,*)(FN1(JJ,I),I=1,M)
  241.       END DO
  242.       DO J=1,N
  243.       IF(IFORMT.EQ.1)JJ=N-J+1
  244.       IF(IFORMT.EQ.0)JJ=J
  245.       READ(1,*)(FN2(JJ,I),I=1,M)
  246.       END DO
  247.       DO J=1,N
  248.       IF(IFORMT.EQ.1)JJ=N-J+1
  249.       IF(IFORMT.EQ.0)JJ=J
  250.       READ(1,*)(U1NU(JJ,I),I=1,M)
  251.       END DO
  252.       DO J=1,N
  253.       IF(IFORMT.EQ.1)JJ=N-J+1
  254.       IF(IFORMT.EQ.0)JJ=J
  255.       READ(1,*)(U2NU(JJ,I),I=1,M)
  256.       END DO
  257.       CLOSE (1)
  258.   14  CONTINUE
  259. c------------------------------------------------------------------
  260.       OPEN (1,FILE=LITOP//'IMPRMR.DAT')  !  READ THE KEYS FOR PRINT
  261.       DO I=1,14                   !
  262.       READ(1,*)IPRT(I)            !
  263.       END DO                      !
  264.       CLOSE (1)
  265. c----------------------------------- SWAN RESULTS -----------------
  266.       IF(IWIC.EQ.0)GO TO 12
  267.  
  268.       OPEN(1,FILE=SWANP//'FORCES.DAT')
  269.       OPEN(2,FILE=SWANP//'HEIGHT.DAT')
  270.       OPEN(3,FILE=SWANP//'LAMB.DAT')
  271.       OPEN(4,FILE=SWANP//'TAU.DAT')
  272.       OPEN(5,FILE=SWANP//'DIRECT.DAT')
  273.       DO J=1,N
  274.       IF(IFORMW.EQ.1)JJ=N-J+1
  275.       IF(IFORMW.EQ.0)JJ=J
  276.       READ(1,*)(FX(JJ,I),I=1,M)
  277.       READ(2,*)(HW(JJ,I),I=1,M)
  278.       READ(3,*)(FLAMB(JJ,I),I=1,M)
  279.       READ(4,*)(TAU(JJ,I),I=1,M)
  280.       READ(5,*)(DIR(JJ,I),I=1,M)
  281.       END DO
  282.       DO J=1,N
  283.       IF(IFORMW.EQ.1)JJ=N-J+1
  284.       IF(IFORMW.EQ.0)JJ=J
  285.       READ(1,*)(FY(JJ,I),I=1,M)
  286.       END DO
  287.       CLOSE (1)
  288.       CLOSE (2)
  289.       CLOSE (3)
  290.       CLOSE (4)
  291.       CLOSE (5)
  292.  
  293.       OPEN(1,FILE=SWANP//'ORBIT.DAT')
  294.       DO J=1,N
  295.       IF(IFORMW.EQ.1)JJ=N-J+1
  296.       IF(IFORMW.EQ.0)JJ=J
  297.       READ(1,*)(UORB(JJ,I),I=1,M)
  298.       END DO
  299.       CLOSE (1)
  300.  
  301.       CALL TESTWA
  302.  
  303.       IF(ISMOOTW.EQ.1) CALL SMOOTHW
  304.  
  305.   12  CONTINUE
  306.  
  307. c------------------------------------------------------------------
  308.  
  309.       OPEN(10,FILE=LITOP//'WIND.DAT')
  310.       READ(10,*)WINDX,WINDY
  311.  
  312.       CALL WINDWAV        ! FOR CONSTANT WINDS ONLY (SEE RHS)
  313.  
  314.       CLOSE (10)
  315. C------------------------------------------------------
  316.       IF(MM.GT.M)STOP'El| area reducida es mayor que el area completa'
  317.       IF(NN.GT.N)STOP'El area reducida es mayor que el area completa'
  318.       IF(IEN.EQ.0)THEN
  319.  
  320.       IF(MM.LT.M.OR.NN.LT.N)WRITE(*,*)'ATENCION! El area de calculo esta|
  321.     & reducida'
  322.  
  323.       ELSE
  324.       END IF
  325.  
  326.       M0=M
  327.       N0=N
  328.       M=MM
  329.       N=NN
  330.       M1=M+1
  331.       N1=N+1
  332. C------------------------------------------------------ INICIO .....
  333.       CALL PRNH
  334.  
  335.       CALL SLOPE
  336.  
  337.       IF(TYPE1.EQ.1)IDAY=1
  338.  
  339.       WRITE(*,*)' '
  340.       WRITE(*,*)' '
  341.       IF(IEN.EQ.0)THEN
  342.       WRITE(*,*)'INICIO DE CALCULO ...'
  343.       WRITE(*,*)' '
  344.       WRITE(*,*)' '
  345.         IF(IPS.EQ.1)THEN
  346.            OPEN(1,FILE=LITOP//'PSI0.DAT')
  347.            READ(1,*)((PSIN(J,I),J=1,N1),I=1,M1)
  348.            DO J=1,N1
  349.            DO I=1,M1
  350.             PSI(J,I)=PSIN(J,I)
  351.             PSI0(J,I)=PSIN(J,I)
  352.            END DO
  353.            END DO
  354.            CLOSE (1)
  355.           ELSE
  356.         END IF
  357.       ELSE
  358.       END IF
  359.  
  360.  
  361.       DO 100 KT=1,IDAY       ! 12 MESES DE CALCULO
  362.  
  363.       CALL VORTX1
  364.  
  365.       WRITE(*,33)KT,L
  366.    33 FORMAT('+CANTIDAD DE PASOS Y DE ITERACIONES = ',2I8)
  367.  
  368.       CALL WAVEL
  369.       CALL PROFU
  370.  
  371.       CALL PROFK
  372.  
  373.       CALL PROFC
  374.  
  375.       IF(IWIC.NE.0)CALL WAVEUP
  376.  
  377.       IF(ICRIT.EQ.84)THEN
  378.       CALL UCRIT84
  379.       CALL FLUX84
  380.       ELSE
  381.       CALL UCRIT90
  382.       CALL FLUX90
  383.       END IF
  384.  
  385.       CALL FONDO
  386.  
  387.       CALL COSTA             !
  388.  
  389.       CALL OUTPUT
  390.  
  391.  100  CONTINUE
  392.  
  393.         IF(IPS.EQ.1)THEN
  394.            OPEN(1,FILE=LITOP//'PSI0.DAT')
  395.            WRITE(1,*)((PSI(J,I),J=1,N1),I=1,M1)
  396.            CLOSE (1)
  397.           ELSE
  398.         END IF
  399. C-------------------------------- OUTPUT ----------------
  400. C     CALL OUTPUT
  401.  
  402. C     CALL FINAL
  403.  
  404.       IF(TYPE1.EQ.2)STOP
  405.       WRITE(*,*)' '
  406.       write(*,*)'El calculo fue terminado exitosamente'
  407.       pause
  408.       STOP
  409.       END
  410.  
  411.       SUBROUTINE VORTX1
  412.  
  413. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 2.1, 2000
  414.  
  415.       INCLUDE 'COMML.FOR'
  416.       epsp=0.0001
  417.       MOL=0
  418.       DO 19 I=1,M1
  419.       DO 19 J=1,N1
  420.       IF(KT.EQ.1)PSI(J,I)=PSI0(J,I)
  421.       IF(H(J,I).EQ.PF)GOTO 19
  422.       MOL=MOL+1
  423.    19 CONTINUE
  424.       TETA=1.
  425.       L=0
  426.    35 L=L+1
  427.       IF(L.GE.2000000)GOTO 325
  428.  
  429.       CALL BOUND
  430.  
  431.       DO 778 I=2,M
  432.       DO 778 J=2,N
  433.       IF(H(J,I).EQ.PF)GOTO 778
  434. C     IF(H(J+1,I).EQ.PF.OR.H(J,I+1).EQ.PF.OR.H(J,I-1).EQ.PF
  435. C    &.OR.H(J-1,I).EQ.PF)GOTO 778
  436. C     IF(H(J+1,I+1).EQ.PF.OR.H(J-1,I+1).EQ.PF.OR.H(J+1,I-1).EQ.PF
  437. C    &.OR.H(J-1,I-1).EQ.PF)GOTO 778
  438.       DDT=(AFV(J,I)+AFV(J-1,I)-AFV(J,I-1)-AFV(J-1,I-1)
  439.      &-AFU(J,I)-AFU(J,I-1)+AFU(J-1,I)+AFU(J-1,I-1))
  440.  
  441.       A1=RK(J,I)*HL1(J,I)/HL2(J,I)/H1(J,I)
  442.       A4=RK(J,I-1)*HL1(J,I-1)/HL2(J,I-1)/H1(J,I-1)
  443.       A8=RK(J-1,I)*HL1(J-1,I)/HL2(J-1,I)/H1(J-1,I)
  444.       A9=RK(J-1,I-1)*HL1(J-1,I-1)/HL2(J-1,I-1)/H1(J-1,I-1)
  445.       B4=YL*HH1(J+1,I)/HH2(J+1,I)/H(J+1,I)
  446.       B8=YL*HH1(J-1,I)/HH2(J-1,I)/H(J-1,I)
  447.       G1=RK(J,I)*HL2(J,I)/HL1(J,I)/H1(J,I)
  448.       G2=RK(J-1,I)*HL2(J-1,I)/HL1(J-1,I)/H1(J-1,I)
  449.       G6=RK(J,I-1)*HL2(J,I-1)/HL1(J,I-1)/H1(J,I-1)
  450.       G7=RK(J-1,I-1)*HL2(J-1,I-1)/HL1(J-1,I-1)/H1(J-1,I-1)
  451.       O2=YL*HH2(J,I+1)/HH1(J,I+1)/H(J,I+1)
  452.       O6=YL*HH2(J,I-1)/HH1(J,I-1)/H(J,I-1)
  453.  
  454.       PSI1=((G2+G1)*PSI0(J,I+1)+(G7+G6)*PSI(J,I-1)+
  455.      & (A4+A1)*PSI0(J+1,I)+(A9+A8)*PSI(J-1,I)+
  456.      & 0.5*(B4*(PSI0(J+1,I+1)-PSI0(J+1,I-1))-B8*(PSI0(J-1,I+1)-
  457.      & PSI(J-1,I-1))-O2*(PSI0(J+1,I+1)-PSI0(J-1,I+1))+
  458.      & O6*(PSI0(J+1,I-1)-PSI(J-1,I-1)))-HAG*DDT)/         ! DOESN'T DIVIDE BY 2 AND ONE HAG!
  459.      & (G1+G2+G6+G7+A1+A4+A8+A9)
  460.  
  461.       PSI(J,I)=TETA*PSI1+(1.-TETA)*PSI0(J,I)
  462.  778  CONTINUE
  463.  
  464.       CALL VELCTY
  465.       CALL FRIC
  466.       CALL RHS
  467.  
  468.       if(L.eq.1)go to 35
  469.       KAP=0
  470.       DO 97 I=1,M1
  471.       DO 97 J=1,N1
  472.       IF(H(J,I).EQ.PF)GOTO 97
  473.       IF(PSI0(J,I).EQ.0..AND.PSI(J,I).EQ.0.)GOTO 322
  474.       IF(ABS((PSI(J,I)-PSI0(J,I))/(PSI0(J,I)+0.1E-09)).GT.EPSP)GOTO 97
  475.  322  KAP=KAP+1
  476.   97  CONTINUE
  477.       DO 2 I=1,M1
  478.       DO 2 J=1,N1
  479.       IF(H(J,I).EQ.PF)GOTO 2
  480.       PSI0(J,I)=PSI(J,I)
  481.    2  CONTINUE
  482.       IF(KAP.EQ.MOL)GOTO 444
  483.       IF(L/ITER1*ITER1.EQ.L)WRITE(*,*)
  484.      &'Acercamiento esta en ',KAP/FLOAT(MOL)*100,' %'
  485.       IF(KAP/FLOAT(MOL)*100..GE.PERC)GO TO 444
  486.       GOTO 35
  487.  444  CONTINUE
  488. CCC   write(*,*)l,kap,mol
  489.       RETURN
  490.  325  WRITE(*,764)
  491.  764  FORMAT(2X,'THE NUMBER OF ITERATIONS FOR PSI IS MORE THEN 2e4'/)
  492.       RETURN
  493.       END
  494.  
  495.     SUBROUTINE BOUND0
  496.  
  497. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 2.2, 2001
  498.  
  499.       INCLUDE 'COMML.FOR'
  500. c---------------- eastern and western bounds -----
  501.       DO 1 J=2,N
  502.       if(h(j,M1).eq.pf)go to 1
  503. c     PSI(J,M1)=PSI(j,m)*2.-psi(j,m-1)
  504. c     PSI0(J,M1)=PSI(j,m)*2.-psi(j,m-1)
  505.       PSI(J,M1)=PSI(j,m)
  506.       PSI0(J,M1)=PSI(j,m)
  507.   1   continue
  508.       DO 4 J=2,N
  509.       if(h(j,1).eq.pf)go to 4
  510. c     PSI(J,1)=PSI(j,2)*2.-psi(j,3)
  511. c     PSI0(J,1)=PSI(j,2)*2.-psi(j,3)
  512.       PSI(J,1)=PSI(j,2)
  513.       PSI0(J,1)=PSI(j,2)
  514.   4   continue
  515. c---------------- southern-nothern bounds -----
  516.       DO 3 i=2,M
  517.       if(h(1,i).eq.pf)go to 2
  518. c     PSI(1,I)=PSI(2,I)*2.-PSI(3,I)
  519. c     PSI0(1,I)=PSI(2,I)*2.-PSI(3,I)
  520.       PSI(1,I)=PSI(2,I)
  521.       PSI0(1,I)=PSI(2,I)
  522.   2   continue
  523.       if(h(N1,i).eq.pf)go to 3
  524.       PSI(N1,I)=PSI(N,I)
  525.       PSI0(N1,I)=PSI(N,I)
  526.   3   continue
  527. C--------------- COSMETICS --------------------
  528.       IF(H(1,M1).NE.PF)PSI(1,M1)=PSI(1,M)+PSI(2,M1)-PSI(2,M)
  529.      IF(H(N1,M1).NE.PF)PSI(N1,M1)=PSI(N1,M)+PSI(N,M1)-PSI(N,M)
  530.       IF(H(N1,1).NE.PF)PSI(N1,1)=PSI(N1,2)+PSI(N,1)-PSI(N,2)
  531.       IF(H(1,1).NE.PF)PSI(1,1)=PSI(1,2)+PSI(2,1)-PSI(2,2)
  532.       IF(H(1,M1).NE.PF)PSI0(1,M1)=PSI(1,M)+PSI(2,M1)-PSI(2,M)
  533.       IF(H(N1,M1).NE.PF)PSI0(N1,M1)=PSI(N1,M)+PSI(N,M1)-PSI(N,M)
  534.       IF(H(N1,1).NE.PF)PSI0(N1,1)=PSI(N1,2)+PSI(N,1)-PSI(N,2)
  535.       IF(H(1,1).NE.PF)PSI0(1,1)=PSI(1,2)+PSI(2,1)-PSI(2,2)
  536. C-------------------------------------------------
  537.       IF(UNI.EQ.0.)RETURN
  538.  
  539.       DO 10 I=1,M1
  540.       DO 10 J=1,N1
  541.       IF(ZNAK1(J,I).EQ.PF1)THEN
  542.       PSI(J,I)=0.
  543.       PSI0(J,I)=0.
  544.       ELSE
  545.       END IF
  546.   10  CONTINUE
  547.  
  548.       IF(MREF.EQ.0)GO TO 50
  549.  
  550. C   A LO LARGO DEL EJE Y
  551.       I=MREF
  552.       DO 21 J=1,N1
  553.       IF(ZNAK1(J,I).EQ.PF1)NREF1=J
  554.   21  CONTINUE
  555.       VALOR=0.
  556.       DO 41 J=NREF1,N1
  557.       IF(H(J+1,I).EQ.PF)GO TO 41
  558.       VALOR=VALOR-U(J,I)*HAG*H1(J,I)*HL1(J,I)*HL2(J,I)
  559.   41  CONTINUE
  560.  
  561.       GO TO 60
  562. C
  563. C   A LO LARGO DEL EJE X
  564.   50  J=NREF
  565.       DO 20 I=1,M1
  566.       IF(ZNAK1(J,I).EQ.PF1)MREF1=I
  567.   20  CONTINUE
  568.       VALOR=0.
  569.       DO 40 I=MREF1,M1
  570.       IF(H(J,I+1).EQ.PF)GO TO 40
  571.       VALOR=VALOR+V(J,I)*HAG*H1(J,I)*HL1(J,I)*HL2(J,I)
  572.   40  CONTINUE
  573.  
  574.   60  CONTINUE
  575.  
  576. C
  577.       DO 30 I=1,M1
  578.       DO 30 J=1,N1
  579.       IF(ZNAK1(J,I).EQ.PF2)THEN
  580.       PSI(J,I)=VALOR
  581.       PSI0(J,I)=VALOR
  582.      ELSE
  583.       END IF
  584.   30  CONTINUE
  585.  
  586.       RETURN
  587.       END
  588.  
  589.       SUBROUTINE VELCTY
  590.  
  591. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 2.0, 2000
  592.  
  593.       INCLUDE 'COMML.FOR'
  594.       DO 174 I=1,M
  595.       DO 174 J=1,N
  596.       u(j,i)=0.
  597.       v(j,i)=0.
  598.       IF(HL(J,I).EQ.PF)GOTO 174
  599.       QA=H1(J,I)*HL1(J,I)*HL2(J,I)
  600.       U(J,I)=-(PSI(J+1,I+1)+PSI(J+1,I)-PSI(J,I+1)-PSI(J,I))/(2.*HAG*QA)-
  601.      & U1NU(J,I)/H1(J,I)
  602.       V(J,I)=(PSI(J+1,I+1)+PSI(J,I+1)-PSI(J+1,I)-PSI(J,I))/(2.*HAG*QA)-
  603.      & U2NU(J,I)/H1(J,I)
  604.  174  CONTINUE
  605.       RETURN
  606.       END
  607.  
  608.  
  609.       subroutine tang(b1,a1,c)
  610.       p=3.14159265
  611.       if(b1.eq.0.)c=p/2.
  612.       if(b1.ne.0.)c=abs(atan(a1/b1))
  613.       l=sign(1.,a1)
  614.       l=l+1
  615.       n=sign(1.,b1)
  616.       n=n+1
  617.       if(l.eq.2.and.n.eq.0)c=p-c
  618.       if(l.eq.0.and.n.eq.0)c=p+c
  619.       if(l.eq.0.and.n.eq.2)c=2*p-c
  620.       C=C*180./P
  621.       return
  622.       end
  623.      SUBROUTINE UCRIT84
  624.  
  625. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 1.1, 2000
  626.  
  627.       INCLUDE 'COMML.FOR'
  628.       IF(D50.LT.1.E-04)STOP'THERE ARE VERY SMALL PARTICLES'
  629.       IF(D50.GT.2.E-03)STOP'THERE ARE VERY LARGE PARTICLES'
  630.       IF(D50.LT.5.E-04)THEN
  631.       DO 1 J=1,N
  632.       DO 1 I=1,M
  633.       UCR(J,I)=1.E10
  634.       IF(HL(J,I).EQ.PF)GO TO 1
  635.       IF(H1(J,I).LT.DMIN)GO TO 1
  636.       UCR(J,I)=0.19*D50**0.1*ALOG10(4.*H1(J,I)/D90)
  637.   1   CONTINUE
  638.       ELSE
  639.       DO 2 J=1,N
  640.       DO 2 I=1,M
  641.       UCR(J,I)=1.E10
  642.       IF(HL(J,I).EQ.PF)GO TO 2
  643.       IF(H1(J,I).LT.DMIN)GO TO 2
  644.       UCR(J,I)=8.5*D50**0.6*ALOG10(4.*H1(J,I)/D90)
  645.   2   CONTINUE
  646.       END IF
  647.  
  648.       IF(IWIC.NE.0)CALL WAVECR
  649.  
  650.       RETURN
  651.       END
  652.  
  653.  
  654.       SUBROUTINE UCRIT90
  655.  
  656. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 2.0, 2000
  657.  
  658.       INCLUDE 'COMML.FOR'
  659.       DO 1 J=1,N
  660.       DO 1 I=1,M
  661.       UCR(J,I)=1.E10
  662.       IF(HL(J,I).EQ.PF)GO TO 1
  663.       IF(H1(J,I).LT.DMIN)GO TO 1
  664.       UCR(J,I)=5.75*SQRT((ROS/RO-1.)*GRAV*D50*TETACR)*
  665.      & ALOG10(4.*H1(J,I)/D90)
  666.   1   CONTINUE
  667.  
  668.       IF(IWIC.NE.0)CALL WAVECR
  669.  
  670.       RETURN
  671.       END
  672.  
  673.      SUBROUTINE WAVECR
  674.  
  675. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 2.1, 2000
  676.  
  677.       INCLUDE 'COMML.FOR'
  678.       DO 1 J=1,N
  679.       DO 1 I=1,M
  680.       UCRW(J,I)=1.E10                      ! ? SEE ZEROS ?
  681.       IF(HL(J,I).EQ.PF)GO TO 1
  682.       IF(H1(J,I).LT.DMIN)GO TO 1
  683.       IF(TAU(J,I).LE.0.)GO TO 1
  684.       IF(D50.LT.0.0005)THEN
  685.       UCRW(J,I)=(0.12*(ROS/RO-1.)*GRAV*SQRT(D50)*SQRT(TAU(J,I)))
  686.      & **(2./3.)
  687.       ELSE
  688.       UCRW(J,I)=(1.09*(ROS/RO-1.)*GRAV*(D50)**0.75*TAU(J,I)**0.25)
  689.      & **0.571
  690.       END IF
  691.   1   CONTINUE
  692.  
  693.       RETURN
  694.       END
  695.  
  696.  
  697.       SUBROUTINE FLUX84
  698.  
  699. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 1.1, 2000
  700.  
  701.       INCLUDE 'COMML.FOR'
  702.       DO 1 J=1,N
  703.       DO 1 I=1,M
  704.       QSX(J,I)=0.         !
  705.       QSY(J,I)=0.         ! NOT SO FOR ABRASION CASE
  706.       QBX(J,I)=0.         !
  707.       QBY(J,I)=0.         !
  708.       IF(HL(J,I).EQ.PF)GO TO 1
  709.       IF(H1(J,I).LT.DMIN)GO TO 1
  710.       UEFF=SQRT(U(J,I)*U(J,I)+V(J,I)*V(J,I))+UORB(J,I)                     !
  711.       TRANS=(AMAX1(0.,(UEFF-UCR(J,I)))/SQRT((ROS/RO-1.)*GRAV*D50))**2.4
  712.       QSX(J,I)=0.012*U(J,I)*H1(J,I)*TRANS*D50/H1(J,I)/DCONST**0.6
  713.      & *ROS*IQS
  714.       QSY(J,I)=0.012*V(J,I)*H1(J,I)*TRANS*D50/H1(J,I)/DCONST**0.6
  715.      & *ROS*IQS
  716.       QBX(J,I)=0.005*U(J,I)*H1(J,I)*TRANS*(D50/H1(J,I))**1.2
  717.      & *ROS*IQB
  718.       QBY(J,I)=0.005*V(J,I)*H1(J,I)*TRANS*(D50/H1(J,I))**1.2
  719.      & *ROS*IQB
  720.  
  721.       QTX(J,I)=QSX(J,I)+QBX(J,I)
  722.       QTY(J,I)=QSY(J,I)+QBY(J,I)
  723.   1   CONTINUE
  724.       RETURN
  725.       END
  726.       SUBROUTINE FONDO
  727.  
  728. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 2.2, 2001
  729.  
  730.       INCLUDE 'COMML.FOR'
  731.       ACONST=TTT/2./HAG/ROS/(1.-POROZ)
  732.  
  733.       CALL LIMIT_S
  734.  
  735.       DO 1 I=2,M
  736.       DO 1 J=2,N
  737.       DELTA(J,I)=0.
  738.       IF(H(J,I).EQ.PF)GO TO 1
  739.       IF(H(J,I).LT.DMIN)GO TO 1
  740.       DIV=HL1(J,I)*QTX(J,I)-HL1(J,I-1)*QTX(J,I-1)+HL1(J-1,I)*QTX(J-1,I)
  741.      & -HL1(J-1,I-1)*QTX(J-1,I-1)
  742.      & +HL2(J,I)*QTY(J,I)-HL2(J-1,I)*QTY(J-1,I)+HL2(J,I-1)*QTY(J,I-1)-
  743.      & HL2(J-1,I-1)*QTY(J-1,I-1)
  744.       DELTA(J,I)=ACONST/HH1(J,I)/HH2(J,I)*DIV   *0.1   ! lony
  745.       IF(TYPE1.EQ.2)THEN
  746.       DELTA(J,I)=AMAX1(DELTA(J,I),DLIMM)
  747.       DELTA(J,I)=AMIN1(DELTA(J,I),DLIMP)
  748.       HP(J,I)=H(J,I)
  749.       H(J,I)=H(J,I)+DELTA(J,I)
  750.  
  751.       IF(H(J,I).LT.DMIN)THEN
  752.       H(J,I)=PF
  753.       ELSE
  754.       END IF
  755.       ELSE
  756.       END IF
  757.   1   CONTINUE
  758.  
  759.       IF(TYPE1.EQ.2)THEN
  760.  
  761.       IF(ISMOOT.EQ.1)THEN
  762.       DO ISM=1,KRATS
  763.       CALL SMOOTH
  764.       END DO
  765.       DO 11 I=2,M
  766.       DO 11 J=2,N
  767.       IF(H(J,I).EQ.PF)GO TO 11
  768.       IF(H(J,I).LT.DMIN)GO TO 11
  769.       DELTA(J,I)=H(J,I)-HP(J,I)
  770.   11  CONTINUE
  771.       ELSE
  772.       END IF
  773.  
  774.       CALL BOUNDH       ! was opened on September 2001
  775.       CALL BOT
  776.       ELSE
  777.  
  778.       END IF
  779.  
  780.       RETURN
  781.       END
  782.  
  783.  
  784.       SUBROUTINE BOT
  785.  
  786. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 2.2, 2001
  787.  
  788.       INCLUDE 'COMML.FOR'
  789.       DO 107 I=1,M
  790.       DO 107 J=1,N
  791.       FT1=H(J,I)
  792.       FT2=H(J+1,I)
  793.       FT3=H(J,I+1)
  794.       FT4=H(J+1,I+1)
  795.  
  796.       NUMH=4
  797.       IF(FT1.EQ.PF)THEN
  798.       FT1=0.
  799.       NUMH=NUMH-1
  800.       ELSE
  801.       END IF
  802.       IF(FT2.EQ.PF)THEN
  803.       FT2=0.
  804.       NUMH=NUMH-1
  805.       ELSE
  806.       END IF
  807.       IF(FT3.EQ.PF)THEN
  808.       FT3=0.
  809.       NUMH=NUMH-1
  810.       ELSE
  811.       END IF
  812.       IF(FT4.EQ.PF)THEN
  813.       FT4=0.
  814.       NUMH=NUMH-1
  815.       ELSE
  816.       END IF
  817.       IF(NUMH.NE.0)THEN
  818.       H1(J,I)=(FT1+FT2+FT3+FT4)/FLOAT(NUMH)
  819.       ELSE
  820.       H1(J,I)=0.
  821.       END IF
  822.  
  823. C     H1(J,I)=AMin1(ft1,ft2,ft3,ft4)
  824.  
  825.       HL(J,I)=AMin1(H(J,I),H(J+1,I),H(J,I+1),H(J+1,I+1))
  826. ccccccHL(J,I)=AMAX1(H(J,I),H(J+1,I),H(J,I+1),H(J+1,I+1))   ! error !!??
  827. 107   CONTINUE
  828.       RETURN
  829.       END
  830.  
  831.  
  832.       SUBROUTINE BOUNDH
  833.  
  834. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 1.1, 2000
  835.  
  836.       INCLUDE 'COMML.FOR'
  837. C----------------- EASTERN AND WESTERN BOUNDS -----
  838.       do j=2,n
  839.       IF(U(J,M).NE.0.)h(j,m1)=h(j,m)
  840.       IF(U(J,1).NE.0.)H(J,1)=H(J,2)
  841.       end do
  842. C----------------- NORTHERN AND SOUTHERN BOUNDS -----
  843.       do I=2,M
  844.       IF(V(N,I).NE.0.)H(N1,I)=H(N,I)
  845.       IF(V(1,I).NE.0.)H(1,I)=H(2,I)
  846.       end do
  847.  
  848.       RETURN
  849.       END
  850.  
  851.  
  852.       SUBROUTINE FRIC
  853.  
  854. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 2.2, 2001
  855.  
  856.       INCLUDE 'COMML.FOR'
  857.       RAD=3.14/180.
  858.       DO 174 I=1,M
  859.       DO 174 J=1,N
  860.       IF(HL(J,I).EQ.PF)GOTO 174
  861.       CD=1./32./(ALOG10(14.8*AMAX1(DMIN,H1(J,I))/Z0))**2
  862.       UMO=UMOLIN
  863.       IF(LEYF.EQ.0)GO TO 1
  864.  
  865.       UMO=SQRT(U(J,I)*U(J,I)+V(J,I)*V(J,I))
  866.       CALL TANG(U(J,I),V(J,I),ANGU)
  867.  
  868.       IF(IORB.EQ.0)THEN
  869.       UMO=SQRT(UMO**2+UORBM**2)
  870.       ELSE
  871.       UMO=SQRT(UMO**2+UORB(J,I)**2+2.*UMO*UORB(J,I)*COS(RAD*
  872.      & (ANGU-DIR(J,I))))
  873.       END IF
  874.  
  875.   1   UMO=AMAX1(UMO,0.001)
  876.       RK(J,I)=CD*UMO/AMAX1(DMIN,H1(J,I))
  877.  174  CONTINUE
  878.       RETURN
  879.       END
  880.  
  881.  
  882.       SUBROUTINE PSINIT
  883. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 1.1, 2000
  884.  
  885. C  Este programa debe ser dise�ada por el usuario
  886.       INCLUDE 'COMML.FOR'
  887.       INCLUDE 'VARS.INC'
  888.       DO I=1,M1
  889.       DO J=1,N1
  890.       PSI0(J,I)=0.
  891.       END DO
  892.       END DO
  893.  
  894.            OPEN(1,FILE=LITOP//'PSI0.DAT')
  895.            WRITE(1,*)((PSI0(J,I),J=1,N1),I=1,M1)
  896.            CLOSE (1)
  897.  
  898. C     DO 2 I=1,M1
  899. C     DO 1 J=1,N1
  900. C     IF(J.LT.40)THEN
  901. C     PSI0(J,I)=0.
  902. C     ELSE
  903. C     PSI0(J,I)=14.54       ! CAUDAL
  904. C     END IF
  905. C 1   CONTINUE
  906. C 2   CONTINUE
  907. C     QTX(40,22)=-0.03      ! SEDIMENT FLUX
  908. C
  909.       return
  910.       end
  911.  
  912.  
  913.       SUBROUTINE WINDWAV
  914.  
  915. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 2.1, 2000
  916.  
  917.       INCLUDE 'COMML.FOR'
  918. C---------------- INPUT PHYSICAL WIND STRESS -------------
  919.       DO 50 I=1,M
  920.       DO 50 J=1,N
  921.       T1(J,I)=0.
  922.       T2(J,I)=0.
  923.       FM1(J,I)=0.
  924.       FM2(J,I)=0.
  925.  50   CONTINUE
  926.       WINDM=1.25*1.3E-03*SQRT(WINDX*WINDX+WINDY*WINDY)
  927.       TAUX=WINDM*WINDX*IWC
  928.       TAUY=WINDM*WINDY*IWC
  929. C-------------------------------------------
  930.       DO 100 I=2,M-1
  931.       DO 100 J=2,N-1
  932.       YN=(Y(J+1,I)-Y(J-1,I))*0.5/HAG
  933.       YK=(Y(J,I+1)-Y(J,I-1))*0.5/HAG
  934.       XN=(X(J+1,I)-X(J-1,I))*0.5/HAG
  935.  
  936.       XK=(X(J,I+1)-X(J,I-1))*0.5/HAG
  937.       AK=XK*YN-XN*YK
  938.       IF(AK.EQ.0.)GO TO 100
  939.       T1(J,I)=(TAUX*YN-TAUY*XN)/AK
  940.       T2(J,I)=(TAUY*XK-TAUX*YK)/AK
  941.       FM1(J,I)=(FX(J,I)*YN-FY(J,I)*XN)/AK
  942.       FM2(J,I)=(FY(J,I)*XK-FX(J,I)*YK)/AK
  943.  100  CONTINUE
  944. c------------------------------------------------------------------
  945.       DO 101 I=2,M-1
  946.       J=1
  947.       YN=(Y0(J+1,I)-Y0(J,I)+Y0(J+1,I+1)-Y0(J,I+1))*0.5/HAG
  948.       YK=(Y0(J,I+1)-Y0(J,I)+Y0(J+1,I+1)-Y0(J+1,I))*0.5/HAG
  949.       XN=(X0(J+1,I)-X0(J,I)+X0(J+1,I+1)-X0(J,I+1))*0.5/HAG
  950.       XK=(X0(J,I+1)-X0(J,I)+X0(J+1,I+1)-X0(J+1,I))*0.5/HAG
  951.       AK=XK*YN-XN*YK
  952.       IF(AK.EQ.0.)GO TO 109
  953.       T1(J,I)=(TAUX*YN-TAUY*XN)/AK
  954.       T2(J,I)=(TAUY*XK-TAUX*YK)/AK
  955.       FM1(J,I)=(FX(J,I)*YN-FY(J,I)*XN)/AK
  956.       FM2(J,I)=(FY(J,I)*XK-FX(J,I)*YK)/AK
  957.  109  J=N
  958.       YN=(Y0(J+1,I)-Y0(J,I)+Y0(J+1,I+1)-Y0(J,I+1))*0.5/HAG
  959.       YK=(Y0(J,I+1)-Y0(J,I)+Y0(J+1,I+1)-Y0(J+1,I))*0.5/HAG
  960.       XN=(X0(J+1,I)-X0(J,I)+X0(J+1,I+1)-X0(J,I+1))*0.5/HAG
  961.       XK=(X0(J,I+1)-X0(J,I)+X0(J+1,I+1)-X0(J+1,I))*0.5/HAG
  962.       AK=XK*YN-XN*YK
  963.       IF(AK.EQ.0.)GO TO 101
  964.       T1(J,I)=(TAUX*YN-TAUY*XN)/AK
  965.       T2(J,I)=(TAUY*XK-TAUX*YK)/AK
  966.       FM1(J,I)=(FX(J,I)*YN-FY(J,I)*XN)/AK
  967.       FM2(J,I)=(FY(J,I)*XK-FX(J,I)*YK)/AK
  968.  101  CONTINUE
  969.       DO 102 J=2,N-1
  970.       I=1
  971.       YN=(Y0(J+1,I)-Y0(J,I)+Y0(J+1,I+1)-Y0(J,I+1))*0.5/HAG
  972.       YK=(Y0(J,I+1)-Y0(J,I)+Y0(J+1,I+1)-Y0(J+1,I))*0.5/HAG
  973.       XN=(X0(J+1,I)-X0(J,I)+X0(J+1,I+1)-X0(J,I+1))*0.5/HAG
  974.       XK=(X0(J,I+1)-X0(J,I)+X0(J+1,I+1)-X0(J+1,I))*0.5/HAG
  975.       AK=XK*YN-XN*YK
  976.       IF(AK.EQ.0.)GO TO 108
  977.       T1(J,I)=(TAUX*YN-TAUY*XN)/AK
  978.       T2(J,I)=(TAUY*XK-TAUX*YK)/AK
  979.       FM1(J,I)=(FX(J,I)*YN-FY(J,I)*XN)/AK
  980.       FM2(J,I)=(FY(J,I)*XK-FX(J,I)*YK)/AK
  981.  108  I=M
  982.       YN=(Y0(J+1,I)-Y0(J,I)+Y0(J+1,I+1)-Y0(J,I+1))*0.5/HAG
  983.       YK=(Y0(J,I+1)-Y0(J,I)+Y0(J+1,I+1)-Y0(J+1,I))*0.5/HAG
  984.       XN=(X0(J+1,I)-X0(J,I)+X0(J+1,I+1)-X0(J,I+1))*0.5/HAG
  985.       XK=(X0(J,I+1)-X0(J,I)+X0(J+1,I+1)-X0(J+1,I))*0.5/HAG
  986.       AK=XK*YN-XN*YK
  987.       IF(AK.EQ.0.)GO TO 102
  988.       T1(J,I)=(TAUX*YN-TAUY*XN)/AK
  989.      FM1(J,I)=(FX(J,I)*YN-FY(J,I)*XN)/AK
  990.       FM2(J,I)=(FY(J,I)*XK-FX(J,I)*YK)/AK
  991.  102  CONTINUE
  992.  
  993.       T1(1,1)=T1(1,2)+T1(2,1)-T1(2,2)
  994.       T1(N,1)=T1(N,2)+T1(N-1,1)-T1(N-1,2)
  995.       T1(1,M)=T1(1,M-1)+T1(2,M)-T1(2,M-1)
  996.       T1(N,M)=T1(N,M-1)+T1(N-1,M)-T1(N-1,M-1)
  997.       T2(1,1)=T2(1,2)+T2(2,1)-T2(2,2)
  998.       T2(N,1)=T2(N,2)+T2(N-1,1)-T2(N-1,2)
  999.       T2(1,M)=T2(1,M-1)+T2(2,M)-T2(2,M-1)
  1000.       T2(N,M)=T2(N,M-1)+T2(N-1,M)-T2(N-1,M-1)
  1001.       FM1(1,1)=FM1(1,2)+FM1(2,1)-FM1(2,2)
  1002.       FM1(N,1)=FM1(N,2)+FM1(N-1,1)-FM1(N-1,2)
  1003.       FM1(1,M)=FM1(1,M-1)+FM1(2,M)-FM1(2,M-1)
  1004.       FM1(N,M)=FM1(N,M-1)+FM1(N-1,M)-FM1(N-1,M-1)
  1005.       FM2(1,1)=FM2(1,2)+FM2(2,1)-FM2(2,2)
  1006.       FM2(N,1)=FM2(N,2)+FM2(N-1,1)-FM2(N-1,2)
  1007.       FM2(1,M)=FM2(1,M-1)+FM2(2,M)-FM2(2,M-1)
  1008.       FM2(N,M)=FM2(N,M-1)+FM2(N-1,M)-FM2(N-1,M-1)
  1009.  
  1010.       DO 51 I=1,M
  1011.       DO 51 J=1,N
  1012.       T1(J,I)=T1(J,I)/RO
  1013.       T2(J,I)=T2(J,I)/RO
  1014.       IF(HL(J,I).EQ.PF)GO TO 51
  1015.       FM1(J,I)=-FM1(J,I)/RO/H1(J,I)     ! -
  1016.       FM2(J,I)=-FM2(J,I)/RO/H1(J,I)     ! -
  1017.  51   CONTINUE
  1018.  
  1019.       RETURN
  1020.       END
  1021.  
  1022.  
  1023.       SUBROUTINE RHS
  1024.  
  1025. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 1.1, 2000
  1026.  
  1027.       INCLUDE 'COMML.FOR'
  1028. C       FM1 & FM2 - AVERAGE WAVE ACTION IN RHS
  1029. C       FL1 & FL2 - AVERAGE NON LINEAR FORCES
  1030. C       FN1 & FN2 - AVERAGE NIHOUL'S TERMS (NO MODIFIED)
  1031. C       FN1MD & FN2MD - AVERAGE NIHOUL'S TERMS (MODIFIED)
  1032.  
  1033.       IF(INLT.NE.0)CALL NOLIN
  1034.  
  1035.       DO 1 I=1,M
  1036.       DO 1 J=1,N
  1037.       IF(HL(J,I).EQ.PF)GO TO 1
  1038.       FN1MD(J,I)=FN1(J,I)-(YL*U2NU(J,I)+RK(J,I)*U1NU(J,I))/H1(J,I)
  1039.       FN2MD(J,I)=FN2(J,I)-(-YL*U1NU(J,I)+RK(J,I)*U2NU(J,I))/H1(J,I)
  1040.       RHSX=FN1MD(J,I)-FM1(J,I)-FL1(J,I)
  1041.       RHSY=FN2MD(J,I)-FM2(J,I)-FL2(J,I)
  1042.      AFU(J,I)=HL1(J,I)*HL1(J,I)*(T1(J,I)/H1(J,I)+RHSX)
  1043.       AFV(J,I)=HL2(J,I)*HL2(J,I)*(T2(J,I)/H1(J,I)+RHSY)
  1044.   1   CONTINUE
  1045.       RETURN
  1046.       END
  1047.  
  1048.  
  1049.       SUBROUTINE NOLIN
  1050.  
  1051. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 1.1, 2000
  1052.  
  1053.       INCLUDE 'COMML.FOR'
  1054.  
  1055.       DO 23 I=2,M-1
  1056.       DO 23 J=2,N-1
  1057.       IF(HL(J,I).EQ.PF)GO TO 23
  1058.  
  1059.       G1=HL1(J,I+1)*HL1(J,I+1)
  1060.       G2=HL1(J,I-1)*HL1(J,I-1)
  1061.       G3=HL1(J+1,I)*HL1(J+1,I)
  1062.       G5=HL2(J,I+1)*HL2(J,I+1)
  1063.       G6=HL2(J,I-1)*HL2(J,I-1)
  1064.       G7=HL2(J+1,I)*HL2(J+1,I)
  1065.       G01=HL1(J,I)*HL1(J,I)
  1066.       G02=HL2(J,I)*HL2(J,I)
  1067.       G4=HL1(J-1,I)*HL1(J-1,I)
  1068.       G8=HL2(J-1,I)*HL2(J-1,I)
  1069.  
  1070.       FL1(J,I)=((U(J,I)+U(J,I+1))*U(J,I+1)-(U(J,I-1)+
  1071.      & U(J,I))*U(J,I-1)+(V(J+1,I)+V(J,I))*U(J+1,I)-
  1072.      & (V(J-1,I)+V(J,I))*U(J-1,I))/HAG*0.25+
  1073.      & (U(J,I)*U(J,I)*0.5*(ALOG(G1)-ALOG(G2))+
  1074.      & U(J,I)*V(J,I)*(ALOG(G3)-ALOG(G4))-
  1075.      & V(J,I)*V(J,I)*0.5/G01*(G5-G6))*0.5/HAG
  1076.  
  1077.       FL2(J,I)=((U(J,I)+U(J,I+1))*V(J,I+1)-(U(J,I-1)+
  1078.      & U(J,I))*V(J,I-1)+(V(J+1,I)+V(J,I))*V(J+1,I)-
  1079.      & (V(J-1,I)+V(J,I))*V(J-1,I))/HAG*0.25-
  1080.      & (U(J,I)*U(J,I)*0.5/G02*(G3-G4)+
  1081.      & U(J,I)*V(J,I)*(ALOG(G5)-ALOG(G6))+
  1082.      & V(J,I)*V(J,I)*0.5*(ALOG(G7)-ALOG(G8)))*0.5/HAG
  1083.  
  1084.    23 CONTINUE
  1085.       RETURN
  1086.       END
  1087.  
  1088.  
  1089.       SUBROUTINE WAVEUP
  1090.  
  1091. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 2.1, 2000
  1092.  
  1093.       INCLUDE 'COMML.FOR'
  1094. C       FM1 & FM2 - AVERAGE WAVE ACTION IN RHS
  1095. C       FL1 & FL2 - AVERAGE NON LINEAR FORCES
  1096. C       FN1 & FN2 - AVERAGE NIHOUL'S TERMS (NO MODIFIED)
  1097.  
  1098.       DO 1 I=1,M
  1099.       DO 1 J=1,N
  1100.       IF(HL(J,I).EQ.PF)GO TO 1
  1101.       GRAD1(J,I)=FN1(J,I)-FM1(J,I)+T1(J,I)/H1(J,I)-FL1(J,I)+YL*V(J,I)-
  1102.      & RK(J,I)*U(J,I)
  1103.       GRAD2(J,I)=FN2(J,I)-FM2(J,I)+T2(J,I)/H1(J,I)-FL2(J,I)-YL*U(J,I)-
  1104.      & RK(J,I)*V(J,I)
  1105.  
  1106.       GRAD1(J,I)=GRAD1(J,I)/GRAV*HL1(J,I)*HL1(J,I)
  1107.       GRAD2(J,I)=GRAD2(J,I)/GRAV*HL2(J,I)*HL2(J,I)
  1108.   1   CONTINUE
  1109.  
  1110.       IF(IBOUND.EQ.1)THEN
  1111.       DO 2 I=1,M
  1112.       DZI(1,I)=0.0
  1113.       DO 3 J=2,N1
  1114.       DZI(J,I)=DZI(J-1,I)+GRAD2(J-1,I)*HAG*HL2(J-1,I)
  1115.   3   CONTINUE
  1116.   2   CONTINUE
  1117.       ELSE
  1118.       END IF
  1119.  
  1120.       IF(IBOUND.EQ.2)THEN
  1121.       DO 21 I=1,M
  1122.       DZI(N1,I)=0.0
  1123.       DO 31 J=1,N
  1124.       JJ=N1-J
  1125.       DZI(JJ,I)=DZI(JJ+1,I)-GRAD2(JJ,I)*HAG*HL2(JJ,I)
  1126.   31  CONTINUE
  1127.   21  CONTINUE
  1128.       ELSE
  1129.       END IF
  1130.  
  1131.       IF(IBOUND.EQ.3)THEN
  1132.       DO 22 J=1,N
  1133.       DZI(J,1)=0.0
  1134.       DO 32 I=2,M1
  1135.       DZI(J,I)=DZI(J,I-1)+GRAD1(J,I-1)*HAG*HL1(J,I-1)
  1136.   32  CONTINUE
  1137.   22  CONTINUE
  1138.       ELSE
  1139.       END IF
  1140.  
  1141.       IF(IBOUND.EQ.4)THEN
  1142.       DO 23 J=1,N
  1143.       DZI(J,M1)=0.0
  1144.       DO 33 I=1,M
  1145.       II=M1-I
  1146.       DZI(J,II)=DZI(J,II+1)-GRAD1(J,II)*HAG*HL1(J,II)
  1147.   33  CONTINUE
  1148. 23  CONTINUE
  1149.       ELSE
  1150.       END IF
  1151.  
  1152.       RETURN
  1153.       END
  1154.  
  1155.  
  1156.       SUBROUTINE CHECK
  1157.  
  1158. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 2.1, 2000
  1159.  
  1160.       INCLUDE 'COMML.FOR'
  1161.  
  1162.       HMAX=0.
  1163.       HMIN=1.E10
  1164.       DO 2 I=1,M1
  1165.       DO 2 J=1,N1
  1166.       IF(H(J,I).EQ.PF)GO TO 2
  1167.       IF(H(J,I).GT.HMAX)HMAX=H(J,I)
  1168.       IF(H(J,I).LT.HMIN)HMIN=H(J,I)
  1169.    2  CONTINUE
  1170.  
  1171.       IF(HMAX.GT.PF)THEN
  1172.       WRITE(*,*)'Profundidad maxima es mayor que PF'
  1173.       STOP
  1174.       ELSE
  1175.       END IF
  1176.  
  1177.       IF(HMIN.LT.DMIN)THEN
  1178.       WRITE(*,*)'La profundidad minima es menor que DMIN'
  1179.       STOP
  1180.       ELSE
  1181.       END IF
  1182.  
  1183.       DO 12 I=1,M1
  1184.       DO 12 J=1,N1
  1185.       HP(J,I)=H(J,I)
  1186.   12  CONTINUE
  1187.  
  1188.       RETURN
  1189.       END
  1190.  
  1191.  
  1192.       SUBROUTINE ZEROS
  1193.  
  1194. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 2.2, 2001
  1195.  
  1196.       INCLUDE 'COMML.FOR'
  1197.       INCLUDE 'VARS.INC'
  1198.  
  1199.       DO I=1,M1
  1200.       DO J=1,N1
  1201.       DELTA(J,I)=0.
  1202.       X0(J,I)=HAG*(I-1)*SCALE+XMIN
  1203.       Y0(J,I)=HAG*(J-1)+YMIN
  1204.       HH1(J,I)=SCALE
  1205.       HH2(J,I)=1.
  1206.       dzi(J,I)=0.
  1207.       BOTANGL(J,I)=0.
  1208.       END DO
  1209.       END DO
  1210.  
  1211.       DO I=1,M
  1212.       DO J=1,N
  1213.       X(J,I)=HAG*(I-0.5)*SCALE+XMIN
  1214.       Y(J,I)=HAG*(J-0.5)+YMIN
  1215.       HL1(J,I)=SCALE
  1216.       HL2(J,I)=1.
  1217.       QSX(J,I)=0.
  1218.       QSY(J,I)=0.
  1219.       QBX(J,I)=0.
  1220.       QBY(J,I)=0.
  1221.       QSXC(J,I)=0.
  1222.       QSYC(J,I)=0.
  1223.       QBXC(J,I)=0.
  1224.       QBYC(J,I)=0.
  1225.       U1NU(J,I)=0.
  1226.       U2NU(J,I)=0.
  1227.       FL1(J,I)=0.
  1228.       FL2(J,I)=0.
  1229.       FM1(J,I)=0.
  1230.       FM2(J,I)=0.
  1231.       FN1(J,I)=0.
  1232.       FN2(J,I)=0.
  1233.       FN1MD(J,I)=0.
  1234.       FN2MD(J,I)=0.
  1235.       RK(J,I)=1.e-04
  1236.       GRAD1(J,I)=0.
  1237.       GRAD2(J,I)=0.
  1238.       UORB(J,I)=0.
  1239.       UORBF(J,I)=0.
  1240.       UORBB(J,I)=0.
  1241.       FX(J,I)=0.
  1242.       FY(J,I)=0.
  1243.       AFU(J,I)=0.
  1244.       AFV(J,I)=0.
  1245.       U(J,I)=0.
  1246.       V(J,I)=0.
  1247.       UC(J,I)=0.
  1248.       VC(J,I)=0.
  1249.       HW(J,I)=0.000001
  1250.       FLAMB(J,I)=100000.
  1251.       TAU(J,I)=100000.
  1252.       UCRW(J,I)=0.                  ! 0 OR A LARGE VALUE ?
  1253.       UR(J,I)=0.
  1254.       UB(J,I)=0.
  1255.       DW(J,I)=0.001
  1256.       ASYM(J,I)=0.
  1257.  
  1258.       DO KZ=1,10
  1259.       UV(KZ,J,I)=0.
  1260.       END DO
  1261.  
  1262.       END DO
  1263.       END DO
  1264.  
  1265.   5   FORMAT(I5,F8.2,2F10.1)
  1266.       IF(IEN.EQ.0)THEN
  1267.       OPEN (1,FILE=LITOP//'CCHANGX.DAT')
  1268.       DO I=1,M1
  1269.       XCOSTA(I)=0.
  1270.       XUTM1(I)=0.
  1271.       YUTM1(I)=0.
  1272.       WRITE(1,5)I,XCOSTA(I),XUTM1(I),YUTM1(I)
  1273.       END DO
  1274.       CLOSE (1)
  1275.  
  1276.       OPEN (1,FILE=LITOP//'CCHANGY.DAT')
  1277.       DO J=1,N1
  1278.       YCOSTA(J)=0.
  1279.       XUTM2(J)=0.
  1280.       YUTM2(J)=0.
  1281.       WRITE(1,5)J,YCOSTA(J),XUTM2(J),YUTM2(J)
  1282.       END DO
  1283.       CLOSE (1)
  1284.       ELSE
  1285.       END IF
  1286.  
  1287.       RETURN
  1288.       END
  1289.  
  1290.  
  1291.       SUBROUTINE OUTPUT
  1292.  
  1293. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 2.2, 2001
  1294.  
  1295.       INCLUDE 'COMML.FOR'
  1296.       INCLUDE 'VARS.INC'
  1297.  
  1298.       IF(TYPE1.EQ.2)THEN
  1299.  
  1300.       IF(NPERF1.NE.0)CALL INTERP1
  1301.  
  1302.       IF(IEN.EQ.0)IEN=1
  1303.       IEN=IEN+1
  1304.       OPEN (1,FILE=LITOP//'ENLACE.DAT')
  1305.       WRITE(1,*)IEN
  1306.       CLOSE (1)
  1307.       OPEN (1,FILE=SWANP//'BATINEW.DAT')
  1308.       DO J=1,N0
  1309.       IF(IFORM.EQ.1)JJ=N0-J+1             !
  1310.       IF(IFORM.EQ.0)JJ=J                  !
  1311.       DO I=1,M0
  1312.       H2(JJ,I)=H1(JJ,I)
  1313.       IF(H2(JJ,I).EQ.PF)H2(JJ,I)=0.
  1314.       END DO
  1315.       WRITE(1,111)(H2(JJ,I),I=1,M0)
  1316.       END DO
  1317.   111 FORMAT(1000F10.6)
  1318.       CLOSE (1)
  1319.  
  1320.       OPEN (1,FILE=LITOP//'BOTTOM.DAT')
  1321.       DO J=1,N0+1
  1322.       IF(IFORM.EQ.1)JJ=(N0+1)-J+1
  1323.       IF(IFORM.EQ.0)JJ=J
  1324.       write(1,111)(H(JJ,I),I=1,M0+1)
  1325.       END DO
  1326.       CLOSE (1)
  1327.       ELSE
  1328.       END IF
  1329.  
  1330.       CALL CONVERT
  1331.  
  1332.       OPEN (1,FILE=LITOP//'SURF.DAT')
  1333.       OPEN (2,FILE=LITOP//'SURFUV.DAT')
  1334.       OPEN (3,FILE=LITOP//'SURFQS.DAT')
  1335.       OPEN (4,FILE=LITOP//'SURFQB.DAT')
  1336.       OPEN (5,FILE=LITOP//'SEDI.DAT')
  1337.       OPEN (7,FILE=LITOP//'level.DAT')
  1338.       OPEN (8,FILE=LITOP//'level1.DAT')
  1339.       OPEN (9,FILE=LITOP//'CONCEN.DAT')
  1340.       OPEN (10,FILE=LITOP//'UVTOT.DAT')
  1341.       OPEN (11,FILE=LITOP//'GRAFH.DAT')
  1342.       OPEN (16,FILE=LITOP//'waveu.DAT')
  1343.  
  1344.       DO 8 J=1,N1
  1345.       DO 8 I=1,M1
  1346.       IF(X0(J,I).EQ.XLIM)GO TO 8
  1347.       IF(IPRT(1).EQ.1)WRITE(1,*)X0(J,I),Y0(J,I),PSI(J,I)
  1348.       if(h(j,i).eq.pf)go to 8
  1349.       IF(IPRT(5).EQ.1)WRITE(5,*)X0(J,I),Y0(J,I),DELTA(J,I),H(J,I)
  1350.   8   continue
  1351.  
  1352.       DO 80 J=1,N
  1353.       WRITE(8,*)J,DZI(J,10)
  1354.       DO 80 I=2,M-1
  1355. CCCC  IF(H(J,I).EQ.PF.AND.H(J,I+1).EQ.PF)GO TO 80
  1356. CCCC  IF(GRAD2(J,I).EQ.0.)GO TO 80
  1357.       IF(X(J,I).EQ.XLIM.OR.Y0(J,I).EQ.YLIM)GO TO 80
  1358.       IF(IPRT(6).EQ.1)WRITE(7,*)X(J,I),Y0(J,I),DZI(J,I)
  1359.  80  continue
  1360.  
  1361.       DO 31 I=1,M
  1362.       DO 31 J=1,N
  1363.       IF(X(J,I).EQ.XLIM.OR.Y(J,I).EQ.YLIM)GO TO 31
  1364.       IF(UR(J,I).EQ.0.)GO TO 809
  1365.       WRITE(16,*)X(J,I),Y(J,I),UR(J,I),DIR(J,I)
  1366.   809 CONTINUE
  1367.        UMOD=SQRT(UC(J,I)*UC(J,I)+VC(J,I)*VC(J,I)+1.e-22)          !
  1368.        QS=SQRT(QSXC(J,I)*QSXC(J,I)+QSYC(J,I)*QSYC(J,I)+1.e-22)    !  SEE ME
  1369.        QB=SQRT(QBXC(J,I)*QBXC(J,I)+QBYC(J,I)*QBYC(J,I)+1.e-22)    !
  1370.        CALL TANG(UC(J,I),VC(J,I),ANGL)                     !
  1371.        CALL TANG(QSXC(J,I),QSYC(J,I),AQS)                  !
  1372.        CALL TANG(QBXC(J,I),QBYC(J,I),AQB)                  !
  1373.       IF(UMOD.EQ.0.)GO TO 800
  1374.       IF(IPRT(2).EQ.1)WRITE(2,*)X(J,I),Y(J,I),UMOD,ANGL
  1375.       IF(IPRT(9).EQ.1)WRITE(11,*)X(J,I),Y(J,I),H1(J,I)
  1376.  800  CONTINUE
  1377.       IF(QS.EQ.0.)GO TO 801
  1378.       IF(IPRT(3).EQ.1)WRITE(3,*)X(J,I),Y(J,I),QS,AQS
  1379.  801  IF(QB.EQ.0.)GO TO 802
  1380.       IF(IPRT(4).EQ.1)WRITE(4,*)X(J,I),Y(J,I),QB,AQB
  1381.  802  IF(IPRT(7).EQ.1)WRITE(9,*)X(J,I),Y(J,I),CON(2,J,I)
  1382.   31  CONTINUE
  1383.  
  1384.       DO 32 I=1,M
  1385.       DO 32 J=1,N
  1386.       IF(X(J,I).EQ.XLIM.OR.Y(J,I).EQ.YLIM)GO TO 32
  1387.       CALL TANG(UC(J,I),VC(J,I),ANGL)
  1388.       IF(UV(1,J,I).EQ.0.)GO TO 32
  1389.       IF(IPRT(8).EQ.1)WRITE(10,5)X(J,I),Y(J,I),(UV(K,J,I),K=1,10),ANGL
  1390.   32  CONTINUE
  1391.  
  1392.   5   FORMAT(13E13.5)
  1393.       CLOSE (1)
  1394.       CLOSE (2)
  1395.       CLOSE (3)
  1396.       CLOSE (4)
  1397.       CLOSE (5)
  1398.       CLOSE (7)
  1399.       CLOSE (8)
  1400.       CLOSE (9)
  1401.       CLOSE (10)
  1402.       CLOSE (11)
  1403. C------------------------- PROFILE ANALYSIS --------------
  1404.       OPEN (1,FILE=LITOP//'TALUDX.DAT')
  1405.       OPEN (2,FILE=LITOP//'TALUDY.DAT')
  1406.       IF(NPERF.EQ.0)GO TO 100
  1407.       NPERFX=0
  1408.       NPERFY=0
  1409.  
  1410.       DO 90 II=1,NPERF
  1411.       IF(MX(II).EQ.0)THEN
  1412.       NPERFX=NPERFX+1
  1413.       DO I=1,M1
  1414.       XP(NPERFX,I)=X0(NY(II),I)
  1415.       R=H(NY(II),I)
  1416.       IF(R.EQ.PF)R=0.
  1417.       DEEPX(NPERFX,I)=-R
  1418.       R0=H0(NY(II),I)
  1419.       IF(R0.EQ.PF)R0=0.
  1420.       DEEPX0(NPERFX,I)=-R0
  1421.       END DO
  1422. C------------------------- DEAN'S PROFILES ----------------- X
  1423.       IF(H0(NY(II),1).EQ.PF)THEN
  1424.       I0=1
  1425.       IM1=M1
  1426.       IP=1
  1427.       ELSE
  1428.       I0=M1
  1429.       IM1=1
  1430.       IP=-1
  1431.       END IF
  1432.       IPE(NPERFX)=IP
  1433.  
  1434.       DIST=0.
  1435.       DO 200 I=I0,IM1,IP
  1436.       IK=I
  1437.       IF(IP.EQ.-1)IK=I0-I+1
  1438.       IF(H0(NY(II),I).EQ.PF)THEN
  1439.       XP0=XP(NPERFX,I)
  1440.       PDEANX(NPERFX,IK)=0.
  1441.       ELSE
  1442.       DIST=ABS(XP(NPERFX,I)-XP0)+1.E-11
  1443.       PDEANX(NPERFX,IK)=-DEAN(DIST,ADEAN)
  1444.       END IF
  1445.  
  1446.   200 CONTINUE
  1447. C-------------------------------------------------------------
  1448.       ELSE
  1449.  
  1450.       NPERFY=NPERFY+1
  1451.       DO J=1,N1
  1452.       YP(J,NPERFY)=Y0(J,MX(II))
  1453.       R=H(J,MX(II))
  1454.       IF(R.EQ.PF)R=0.
  1455.       DEEPY(J,NPERFY)=-R
  1456.       R0=H0(J,MX(II))
  1457.       IF(R0.EQ.PF)R0=0.
  1458.       DEEPY0(J,NPERFY)=-R0
  1459.       END DO
  1460. C------------------------- DEAN'S PROFILES ----------------- Y
  1461.       IF(H0(1,MX(II)).EQ.PF)THEN
  1462.       J0=1
  1463.       JN=N1
  1464.       JP=1
  1465.       ELSE
  1466.       J0=N1
  1467.       JN=1
  1468.       JP=-1
  1469.       END IF
  1470.       JPE(NPERFY)=JP
  1471.  
  1472.       DIST=0.
  1473.       DO 201 J=J0,JN,JP
  1474.       JK=J
  1475.       IF(JP.EQ.-1)JK=J0-J+1
  1476.       IF(H0(J,MX(II)).EQ.PF)THEN
  1477.       YP0=YP(J,NPERFY)
  1478.       PDEANY(JK,NPERFY)=0.
  1479.       ELSE
  1480.       DIST=ABS(YP(J,NPERFY)-YP0)+1.E-11
  1481.       PDEANY(JK,NPERFY)=-DEAN(DIST,ADEAN)
  1482.       END IF
  1483.  
  1484.   201 CONTINUE
  1485. C-------------------------------------------------------------
  1486.  
  1487.       END IF
  1488.   90  CONTINUE
  1489. C-------------------------------------------------------------
  1490.        DO II=1,NPERFX
  1491.        IF(IPE(II).EQ.-1)THEN
  1492.        DO I=1,M1
  1493.        IM1=M1-I+1
  1494.        PDEANX1(II,I)=PDEANX(II,IM1)
  1495.        END DO
  1496.  
  1497.        DO I=1,M1
  1498.        PDEANX(II,I)=PDEANX1(II,I)
  1499.        END DO
  1500.        ELSE
  1501.        END IF
  1502.        END DO
  1503.  
  1504.  
  1505.        DO II=1,NPERFY
  1506.        IF(JPE(II).EQ.-1)THEN
  1507.        DO J=1,N1
  1508.        JN1=N1-J+1
  1509.        PDEANY1(J,II)=PDEANY(JN1,II)
  1510.        END DO
  1511.  
  1512.        DO J=1,N1
  1513.        PDEANY(J,II)=PDEANY1(J,II)
  1514.        END DO
  1515.        ELSE
  1516.        END IF
  1517.        END DO
  1518. C-------------------------------------------------------------
  1519.  
  1520.  
  1521. C  FILMS
  1522.       IF(TYPE1.EQ.1.OR.IPRT(11).EQ.0)GO TO 970
  1523.       IF(IEN.EQ.2)THEN
  1524.       OPEN (3,FILE=LITOP//'FILMX.DAT',STATUS='NEW')
  1525.       OPEN (4,FILE=LITOP//'FILMY.DAT',STATUS='NEW')
  1526.       TIEMF=1.
  1527.       ELSE
  1528.       OPEN (3,FILE=LITOP//'FILMX.DAT',STATUS='OLD')
  1529.       OPEN (4,FILE=LITOP//'FILMY.DAT',STATUS='OLD')
  1530.   950 CONTINUE
  1531.       DO I=1,M1
  1532.       READ(3,11,END=990)TIEMF,(XP1(II,I),PDEANX1(II,I),DEEPX01(II,I),
  1533.      & DEEPX1(II,I),II=1,NPERFX)
  1534.       END DO
  1535.   990 DO J=1,N1
  1536.       READ(4,11,END=960)TIEMF,(YP1(J,II),PDEANY1(J,II),DEEPY01(J,II),
  1537.      & DEEPY1(J,II),II=1,NPERFY)
  1538.       END DO
  1539.       GO TO 950
  1540.   960 TIEMF=TIEMF+1.
  1541.       END IF
  1542.  
  1543.       DO I=1,M1
  1544.       WRITE(3,11)TIEMF,(XP(II,I),PDEANX(II,I),DEEPX0(II,I),
  1545.      & DEEPX(II,I),II=1,NPERFX)
  1546.       END DO
  1547.  
  1548.       DO J=1,N1
  1549.       WRITE(4,11)TIEMF,(YP(J,II),PDEANY(J,II),DEEPY0(J,II),
  1550.      & DEEPY(J,II),II=1,NPERFY)
  1551.       END DO
  1552.       CLOSE (3)
  1553.       CLOSE (4)
  1554. C------------------ END OF FILM
  1555.  
  1556.  970  CONTINUE
  1557.       IF(IPRT(10).EQ.0)GO TO 100
  1558.  
  1559.       DO I=1,M1
  1560.       WRITE(1,11)(XP(II,I),PDEANX(II,I),DEEPX0(II,I),
  1561.      & DEEPX(II,I),II=1,NPERFX)
  1562.       END DO
  1563.  
  1564.       DO J=1,N1
  1565.       WRITE(2,11)(YP(J,II),PDEANY(J,II),DEEPY0(J,II),
  1566.      & DEEPY(J,II),II=1,NPERFY)
  1567.       END DO
  1568.   11  FORMAT(1000E17.8)
  1569.   100 CONTINUE
  1570.       CLOSE (1)
  1571.       CLOSE (2)
  1572.  
  1573. C-------------------------------------------------- CONTROL FILE FOR MC/NC POINT
  1574.  
  1575.       IF(IPRT(12).EQ.0)GO TO 102
  1576.       OPEN (1,FILE=LITOP//'CONTROL.DAT')
  1577.       WRITE(1,*)'Coordenadas del punto:            ',MC,NC
  1578.       WRITE(1,*)'Profundidad del punto:            ',H1(NC,MC)
  1579.       WRITE(1,*)'Velocidad media (m/s):            ',U(NC,MC),V(NC,MC),
  1580.      & SQRT(U(NC,MC)*U(NC,MC)+V(NC,MC)*V(NC,MC)+1.e-22)
  1581.       WRITE(1,*)'Corriente de retorno:             ',UR(NC,MC)
  1582.       WRITE(1,*)'Corriente de fondo en ola:        ',UB(NC,MC)
  1583.       WRITE(1,*)'Altura de ola:                    ',HW(NC,MC)
  1584.       WRITE(1,*)'Periodo de ola:                   ',TAU(NC,MC)
  1585.       WRITE(1,*)'Longitud de ola:                  ',FLAMB(NC,MC)
  1586.       WRITE(1,*)'Velocidad orbital hacia adelante: ',UORBF(NC,MC)
  1587.       WRITE(1,*)'Velocidad orbital hacia atr| s:    ',UORBB(NC,MC)
  1588.       WRITE(1,*)'Orbital excursi�n:                ',AD(NC,MC)
  1589.       WRITE(1,*)'Espesor de capa l�mite para olas: ',DW(NC,MC)
  1590.       WRITE(1,*)'Direcci�n de ola:                 ',DIR(NC,MC)
  1591.       CALL TANG(U(NC,MC),V(NC,MC),ANGU)
  1592.       WRITE(1,*)'Direcci�n de corriente:           ',ANGU
  1593.       WRITE(1,*)'Diametro de grano D50:            ',D50
  1594.       WRITE(1,*)'Diametro de grano D90:            ',D90
  1595.       WRITE(1,*)'Diametro sedimentol�gico:         ',DS
  1596.       WRITE(1,*)'Rugosidad para corrientes:        ',Z0
  1597.       WRITE(1,*)'Rugosidad para oleaje:            ',KSW
  1598.       WRITE(1,*)'Factor de fricci�n en olas:       ',FW
  1599.       WRITE(1,*)'Factor de eficiencia de corr.:    ',FMUC
  1600.       WRITE(1,*)'Factor de eficiencia de olas:     ',FMUW
  1601.       WRITE(1,*)'Coeficiente de interacci�n C-O:   ',ALFCW
  1602.       WRITE(1,*)'Estr~Bs adim. para transp. de fondo',T(NC,MC)
  1603.       WRITE(1,*)'Estr~Bs adim. para concentracion:  ',TA(NC,MC)
  1604.  
  1605.       WRITE(1,*)'Transporte en suspension:  ',QSX(NC,MC),QSY(NC,MC),
  1606.      & SQRT(QSX(NC,MC)**2+QSY(NC,MC)**2+1.e-22)
  1607.       CALL TANG(QSX(NC,MC),QSY(NC,MC),ANGU)
  1608.       WRITE(1,*)'Direccion  en suspension:  ',ANGU
  1609.  
  1610.       WRITE(1,*)'Transporte en el fondo:    ',QBX(NC,MC),QBY(NC,MC),
  1611.      & SQRT(QBX(NC,MC)**2+QBY(NC,MC)**2+1.e-22)
  1612.       CALL TANG(QBX(NC,MC),QBY(NC,MC),ANGU)
  1613.       WRITE(1,*)'Direccion  en el fondo:    ',ANGU
  1614.  
  1615.       CLOSE (1)
  1616.  102  CONTINUE
  1617. C------------------------- PUNTOS DE CONTROL H(t) --------
  1618.       IF(TYPE1.EQ.1.OR.IPRT(13).EQ.0)GO TO 97
  1619.       IF(IEN.EQ.2)THEN
  1620.       OPEN (1,FILE=LITOP//'HDET.DAT',STATUS='NEW')
  1621.      TIEMP=1.
  1622.       ELSE
  1623.       OPEN (1,FILE=LITOP//'HDET.DAT',STATUS='OLD')
  1624.   95  READ(1,*,END=96)TIEMP,(HVREM(NCH(K),MCH(K)),K=1,NHC)
  1625.       GO TO 95
  1626.   96  TIEMP=TIEMP+1.
  1627.       END IF
  1628.  
  1629.       DO K=1,NHC
  1630.       HVREM(NCH(K),MCH(K))=H(NCH(K),MCH(K))
  1631.       IF(H(NCH(K),MCH(K)).EQ.PF)HVREM(NCH(K),MCH(K))=0.
  1632.       END DO
  1633.  
  1634.       WRITE(1,94)TIEMP,(HVREM(NCH(K),MCH(K)),K=1,NHC)
  1635.   94  FORMAT(1000F10.3)
  1636.       CLOSE (1)
  1637.   97  CONTINUE
  1638.  
  1639.       IF(TYPE1.EQ.1)RETURN
  1640.       IF(ICORR.EQ.0)RETURN
  1641. C------------------------- OLEAJE EN CORRIENTE------------
  1642.       OPEN(1,FILE=SWANP//'CORIENTE.DAT')
  1643.       DO J=1,N
  1644.       IF(IFORM.EQ.1)JJ=N-J+1
  1645.       IF(IFORM.EQ.0)JJ=J
  1646.       WRITE(1,101)(U(JJ,I),I=1,M)
  1647.       END DO
  1648.       DO J=1,N
  1649.       IF(IFORM.EQ.1)JJ=N-J+1
  1650.       IF(IFORM.EQ.0)JJ=J
  1651.       WRITE(1,101)(V(JJ,I),I=1,M)
  1652.       END DO
  1653.  101  FORMAT(1000F6.2)
  1654.       CLOSE (1)
  1655.       RETURN
  1656.       END
  1657.  
  1658.  
  1659.       REAL FUNCTION DEAN(DIST,ADEAN)
  1660.       DEAN=ADEAN*DIST**(2./3.)
  1661.       RETURN
  1662.       END
  1663.  
  1664.  
  1665.       SUBROUTINE SWITCHE
  1666.  
  1667. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 2.1, 2000
  1668.  
  1669.       INCLUDE 'COMML.FOR'
  1670.       INCLUDE 'VARS.INC'
  1671.       OPEN (1,FILE=LITOP//'PARAM2.DAT')
  1672.       READ(1,*)IWIC
  1673.       READ(1,*)INLT
  1674.       READ(1,*)IWC
  1675.       READ(1,*)IRTF
  1676.       READ(1,*)ITB
  1677.       READ(1,*)ITRANS
  1678.       READ(1,*)ISLOP
  1679.       READ(1,*)DLIMM
  1680.       READ(1,*)DLIMP
  1681.       READ(1,*)QLIM
  1682.       READ(1,*)ICORR
  1683.       READ(1,*)ISMOOT
  1684.       IF(ISMOOT.EQ.1)THEN
  1685.       READ(1,*)KRATS
  1686.       READ(1,*)WEIGHT
  1687.       IF(WEIGHT.GT.1.0.OR.WEIGHT.LT.0.0)
  1688.      & STOP'Error en definicion de WEIGHT'
  1689.       ELSE
  1690.       READ(1,*)KRATS0
  1691.       READ(1,*)WEIGHT0
  1692.       END IF
  1693.       READ(1,*)ISMOOTW
  1694.       IF(ISMOOTW.NE.1)GO TO 2
  1695.       READ(1,*)KRATSW
  1696.       READ(1,*)WEIGHTW
  1697.       IF(WEIGHTW.GT.1.0.OR.WEIGHTW.LT.0.0)
  1698.      & STOP'Error en definicion de WEIGHTW'
  1699.       READ(1,*)ICOMP
  1700.       IF(ICOMP.EQ.2.OR.ICOMP.GT.5)STOP'Error en definicion de ICOMP'
  1701.   2   CONTINUE
  1702.  
  1703.       IF(IWIC.NE.0.AND.IWIC.NE.1)THEN
  1704.       WRITE(*,*)'Error en definicion de IWIC'
  1705.       stop
  1706.       ELSE
  1707.       END IF
  1708.  
  1709.       IF(INLT.NE.0.AND.INLT.NE.1)THEN
  1710.       WRITE(*,*)'Error en definicion de INLT'
  1711.       stop
  1712.       ELSE
  1713.       END IF
  1714.  
  1715.       IF(IWC.NE.0.AND.IWC.NE.1)THEN
  1716.       WRITE(*,*)'Error en definicion de IWC'
  1717.       stop
  1718.       ELSE
  1719.       END IF
  1720.  
  1721.       IF(IRTF.NE.0.AND.IRTF.NE.1)THEN
  1722.       WRITE(*,*)'Error en definicion de IRTF'
  1723.       stop
  1724.       ELSE
  1725.       END IF
  1726.       IQS=1
  1727.       IQB=1
  1728.       IF(ITRANS.EQ.1)IQB=0
  1729.       IF(ITRANS.EQ.2)IQS=0
  1730.  
  1731.       CLOSE (1)
  1732.       RETURN
  1733.       END
  1734.  
  1735.  
  1736.       SUBROUTINE CONVERT
  1737.  
  1738. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 2.1, 2000
  1739.  
  1740.       INCLUDE 'COMML.FOR'
  1741.       INCLUDE 'VARS.INC'
  1742. C---------------- CONVERTIR LOS COMPONENTES CONTRAVARIANTES A LOS CARTESIANOS
  1743.       DO 100 I=2,M-1
  1744.       DO 100 J=2,N-1
  1745.       YN=(Y(J+1,I)-Y(J-1,I))*0.5/HAG
  1746.       YK=(Y(J,I+1)-Y(J,I-1))*0.5/HAG
  1747.       XN=(X(J+1,I)-X(J-1,I))*0.5/HAG
  1748.       XK=(X(J,I+1)-X(J,I-1))*0.5/HAG
  1749.       UC(J,I)=U(j,i)*xk+V(j,i)*xn
  1750.       VC(J,I)=U(j,i)*yk+V(j,i)*yn
  1751.       QSXC(J,I)=QSX(j,i)*xk+QSY(j,i)*xn
  1752.       QSYC(J,I)=QSX(j,i)*yk+QSY(j,i)*yn
  1753.       QBXC(J,I)=QBX(j,i)*xk+QBY(j,i)*xn
  1754.       QBYC(J,I)=QBX(j,i)*yk+QBY(j,i)*yn
  1755.  100  CONTINUE
  1756. c------------------------------------------------------------------
  1757.       DO 101 I=2,M-1
  1758.       J=1
  1759.       YN=(Y0(J+1,I)-Y0(J,I)+Y0(J+1,I+1)-Y0(J,I+1))*0.5/HAG
  1760.       YK=(Y0(J,I+1)-Y0(J,I)+Y0(J+1,I+1)-Y0(J+1,I))*0.5/HAG
  1761.       XN=(X0(J+1,I)-X0(J,I)+X0(J+1,I+1)-X0(J,I+1))*0.5/HAG
  1762.       XK=(X0(J,I+1)-X0(J,I)+X0(J+1,I+1)-X0(J+1,I))*0.5/HAG
  1763.       UC(J,I)=U(j,i)*xk+V(j,i)*xn
  1764.       VC(J,I)=U(j,i)*yk+V(j,i)*yn
  1765.       QSXC(J,I)=QSX(j,i)*xk+QSY(j,i)*xn
  1766.       QSYC(J,I)=QSX(j,i)*yk+QSY(j,i)*yn
  1767.       QBXC(J,I)=QBX(j,i)*xk+QBY(j,i)*xn
  1768.       QBYC(J,I)=QBX(j,i)*yk+QBY(j,i)*yn
  1769.  109  J=N
  1770.       YN=(Y0(J+1,I)-Y0(J,I)+Y0(J+1,I+1)-Y0(J,I+1))*0.5/HAG
  1771.       YK=(Y0(J,I+1)-Y0(J,I)+Y0(J+1,I+1)-Y0(J+1,I))*0.5/HAG
  1772.       XN=(X0(J+1,I)-X0(J,I)+X0(J+1,I+1)-X0(J,I+1))*0.5/HAG
  1773.       XK=(X0(J,I+1)-X0(J,I)+X0(J+1,I+1)-X0(J+1,I))*0.5/HAG
  1774.       UC(J,I)=U(j,i)*xk+V(j,i)*xn
  1775.       VC(J,I)=U(j,i)*yk+V(j,i)*yn
  1776.       QSXC(J,I)=QSX(j,i)*xk+QSY(j,i)*xn
  1777.       QSYC(J,I)=QSX(j,i)*yk+QSY(j,i)*yn
  1778.       QBXC(J,I)=QBX(j,i)*xk+QBY(j,i)*xn
  1779.       QBYC(J,I)=QBX(j,i)*yk+QBY(j,i)*yn
  1780.  101  CONTINUE
  1781.       DO 102 J=2,N-1
  1782.       I=1
  1783.       YN=(Y0(J+1,I)-Y0(J,I)+Y0(J+1,I+1)-Y0(J,I+1))*0.5/HAG
  1784.       YK=(Y0(J,I+1)-Y0(J,I)+Y0(J+1,I+1)-Y0(J+1,I))*0.5/HAG
  1785.       XN=(X0(J+1,I)-X0(J,I)+X0(J+1,I+1)-X0(J,I+1))*0.5/HAG
  1786.       XK=(X0(J,I+1)-X0(J,I)+X0(J+1,I+1)-X0(J+1,I))*0.5/HAG
  1787.       UC(J,I)=U(j,i)*xk+V(j,i)*xn
  1788.       VC(J,I)=U(j,i)*yk+V(j,i)*yn
  1789.       QSXC(J,I)=QSX(j,i)*xk+QSY(j,i)*xn
  1790.       QSYC(J,I)=QSX(j,i)*yk+QSY(j,i)*yn
  1791.       QBXC(J,I)=QBX(j,i)*xk+QBY(j,i)*xn
  1792.       QBYC(J,I)=QBX(j,i)*yk+QBY(j,i)*yn
  1793.  108  I=M
  1794.       YN=(Y0(J+1,I)-Y0(J,I)+Y0(J+1,I+1)-Y0(J,I+1))*0.5/HAG
  1795.       YK=(Y0(J,I+1)-Y0(J,I)+Y0(J+1,I+1)-Y0(J+1,I))*0.5/HAG
  1796.       XN=(X0(J+1,I)-X0(J,I)+X0(J+1,I+1)-X0(J,I+1))*0.5/HAG
  1797.       XK=(X0(J,I+1)-X0(J,I)+X0(J+1,I+1)-X0(J+1,I))*0.5/HAG
  1798.       UC(J,I)=U(j,i)*xk+V(j,i)*xn
  1799.       VC(J,I)=U(j,i)*yk+V(j,i)*yn
  1800.       QSXC(J,I)=QSX(j,i)*xk+QSY(j,i)*xn
  1801.       QSYC(J,I)=QSX(j,i)*yk+QSY(j,i)*yn
  1802.       QBXC(J,I)=QBX(j,i)*xk+QBY(j,i)*xn
  1803.       QBYC(J,I)=QBX(j,i)*yk+QBY(j,i)*yn
  1804.  102  CONTINUE
  1805.  
  1806.       UC(1,1)=UC(1,2)+UC(2,1)-UC(2,2)
  1807.       UC(N,1)=UC(N,2)+UC(N-1,1)-UC(N-1,2)
  1808.       UC(1,M)=UC(1,M-1)+UC(2,M)-UC(2,M-1)
  1809.       UC(N,M)=UC(N,M-1)+UC(N-1,M)-UC(N-1,M-1)
  1810.       VC(1,1)=VC(1,2)+VC(2,1)-VC(2,2)
  1811.       VC(N,1)=VC(N,2)+VC(N-1,1)-VC(N-1,2)
  1812.       VC(1,M)=VC(1,M-1)+VC(2,M)-VC(2,M-1)
  1813.       VC(N,M)=VC(N,M-1)+VC(N-1,M)-VC(N-1,M-1)
  1814.  
  1815.       QSXC(1,1)=QSXC(1,2)+QSXC(2,1)-QSXC(2,2)
  1816.       QSXC(N,1)=QSXC(N,2)+QSXC(N-1,1)-QSXC(N-1,2)
  1817.       QSXC(1,M)=QSXC(1,M-1)+QSXC(2,M)-QSXC(2,M-1)
  1818.       QSXC(N,M)=QSXC(N,M-1)+QSXC(N-1,M)-QSXC(N-1,M-1)
  1819.  
  1820.       QSYC(1,1)=QSYC(1,2)+QSYC(2,1)-QSYC(2,2)
  1821.       QSYC(N,1)=QSYC(N,2)+QSYC(N-1,1)-QSYC(N-1,2)
  1822.       QSYC(1,M)=QSYC(1,M-1)+QSYC(2,M)-QSYC(2,M-1)
  1823.       QSYC(N,M)=QSYC(N,M-1)+QSYC(N-1,M)-QSYC(N-1,M-1)
  1824.  
  1825.       QBXC(1,1)=QBXC(1,2)+QBXC(2,1)-QBXC(2,2)
  1826.       QBXC(N,1)=QBXC(N,2)+QBXC(N-1,1)-QBXC(N-1,2)
  1827.       QBXC(1,M)=QBXC(1,M-1)+QBXC(2,M)-QBXC(2,M-1)
  1828.       QBXC(N,M)=QBXC(N,M-1)+QBXC(N-1,M)-QBXC(N-1,M-1)
  1829.       QBYC(1,1)=QBYC(1,2)+QBYC(2,1)-QBYC(2,2)
  1830.       QBYC(N,1)=QBYC(N,2)+QBYC(N-1,1)-QBYC(N-1,2)
  1831.       QBYC(1,M)=QBYC(1,M-1)+QBYC(2,M)-QBYC(2,M-1)
  1832.       QBYC(N,M)=QBYC(N,M-1)+QBYC(N-1,M)-QBYC(N-1,M-1)
  1833.       RETURN
  1834.       END
  1835.  
  1836.       SUBROUTINE SHIELD
  1837.  
  1838. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 2.1, 2000
  1839.  
  1840. C     SHIELD PARAMETER (TETACR) AND CREATICAL BED-SHEAR STRESS (TAUCR)
  1841.       INCLUDE 'COMML.FOR'
  1842.       IF(DCONST.LT.1.)STOP'VERY SMALL PARTICLES OR ANOTHER REASON'
  1843.       IF(DCONST.LE.4.)THEN
  1844.       TETACR=0.24/DCONST
  1845.       TAUCR=(ROS-RO)*GRAV*D50*TETACR
  1846.       RETURN
  1847.       ELSE
  1848.       END IF
  1849.       IF(DCONST.LE.10.)THEN
  1850.       TETACR=0.14/DCONST**0.64
  1851.       TAUCR=(ROS-RO)*GRAV*D50*TETACR
  1852.       RETURN
  1853.       ELSE
  1854.       END IF
  1855.       IF(DCONST.LE.20.)THEN
  1856.       TETACR=0.04/DCONST**0.1
  1857.       TAUCR=(ROS-RO)*GRAV*D50*TETACR
  1858.       RETURN
  1859.       ELSE
  1860.       END IF
  1861.       IF(DCONST.LE.150.)THEN
  1862.       TETACR=0.013*DCONST**0.29
  1863.       TAUCR=(ROS-RO)*GRAV*D50*TETACR
  1864.       RETURN
  1865.       ELSE
  1866.       END IF
  1867.       IF(DCONST.GT.150.)THEN
  1868.       TETACR=0.055
  1869.       TAUCR=(ROS-RO)*GRAV*D50*TETACR
  1870.       RETURN
  1871.       ELSE
  1872.       END IF
  1873.  
  1874.       RETURN
  1875.       END
  1876.       SUBROUTINE WAVEL
  1877.  
  1878. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 2.1, 2000
  1879.  
  1880. C   WAVE LENGTH MODIFIED BY CURRENTS & COMPUTED WAVE PARAMETERS
  1881.       INCLUDE 'COMML.FOR'
  1882.       RAD=3.14/180.
  1883.       DO 1 J=1,N
  1884.       DO 1 I=1,M
  1885.       IF(HL(J,I).EQ.PF)GO TO 1
  1886.       IF(H1(J,I).LT.DMIN)GO TO 1
  1887.       IF(X(J,I).EQ.XLIM)GO TO 1
  1888.  
  1889.       UMO=SQRT(U(J,I)**2+V(J,I)**2)+0.1E-11
  1890.       CALL TANG(U(J,I),V(J,I),ANGU)
  1891.       FI1=ABS(ANGU-DIR(J,I))
  1892.       FLA1(J,I)=FLAMB(J,I)
  1893.  
  1894.       IF(ICORR.EQ.1)GO TO 11
  1895. C---------- iterative process -------------------
  1896. C     KIT=0
  1897. C 3   ARG=6.28*H1(J,I)/FLA1(J,I)
  1898. C     KIT=KIT+1
  1899. C
  1900. C     IF(UMO.LT.0.01)GO TO 4
  1901. C     IF(KIT.GT.100000)STOP'ITERATIVE PROCESS DOESN"T CONVERGE FOR LAMB'
  1902. C     TANGH1=(EXP(ARG)-EXP(-ARG))/(EXP(ARG)+EXP(-ARG))
  1903. C     VREM0=6.28/GRAV*(FLA1(J,I)/TAU(J,I)-UMO*COS(RAD*FI1))**2/TANGH1
  1904. C     IF(ABS(VREM0-FLA1(J,I)/(VREM0+1.E-11)).LE.0.01)GO TO 2
  1905. C     IF(VREM0.LT.FLAMB(J,I)/5.)THEN
  1906. C     FLA1(J,I)=FLAMB(J,I)*1.5
  1907. C     ELSE
  1908. C     FLA1(J,I)=VREM0
  1909. C     END IF
  1910. C     GO TO 3
  1911. C 2   FLAMB(J,I)=VREM0
  1912. C------------------------------------------------
  1913. ccccc FLAMB(J,I)=FLA1(J,I)-TAU(J,I)*UMO*COS(RAD*FI1)    !!!!!!!!!!!!!!!
  1914. c------------------------------------------------
  1915.   4   continue
  1916. ccccc TAU(J,I)=TAU(J,I)/(1.-UMO*TAU(J,I)*COS(RAD*FI1)/FLAMB(J,I))    !!!!
  1917.   11  CONTINUE
  1918.       FLAMB(J,I)=AMAX1(FLAMB(J,I),2.0)      ! 3.0 m
  1919.       TAU(J,I)=AMAX1(TAU(J,I),0.1)
  1920.       ARG=6.28*H1(J,I)/FLAMB(J,I)
  1921.       AD(J,I)=HW(J,I)/(EXP(ARG)-EXP(-ARG))
  1922.       if(ad(j,i).eq.0.)write(*,*)i,j,hw(j,i),arg,h1(j,i),flamb(j,i)   !!!
  1923. cccc  UORB(J,I)=6.28*HW(J,I)/TAU(J,I)/(EXP(ARG)-EXP(-ARG))  ! why not from SWAN
  1924.       DW(J,I)=0.072*AD(J,I)*(AD(J,I)/KSW)**0.25
  1925.  
  1926. C-------------------------------------------------
  1927.       IF(H1(J,I).GE.(0.01*GRAV*TAU(J,I)**2))then       ! Tp no modificado ! ?
  1928.       UORBF(J,I)=UORB(J,I)+12.*(6.28*HW(J,I))**2/TAU(J,I)/FLAMB(J,I)/
  1929.      & (EXP(ARG)-EXP(-ARG))**4
  1930.       UORBB(J,I)=UORB(J,I)-12.*(6.28*HW(J,I))**2/TAU(J,I)/FLAMB(J,I)/
  1931.      & (EXP(ARG)-EXP(-ARG))**4
  1932.       else
  1933.       ALFA1=1.+0.3*(HW(J,I)/H1(J,I))
  1934.       UORBF(J,I)=ALFA1*UORB(J,I)
  1935.       UORBB(J,I)=(2.-ALFA1)*UORB(J,I)
  1936.       end if
  1937.  
  1938. C------------------RETURN VELOCITY MASS TRANSPORT & NEAR-BED WAVE-IND. VELOCITY
  1939.       HT=(0.95-0.35*HW(J,I)/H1(J,I))*H1(J,I)
  1940.       UR(J,I)=0.125*SQRT(GRAV/H1(J,I))*HW(J,I)**2/HT
  1941.       ALFAS=UORBF(J,I)/(UORBF(J,I)+UORBB(J,I)+.1e-11)
  1942.       UB(J,I)=(0.05-(ALFAS-0.5))*UORB(J,I)
  1943.  
  1944. C------------------APPARENT BED ROUGHNESS -----------------
  1945.       GAMA=0.8+RAD*FI1-0.3*(RAD*FI1)**2
  1946.       ARGN=GAMA*UORB(J,I)/SQRT(UMO**2+UR(J,I)**2)
  1947.       IF(ARGN.GT.10.)THEN
  1948.       KA(J,I)=10.*Z0
  1949.       ELSE
  1950.       KA(J,I)=Z0*EXP(ARGN)
  1951.       KA(J,I)=AMIN1(KA(J,I),10.*Z0)
  1952.       IF(KA(J,I).LT.Z0)KA(J,I)=Z0                        ! ? artificial
  1953.       END IF
  1954.  
  1955. C------------------FRICTION FACTORS -----------------------
  1956.       FCP=0.24/(ALOG10(4.*H1(J,I)/D90))**2
  1957.       FC=0.24/(ALOG10(12.*H1(J,I)/Z0))**2
  1958.       FA=0.24/(ALOG10(12.*H1(J,I)/KA(J,I)))**2
  1959.  
  1960.       FWP=0.3
  1961.       FW=0.3
  1962.       IF(AD(J,I).GT.0.001)THEN
  1963.       FWP=EXP(-6.+5.2/(AD(J,I)/3./D90)**0.19)
  1964.       FW=EXP(-6.+5.2/(AD(J,I)/KSW)**0.19)
  1965.       FWP=AMIN1(FWP,0.3)
  1966.       FW=AMIN1(FW,0.3)
  1967.       ELSE
  1968.       END IF
  1969. C------------------EFFECTIVE TIME-AVERAGED BED-SHEAR STRESS
  1970.       FMUC=FCP/FC
  1971.       FMUW=FWP/FW
  1972.       FMUWA=0.6/DCONST
  1973.       ALFCW=(ALOG(90.*DW(J,I)/KA(J,I))/ALOG(90.*DW(J,I)/Z0))**2*
  1974.      & ((ALOG(30.*H1(J,I)/Z0)-1.)/(ALOG(30.*H1(J,I)/KA(J,I))-1.))**2
  1975.       ALFCW=AMIN1(ALFCW,1.)
  1976.       TC=RO/8.*FC*SQRT(UMO**2+UR(J,I)**2)
  1977.       TW=RO/4.*FW*UORB(J,I)**2
  1978.       TCW=TC+TW
  1979.       UPC=SQRT(ALFCW*FMUC*TC/RO)          ! Effective bed-shear velocity current
  1980.  
  1981.  
  1982.       T(J,I)=(ALFCW*FMUC*TC+FMUW*TW-TAUCR)/TAUCR
  1983.       T(J,I)=AMAX1(0.,T(J,I))
  1984.       TA(J,I)=(ALFCW*FMUC*TC+FMUWA*TW-TAUCR)/TAUCR
  1985.       TA(J,I)=AMAX1(0.,TA(J,I))
  1986.  
  1987. C----------------- BED-LOAD TRANSPORT ----------------------
  1988.       ZDELTA=AMAX1(3.*DW(J,I),Z0)
  1989.       VRD=UMO*ALOG(30.*ZDELTA/KA(J,I))/(ALOG(30.*H1(J,I)/KA(J,I))-1.)
  1990.       URD=(UR(J,I)/UMO)*VRD
  1991.       ASYM(J,I)=UORBF(J,I)-UORBB(J,I)
  1992.       SUMUDX=(ASYM(J,I)+UB(J,I)-URD)*COS(RAD*DIR(J,I))+VRD*COS(RAD*ANGU)
  1993.       SUMUDY=(ASYM(J,I)+UB(J,I)-URD)*SIN(RAD*DIR(J,I))+VRD*SIN(RAD*ANGU)
  1994.       SUMUDR=SQRT(SUMUDX**2+SUMUDY**2)
  1995.       ALFA2=ABS(VRD)/(ABS(VRD)+ABS(UORB(J,I)))
  1996.       BETA2=0.25*((ALOG(30.*H1(J,I)/Z0)-1.)/ALOG(30.*ZDELTA/Z0))**2
  1997.       FCWP=ALFA2*BETA2*FCP+(1.-ALFA2)*FWP
  1998.       TBCWP=0.5*RO*FCWP*SUMUDR**2
  1999.       GAMA2=1.-SQRT(HW(J,I)/H1(J,I))
  2000.       GAMA2=AMAX1(0.3,GAMA2)
  2001.  
  2002.       QB=0.
  2003.       CALL SLOPE1(I,J,SUMUDX,SUMUDY,SUMUDR)
  2004.       IF(TBCWP.GT.TAUCR*KB)THEN
  2005.       QB=0.25*GAMA2*ROS*D50/(DCONST**0.3)*SQRT(TBCWP/RO)*
  2006.      & (TBCWP/(TAUCR*KB)-1.)**1.5
  2007.       QB=QB*AS
  2008.       ELSE
  2009.       END IF
  2010.       QBX(J,I)=(SUMUDX/SUMUDR)*QB
  2011.       QBY(J,I)=(SUMUDY/SUMUDR)*QB
  2012.  
  2013.   1   CONTINUE
  2014.       RETURN
  2015.       END
  2016.  
  2017.       SUBROUTINE PROFU
  2018.  
  2019. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 2.1, 2000
  2020.  
  2021. C    VELOCITY DISTRIBUTION OVER TE DEPTH
  2022.       INCLUDE 'COMML.FOR'
  2023.       DO 1 J=1,N
  2024.       DO 1 I=1,M
  2025.       IF(HL(J,I).EQ.PF)GO TO 1
  2026.       IF(H1(J,I).LT.DMIN)GO TO 1
  2027.       UMO=SQRT(U(J,I)**2+V(J,I)**2)
  2028.       DO 2 K=1,10
  2029.       Z(K,J,I)=H1(J,I)*(K-1)/9.+AMIN1(Z0,KSW)                 ! WARNING
  2030.       IF(Z(K,J,I).LT.(3.*DW(J,I)))THEN
  2031.       UDELTA=UMO*ALOG(90.*DW(J,I)/KA(J,I))/
  2032.      & (ALOG(30.*H1(J,I)/KA(J,I))-1.)
  2033.       UV(K,J,I)=UDELTA*ALOG(30.*Z(K,J,I)/Z0)/ALOG(90.*DW(J,I)/Z0)
  2034.       ELSE
  2035.       UV(K,J,I)=UMO*ALOG(30.*Z(K,J,I)/KA(J,I))/
  2036.      & (ALOG(30.*H1(J,I)/KA(J,I))-1.)
  2037.       END IF
  2038.   2   CONTINUE
  2039.   1   CONTINUE
  2040.       RETURN
  2041.       END
  2042.  
  2043.  
  2044.       SUBROUTINE PROFK
  2045.  
  2046. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 2.1, 2000
  2047.  
  2048. C    MIXING COEFFICIENT DISTRIBUTION OVER TE DEPTH
  2049.       INCLUDE 'COMML.FOR'
  2050.       DSMIN=0.05
  2051.       DSMAX=0.2
  2052.  
  2053.       DO 1 J=1,N
  2054.       DO 1 I=1,M
  2055.       IF(HL(J,I).EQ.PF)GO TO 1
  2056.       IF(H1(J,I).LT.DMIN)GO TO 1
  2057.       UMO=SQRT(U(J,I)**2+V(J,I)**2)
  2058.       DO 2 K=1,10
  2059.       EPSC=0.
  2060.       C=18.*ALOG10(12.*H1(J,I)/Z0)
  2061.       UC1=SQRT(GRAV)/C*SQRT(UMO**2+UR(J,I)**2)
  2062.       BETA1=AMIN1(1.5,(1.+2.*(WG/UC1)**2))
  2063.       IF(Z(K,J,I).LT.(0.5*H1(J,I)))THEN
  2064.       EPSC=0.4*BETA1*UC1*Z(K,J,I)*(1.-Z(K,J,I)/H1(J,I))
  2065.       ELSE
  2066.       EPSC=0.25*0.4*BETA1*UC1*H1(J,I)
  2067.       END IF
  2068.      EPSW=0.
  2069.       IF(IWIC.EQ.0)GO TO 3
  2070.       DS0=0.3*H1(J,I)*SQRT(HW(J,I)/H1(J,I))
  2071.       DS0=AMAX1(DS0,DSMIN)
  2072.       DS0=AMIN1(DS0,DSMAX)
  2073.       EPSBED=0.004*DCONST*DS0*UORB(J,I)
  2074.       EPSTOP=0.035*H1(J,I)*HW(J,I)/TAU(J,I)               ! TAU MODIFICADO?
  2075.       IF(Z(K,J,I).LE.DS0)THEN
  2076.       EPSW=EPSBED
  2077.       ELSE IF(Z(K,J,I).GE.(0.5*H1(J,I)))THEN
  2078.       EPSW=EPSTOP
  2079.       ELSE
  2080.       EPSW=EPSBED+(EPSTOP-EPSBED)*(Z(K,J,I)-DS0)/(0.5*H1(J,I)-DS0)
  2081.       END IF
  2082.   3   CONTINUE
  2083.       EPSCW(K,J,I)=SQRT(EPSC**2+EPSW**2)
  2084.   2   CONTINUE
  2085.   1   CONTINUE
  2086.       RETURN
  2087.       END
  2088.  
  2089.  
  2090.       SUBROUTINE FALL
  2091.  
  2092. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 2.1, 2000
  2093.  
  2094. C    FALL VELOCITY  (DS - SIEVE DIAMETER   !!!)
  2095.       INCLUDE 'COMML.FOR'
  2096.       IF(DS.LT.1.E-06)THEN
  2097.       WG=0.
  2098.       RETURN
  2099.       ELSE
  2100.       END IF
  2101.       IF(DS.LE.1.E-04)THEN
  2102.       WG=(ROS/RO-1.)*GRAV*DS**2/18./ANU
  2103.       RETURN
  2104.       ELSE
  2105.       END IF
  2106.       IF(DS.LT.1.E-03)THEN
  2107.       WG=10.*ANU/DS*(SQRT(1.+0.01*(ROS/RO-1.)*GRAV*DS**3/ANU**2)-1.)
  2108.       RETURN
  2109.       ELSE
  2110.       WG=1.1*SQRT((ROS/RO-1.)*GRAV*DS)
  2111.       END IF
  2112.       RETURN
  2113.       END
  2114.  
  2115.  
  2116.       SUBROUTINE PROFC
  2117.  
  2118. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 2.1, 2000
  2119.  
  2120. C    CONCENTRATION DISTRIBUTION OVER TE DEPTH
  2121.       INCLUDE 'COMML.FOR'
  2122.  
  2123.       ALEV=AMAX1(Z0,KSW)        ! REFERENCE LEVEL
  2124.       C0=0.65                   ! MAXIMUM VOLUME CONCENTRATION
  2125.       DO 1 J=1,N
  2126.       DO 1 I=1,M
  2127.       IF(HL(J,I).EQ.PF)GO TO 1
  2128.       IF(H1(J,I).LT.DMIN)GO TO 1
  2129.       CBED=0.015*D50/ALEV*TA(J,I)**1.5/DCONST**0.3
  2130.       CBED=AMIN1(CBED,C0)
  2131.  
  2132.       DO 2 K=1,10
  2133.       IF(Z(K,J,I).LE.ALEV)THEN
  2134.       CON(K,J,I)=CBED
  2135.       ELSE
  2136.       IF(K.EQ.1)STOP'ERROR IN CONCENTRATION LEVELS'
  2137.       CON(K,J,I)=CON(K-1,J,I)-H1(J,I)/9.*
  2138.      &(1.-CON(K-1,J,I))**5*CON(K-1,J,I)*WG/
  2139.      &EPSCW(K,J,I)/(1.+(CON(K-1,J,I)/C0)**0.8-2.*(CON(K-1,J,I)/C0)**0.4)
  2140.       CON(K,J,I)=AMAX1(CON(K,J,I),0.0)
  2141.       END IF
  2142.   2   CONTINUE
  2143.  
  2144.   1   CONTINUE
  2145.       RETURN
  2146.       END
  2147.  
  2148.       SUBROUTINE FLUX90
  2149.  
  2150. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 2.1, 2000
  2151.  
  2152.       INCLUDE 'COMML.FOR'
  2153.       RAD=3.14/180.
  2154.       DO 1 J=1,N
  2155.       DO 1 I=1,M
  2156.       QSC=0.
  2157.       QSW=0.
  2158.       IF(HL(J,I).EQ.PF)GO TO 1
  2159.       IF(H1(J,I).LT.DMIN)GO TO 1
  2160.       DZ=H1(J,I)/9.
  2161.       DO 2 K=1,10
  2162.       IF(Z(K,J,I).LE.ALEV)GO TO 2
  2163.       QSC=QSC+ROS*DZ*UV(K,J,I)*CON(K,J,I)
  2164.       QSW=QSW+ROS*DZ*UR(J,I)*CON(K,J,I)
  2165.   2   CONTINUE
  2166.       CALL TANG(U(J,I),V(J,I),ANGU)
  2167.       QSX(J,I)=QSC*COS(RAD*ANGU)-QSW*COS(RAD*DIR(J,I))
  2168.       QSY(J,I)=QSC*SIN(RAD*ANGU)-QSW*SIN(RAD*DIR(J,I))
  2169.       QTX(J,I)=QSX(J,I)*IQS+QBX(J,I)*IQB
  2170.       QTY(J,I)=QSY(J,I)*IQS+QBY(J,I)*IQB
  2171.   1   CONTINUE
  2172.       RETURN
  2173.       END
  2174.  
  2175.  
  2176.       SUBROUTINE VORTX1
  2177.  
  2178. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 2.1, 2000
  2179.  
  2180.       INCLUDE 'COMML.FOR'
  2181.       epsp=0.0001
  2182.       MOL=0
  2183.       DO 19 I=1,M1
  2184.       DO 19 J=1,N1
  2185.       IF(KT.EQ.1)PSI(J,I)=PSI0(J,I)
  2186.       IF(H(J,I).EQ.PF)GOTO 19
  2187.       MOL=MOL+1
  2188.    19 CONTINUE
  2189.       TETA=1.
  2190.       L=0
  2191.    35 L=L+1
  2192.       IF(L.GE.2000000)GOTO 325
  2193.  
  2194.       CALL BOUND
  2195.  
  2196.       DO 778 I=2,M
  2197.       DO 778 J=2,N
  2198.       IF(H(J,I).EQ.PF)GOTO 778
  2199. C     IF(H(J+1,I).EQ.PF.OR.H(J,I+1).EQ.PF.OR.H(J,I-1).EQ.PF
  2200. C    &.OR.H(J-1,I).EQ.PF)GOTO 778
  2201. C     IF(H(J+1,I+1).EQ.PF.OR.H(J-1,I+1).EQ.PF.OR.H(J+1,I-1).EQ.PF
  2202. C    &.OR.H(J-1,I-1).EQ.PF)GOTO 778
  2203.       DDT=(AFV(J,I)+AFV(J-1,I)-AFV(J,I-1)-AFV(J-1,I-1)
  2204.      &-AFU(J,I)-AFU(J,I-1)+AFU(J-1,I)+AFU(J-1,I-1))
  2205.  
  2206.       A1=RK(J,I)*HL1(J,I)/HL2(J,I)/H1(J,I)
  2207.       A4=RK(J,I-1)*HL1(J,I-1)/HL2(J,I-1)/H1(J,I-1)
  2208.       A8=RK(J-1,I)*HL1(J-1,I)/HL2(J-1,I)/H1(J-1,I)
  2209.       A9=RK(J-1,I-1)*HL1(J-1,I-1)/HL2(J-1,I-1)/H1(J-1,I-1)
  2210.       B4=YL*HH1(J+1,I)/HH2(J+1,I)/H(J+1,I)
  2211.       B8=YL*HH1(J-1,I)/HH2(J-1,I)/H(J-1,I)
  2212.       G1=RK(J,I)*HL2(J,I)/HL1(J,I)/H1(J,I)
  2213.       G2=RK(J-1,I)*HL2(J-1,I)/HL1(J-1,I)/H1(J-1,I)
  2214.       G6=RK(J,I-1)*HL2(J,I-1)/HL1(J,I-1)/H1(J,I-1)
  2215.       G7=RK(J-1,I-1)*HL2(J-1,I-1)/HL1(J-1,I-1)/H1(J-1,I-1)
  2216.       O2=YL*HH2(J,I+1)/HH1(J,I+1)/H(J,I+1)
  2217.       O6=YL*HH2(J,I-1)/HH1(J,I-1)/H(J,I-1)
  2218.  
  2219.       PSI1=((G2+G1)*PSI0(J,I+1)+(G7+G6)*PSI(J,I-1)+
  2220.      & (A4+A1)*PSI0(J+1,I)+(A9+A8)*PSI(J-1,I)+
  2221.      & 0.5*(B4*(PSI0(J+1,I+1)-PSI0(J+1,I-1))-B8*(PSI0(J-1,I+1)-
  2222.      & PSI(J-1,I-1))-O2*(PSI0(J+1,I+1)-PSI0(J-1,I+1))+
  2223.      & O6*(PSI0(J+1,I-1)-PSI(J-1,I-1)))-HAG*DDT)/         ! DOESN'T DIVIDE BY 2 AND ONE HAG!
  2224.      & (G1+G2+G6+G7+A1+A4+A8+A9)
  2225.  
  2226.       PSI(J,I)=TETA*PSI1+(1.-TETA)*PSI0(J,I)
  2227.  778  CONTINUE
  2228.       CALL VELCTY
  2229.       CALL FRIC
  2230.       CALL RHS
  2231.  
  2232.       if(L.eq.1)go to 35
  2233.       KAP=0
  2234.       DO 97 I=1,M1
  2235.       DO 97 J=1,N1
  2236.       IF(H(J,I).EQ.PF)GOTO 97
  2237.       IF(PSI0(J,I).EQ.0..AND.PSI(J,I).EQ.0.)GOTO 322
  2238.       IF(ABS((PSI(J,I)-PSI0(J,I))/(PSI0(J,I)+0.1E-09)).GT.EPSP)GOTO 97
  2239.  322  KAP=KAP+1
  2240.   97  CONTINUE
  2241.       DO 2 I=1,M1
  2242.       DO 2 J=1,N1
  2243.       IF(H(J,I).EQ.PF)GOTO 2
  2244.       PSI0(J,I)=PSI(J,I)
  2245.    2  CONTINUE
  2246.       IF(KAP.EQ.MOL)GOTO 444
  2247.       IF(L/ITER1*ITER1.EQ.L)WRITE(*,*)
  2248.      &'Acercamiento esta en ',KAP/FLOAT(MOL)*100,' %'
  2249.       IF(KAP/FLOAT(MOL)*100..GE.PERC)GO TO 444
  2250.       GOTO 35
  2251.  444  CONTINUE
  2252. CCC   write(*,*)l,kap,mol
  2253.       RETURN
  2254.  325  WRITE(*,764)
  2255.  764  FORMAT(2X,'THE NUMBER OF ITERATIONS FOR PSI IS MORE THEN 2e4'/)
  2256.       RETURN
  2257.       END
  2258.  
  2259.       SUBROUTINE TESTWA
  2260.  
  2261. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 2.1, 2000
  2262.  
  2263.       INCLUDE 'COMML.FOR'
  2264.       DO 1 J=1,N
  2265.       DO 1 I=1,M
  2266.       IF(HL(J,I).EQ.PF)GO TO 1
  2267.       IF(H1(J,I).LT.DMIN)GO TO 1
  2268.       IF(UORB(J,I).LT.0.)THEN
  2269.       WRITE(*,*)'VELOCIDAD ORBITAL NEGATIVA EN I,J: ',I,J
  2270.       PAUSE
  2271.       ELSE
  2272.       END IF
  2273.  
  2274. c     IF(FX(J,I).EQ.0..AND.FY(J,I).EQ.0.)THEN
  2275. c     WRITE(*,*)'TENSOR DE TENSIONES DE OLAS = 0 EN I,J: ',I,J
  2276. c     PAUSE
  2277. c     ELSE
  2278. c     END IF
  2279.  
  2280.       IF(HW(J,I).LT.0.)THEN
  2281.       WRITE(*,*)'ALTURA DE OLA NEGATIVA EN I,J: ',I,J
  2282.       PAUSE
  2283.       ELSE
  2284.       END IF
  2285.       IF(HW(J,I).LT.0.001)HW(J,I)=0.001
  2286.  
  2287.       IF(FLAMB(J,I).LT.0.)THEN
  2288.       WRITE(*,*)'LONGITUD DE OLA NEGATIVA EN I,J: ',I,J
  2289.       PAUSE
  2290.       ELSE
  2291.       END IF
  2292.  
  2293.       IF(TAU(J,I).LT.0.)THEN
  2294.       WRITE(*,*)'PERIODO DE OLA NEGATIVO EN I,J: ',I,J
  2295.       PAUSE
  2296.       ELSE
  2297.       END IF
  2298.  
  2299.    1  CONTINUE
  2300.  
  2301.       DO 10 I=1,M
  2302.       IF(H1(1,I).LT.DMIN)GO TO 10
  2303.       FX(1,I)=FX(2,I)
  2304.       FY(1,I)=FY(2,I)
  2305.   10  CONTINUE
  2306.  
  2307.       DO 11 I=1,M
  2308.       IF(H1(N,I).LT.DMIN)GO TO 11
  2309.       FX(N,I)=FX(N-1,I)
  2310.       FY(N,I)=FY(N-1,I)
  2311.   11  CONTINUE
  2312.  
  2313.       DO 12 J=1,N
  2314.       IF(H1(J,1).LT.DMIN)GO TO 12
  2315.       FX(J,1)=FX(J,2)
  2316.       FY(J,1)=FY(J,2)
  2317.   12  CONTINUE
  2318.  
  2319.       DO 13 J=1,N
  2320.       IF(H1(J,M).LT.DMIN)GO TO 13
  2321.       FX(J,M)=FX(J,M-1)
  2322.       FY(J,M)=FY(J,M-1)
  2323.   13  CONTINUE
  2324.  
  2325.       RETURN
  2326.       END
  2327.  
  2328.  
  2329.       SUBROUTINE COSTA
  2330.  
  2331. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 2.2, 2001
  2332.  
  2333.       INCLUDE 'COMML.FOR'
  2334. C             ORIENTACION CUALQUIERA
  2335.       INCLUDE 'VARS.INC'
  2336.  
  2337.       OPEN (1,FILE=LITOP//'CCHANGX.DAT')
  2338.       DO I=1,M1
  2339.       READ(1,5,END=80)I1,XCOSTA(I),XUTM1(I),YUTM1(I)
  2340.       END DO
  2341.   80  CLOSE (1)
  2342.  
  2343.       OPEN (1,FILE=LITOP//'CCHANGY.DAT')
  2344.       DO J=1,N1
  2345.       READ(1,5,END=81)J1,YCOSTA(J),XUTM2(J),YUTM2(J)
  2346.       END DO
  2347.   81  CLOSE (1)
  2348.  
  2349.  
  2350.   5   FORMAT(I5,F8.2,2F10.1)
  2351.       OPEN (1,FILE=LITOP//'CCHANGX.DAT')
  2352.  
  2353.       DO 10 I=1,M1          ! NODOS 1-M1
  2354. C BUSQUEDA DE LA COSTA
  2355.       DELTAC=0.
  2356.       J=1
  2357.       IF(H(J,I).EQ.PF)GO TO 32
  2358.       GO TO 33
  2359.   32  IF(H(J,I).EQ.PF.AND.H(J+1,I).NE.PF)THEN
  2360.       XUTM1(I)=(X0(J,I)+X0(J-1,I))/2.
  2361.       XUTM1(I)=(X0(J,I)+X0(J-1,I))/2.           ! FUE X0(J,I)
  2362.       YUTM1(I)=(Y0(J,I)+Y0(J-1,I))/2.           !
  2363.       IF(ZNAK2(J,I).EQ.PF3)go to 38
  2364.       DELTAC=DELTA(J+1,I)*HAG*HH2(J+1,I)/H0(J+1,I)
  2365.       GO TO 31
  2366.       ELSE
  2367.       END IF
  2368.  
  2369.   38  J=J+1
  2370.       IF(J.GE.N1)GO TO 31
  2371.       GO TO 32
  2372.  
  2373.   33  IF(H(J,I).NE.PF.AND.H(J+1,I).EQ.PF)THEN
  2374.       XUTM1(I)=(X0(J+1,I)+X0(J+2,I))/2.            ! FUE X0(J+1,I)
  2375.       YUTM1(I)=(Y0(J+1,I)+Y0(J+2,I))/2.            !
  2376.       IF(ZNAK2(J+1,I).EQ.PF3)go to 39
  2377.       DELTAC=DELTA(J,I)*HAG*HH2(J,I)/H0(J,I)
  2378.       GO TO 31
  2379.       ELSE
  2380.       END IF
  2381.  
  2382.   39  J=J+1
  2383.       IF(J.GE.N1)GO TO 10
  2384.       GO TO 33
  2385.  
  2386.    31 CONTINUE
  2387.       XCOSTA(I)=XCOSTA(I)+DELTAC
  2388.       IF(IPRT(14).EQ.1)WRITE(1,5)I,XCOSTA(I),XUTM1(I),YUTM1(I)
  2389.   10  CONTINUE
  2390.       CLOSE (1)
  2391.  
  2392. C---------------------- COSTA MERIDIANAL --------------
  2393.  
  2394.       OPEN (1,FILE=LITOP//'CCHANGY.DAT')
  2395.  
  2396.       DO 1 J=1,N1           ! NODOS 1-M1
  2397. C BUSQUEDA DE LA COSTA
  2398.       DELTAC=0.
  2399.       I=1
  2400.       IF(H(J,I).EQ.PF)GO TO 320
  2401.       GO TO 330
  2402.   320 IF(H(J,I).EQ.PF.AND.H(J,I+1).NE.PF)THEN
  2403.       XUTM2(J)=(X0(J,I)+X0(J,I-1))/2.              ! FUE X0(J,I)
  2404.       YUTM2(J)=(Y0(J,I)+Y0(J,I-1))/2.
  2405.       IF(ZNAK2(J,I).EQ.PF3)go to 380
  2406.       DELTAC=DELTA(J,I+1)*HAG*HH1(J,I+1)/H0(J,I+1)
  2407.       GO TO 310
  2408.       ELSE
  2409.       END IF
  2410.  
  2411.   380 I=I+1
  2412.       IF(I.GE.M1)GO TO 310
  2413.       GO TO 320
  2414.  
  2415.   330 IF(H(J,I).NE.PF.AND.H(J,I+1).EQ.PF)THEN
  2416.       XUTM2(J)=(X0(J,I+1)+X0(J,I+2))/2.             ! FUE X0(J,I+1)
  2417.       YUTM2(J)=(Y0(J,I+1)+Y0(J,I+2))/2.             !
  2418.       IF(ZNAK2(J,I+1).EQ.PF3)go to 390
  2419.       DELTAC=DELTA(J,I)*HAG*HH1(J,I)/H0(J,I)
  2420.       GO TO 310
  2421.       ELSE
  2422.       END IF
  2423.  
  2424.   390 I=I+1
  2425.       IF(I.GE.M1)GO TO 1
  2426.       GO TO 330
  2427.  
  2428.   310 CONTINUE
  2429.       YCOSTA(J)=YCOSTA(J)+DELTAC
  2430.       IF(IPRT(14).EQ.1)WRITE(1,5)J,YCOSTA(J),XUTM2(J),YUTM2(J)
  2431.   1   CONTINUE
  2432.       CLOSE (1)
  2433.  
  2434.       RETURN
  2435.       END
  2436.  
  2437.  
  2438.       SUBROUTINE LIMIT_S
  2439.  
  2440. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 2.1, 2000
  2441.  
  2442.       INCLUDE 'COMML.FOR'
  2443.  
  2444.       DO 1 I=1,M
  2445.       DO 1 J=1,N
  2446.       QMOD=SQRT(QTX(J,I)**2+QTY(J,I)**2)
  2447.       IF(QMOD.EQ.0.)GO TO 1
  2448.       QMOD1=AMIN1(QMOD,QLIM)
  2449.       QTX(J,I)=QTX(J,I)*QMOD1/QMOD
  2450.       QTY(J,I)=QTY(J,I)*QMOD1/QMOD
  2451.   1   CONTINUE
  2452.  
  2453.       RETURN
  2454.       END
  2455.  
  2456.  
  2457.       SUBROUTINE SLOPE
  2458.  
  2459. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 2.1, 2000
  2460.  
  2461.       INCLUDE 'COMML.FOR'
  2462.       INCLUDE 'VARS.INC'
  2463.  
  2464.       DO 1 I=2,M
  2465.  
  2466.  
  2467.       DO 1 I=2,M
  2468.       DO 1 J=2,N
  2469.       IF(H(J,I).EQ.PF)GO TO 1
  2470.       HOP1=H(J,I+1)
  2471.       IF(HOP1.EQ.PF)HOP1=0.
  2472.       HOP2=H(J,I-1)
  2473.       IF(HOP2.EQ.PF)HOP2=0.
  2474.       HOP3=H(J+1,I)
  2475.       IF(HOP3.EQ.PF)HOP3=0.
  2476.       HOP4=H(J-1,I)
  2477.       IF(HOP4.EQ.PF)HOP4=0.
  2478.       ANGX=0.
  2479.       ANGY=0.
  2480.  
  2481.       IF(X0(J,I+1).EQ.XLIM)GO TO 2
  2482.       IF(X0(J,I-1).EQ.XLIM)GO TO 2
  2483.       IF(IXYP.EQ.1)ANGX=(HOP1-HOP2)/(X0(J,I+1)-X0(J,I-1))
  2484.       IF(IXYP.EQ.2)ANGX=(HOP1-HOP2)/(Y0(J,I+1)-Y0(J,I-1))
  2485.    2  IF(Y0(J+1,I).EQ.YLIM)GO TO 3
  2486.       IF(Y0(J-1,I).EQ.YLIM)GO TO 3
  2487.       IF(IXYP.EQ.1)ANGY=(HOP3-HOP4)/(Y0(J+1,I)-Y0(J-1,I))
  2488.       IF(IXYP.EQ.2)ANGY=(HOP3-HOP4)/(X0(J+1,I)-X0(J-1,I))
  2489.  
  2490.    3  BOTANGL(J,I)=AMAX1(abs(ANGX),abs(ANGY))
  2491.  
  2492.    1  CONTINUE
  2493.  
  2494.       OPEN (13,FILE=LITOP//'SLOPE.DAT')
  2495.       DO 4 J=1,N1
  2496.       DO 4 I=1,M1
  2497.       IF(X0(J,I).EQ.XLIM.OR.Y0(J,I).EQ.YLIM)GO TO 4
  2498.       WRITE(13,*)X0(J,I),Y0(J,I),BOTANGL(J,I)
  2499.    4  CONTINUE
  2500.       CLOSE (13)
  2501.       RETURN
  2502.       END
  2503.  
  2504.  
  2505.       SUBROUTINE SLOPE1(I,J,SUMUDX,SUMUDY,SUMUDR)
  2506.  
  2507. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 2.1, 2001
  2508.  
  2509.       INCLUDE 'COMML.FOR'
  2510.  
  2511.       KB=1.
  2512.       ANGX=0.
  2513.       ANGY=0.
  2514.       IF(ISLOP.EQ.0)RETURN
  2515.  
  2516.       IP=MIN0(I+1,M)
  2517.       IM1=MAX0(I-1,1)
  2518.       JP=MIN0(J+1,N)
  2519.      JM1=MAX0(J-1,1)
  2520.  
  2521.       HOP1=H1(J,IP)
  2522.       IF(HL(J,IP).EQ.PF)HOP1=0.
  2523.       HOP2=H1(J,IM1)
  2524.       IF(HL(J,IM1).EQ.PF)HOP2=0.
  2525.       HOP3=H1(JP,I)
  2526.       IF(HL(JP,I).EQ.PF)HOP3=0.
  2527.       HOP4=H1(JM1,I)
  2528.       IF(HL(JM1,I).EQ.PF)HOP4=0.
  2529.  
  2530.       IF(X(J,IP).EQ.XLIM)GO TO 2
  2531.       IF(X(J,IM1).EQ.XLIM)GO TO 2
  2532.       IF(IXYP.EQ.1)ANGX=(HOP1-HOP2)/(X(J,IP)-X(J,IM1))
  2533.       IF(IXYP.EQ.2)ANGX=(HOP1-HOP2)/(Y(J,IP)-Y(J,IM1))
  2534.    2  IF(Y(JP,I).EQ.YLIM)GO TO 3
  2535.       IF(Y(JM1,I).EQ.YLIM)GO TO 3
  2536.       IF(IXYP.EQ.1)ANGY=(HOP3-HOP4)/(Y(JP,I)-Y(JM1,I))
  2537.       IF(IXYP.EQ.2)ANGY=(HOP3-HOP4)/(X(JP,I)-X(JM1,I))
  2538.    3  CONTINUE
  2539.       BETAF=-(SUMUDX*ANGX+SUMUDY*ANGY)/SUMUDR
  2540.       KB=SIN(TANTETA+BETAF)/SIN(TANTETA)
  2541.       AS=ATAN(TANTETA)/COS(BETAF)/(ATAN(TANTETA)+ATAN(BETAF))*2.   ! 2. -artific. parameter (adjustment)
  2542.       RETURN
  2543.       END
  2544.  
  2545.       SUBROUTINE BOUND
  2546.  
  2547. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 2.1, 2001
  2548.       INCLUDE 'COMML.FOR'
  2549. c---------------- eastern and western bounds -----
  2550.       DO 1 J=2,N
  2551.       if(h(j,M1).eq.pf)go to 1
  2552.       IF(ITB.EQ.1)THEN
  2553.       PSI(J,M1)=PSI(j,m)*2.-psi(j,m-1)
  2554.       PSI0(J,M1)=PSI(j,m)*2.-psi(j,m-1)
  2555.       ELSE
  2556.       PSI(J,M1)=PSI(j,m)
  2557.       PSI0(J,M1)=PSI(j,m)
  2558.       END IF
  2559.   1   continue
  2560.       DO 4 J=2,N
  2561.       if(h(j,1).eq.pf)go to 4
  2562.       IF(ITB.EQ.1)THEN
  2563.       PSI(J,1)=PSI(j,2)*2.-psi(j,3)
  2564.       PSI0(J,1)=PSI(j,2)*2.-psi(j,3)
  2565.       ELSE
  2566.       PSI(J,1)=PSI(j,2)
  2567.       PSI0(J,1)=PSI(j,2)
  2568.       END IF
  2569.   4   continue
  2570. c---------------- southern-nothern bounds -----
  2571.       DO 3 i=2,M
  2572.       if(h(1,i).eq.pf)go to 2
  2573.       IF(ITB.EQ.1)THEN
  2574.       PSI(1,I)=PSI(2,I)*2.-PSI(3,I)
  2575.       PSI0(1,I)=PSI(2,I)*2.-PSI(3,I)
  2576.       ELSE
  2577.       PSI(1,I)=PSI(2,I)
  2578.       PSI0(1,I)=PSI(2,I)
  2579.       END IF
  2580.   2   continue
  2581.       if(h(N1,i).eq.pf)go to 3
  2582.       IF(ITB.EQ.1)THEN
  2583.       PSI(N1,I)=PSI(N,I)*2.-PSI(N-1,I)
  2584.       PSI0(N1,I)=PSI(N,I)*2.-PSI(N-1,I)
  2585.       ELSE
  2586.       PSI(N1,I)=PSI(N,I)
  2587.       PSI0(N1,I)=PSI(N,I)
  2588.       END IF
  2589.   3   continue
  2590. C--------------- COSMETICS --------------------
  2591.       IF(H(1,M1).NE.PF)PSI(1,M1)=PSI(1,M)+PSI(2,M1)-PSI(2,M)
  2592.       IF(H(N1,M1).NE.PF)PSI(N1,M1)=PSI(N1,M)+PSI(N,M1)-PSI(N,M)
  2593.       IF(H(N1,1).NE.PF)PSI(N1,1)=PSI(N1,2)+PSI(N,1)-PSI(N,2)
  2594.       IF(H(1,1).NE.PF)PSI(1,1)=PSI(1,2)+PSI(2,1)-PSI(2,2)
  2595.       IF(H(1,M1).NE.PF)PSI0(1,M1)=PSI(1,M)+PSI(2,M1)-PSI(2,M)
  2596.       IF(H(N1,M1).NE.PF)PSI0(N1,M1)=PSI(N1,M)+PSI(N,M1)-PSI(N,M)
  2597.       IF(H(N1,1).NE.PF)PSI0(N1,1)=PSI(N1,2)+PSI(N,1)-PSI(N,2)
  2598.       IF(H(1,1).NE.PF)PSI0(1,1)=PSI(1,2)+PSI(2,1)-PSI(2,2)
  2599. C-------------------------------------------------
  2600.       IF(UNI.EQ.0.)RETURN
  2601.  
  2602.       DO 10 I=2,M1
  2603.       DO 10 J=2,N1
  2604.       IF(ZNAK1(J,I).EQ.PF1.AND.ZNAK1(J-1,I).NE.PF1)VALOR=PSI(J-1,I)
  2605.   10  CONTINUE
  2606.  
  2607.       DO 11 I=2,M1
  2608.       DO 11 J=2,N1
  2609.       IF(ZNAK1(J,I).EQ.PF1)PSI(J,I)=VALOR
  2610.   11  CONTINUE
  2611.  
  2612.       RETURN
  2613.       END
  2614.  
  2615.  
  2616.       SUBROUTINE SMOOTH
  2617. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 2.2, 2001
  2618.       INCLUDE 'COMML.FOR'
  2619.       REAL HS(400,400),HS1(400,400)
  2620.  
  2621.       IF(M1.GT.400)STOP'Cambiar M1 en SMOOTH'
  2622.       IF(N1.GT.400)STOP'Cambiar N1 en SMOOTH'
  2623.       DO I=1,M1
  2624.       DO J=1,N1
  2625.       HS(J,I)=H(J,I)
  2626.       IF(HS(J,I).EQ.PF)HS(J,I)=0.
  2627.       END DO
  2628.       END DO
  2629.  
  2630.       DO 4 I=2,M
  2631.       DO 4 J=2,N
  2632.       IF(HS(J,I).eq.0.)go to 4
  2633.       HS1(J,I)=HS(J,I)
  2634.       IF(ZNAK2(J+1,I).EQ.PF3.OR.ZNAK2(J-1,I).EQ.PF3.OR.ZNAK2(J,I-1).
  2635.      & EQ.PF3.OR.
  2636.      & ZNAK2(J,I+1).EQ.PF3.OR.ZNAK2(J+1,I+1).EQ.PF3.OR.ZNAK2(J+1,I-1).
  2637.      & EQ.PF3.OR.
  2638.      & ZNAK2(J-1,I+1).EQ.PF3.OR.ZNAK2(J-1,I-1).EQ.PF3)GO TO 4
  2639.  
  2640.       IF(H(J+1,I).EQ.PF.OR.H(J-1,I).EQ.PF.OR.H(J,I-1).       !
  2641.      & EQ.PF.OR.                                             !
  2642.      & H(J,I+1).EQ.PF.OR.H(J+1,I+1).EQ.PF.OR.H(J+1,I-1).     !  VSTAVKA !!!
  2643.      & EQ.PF.OR.                                             !
  2644.      & H(J-1,I+1).EQ.PF.OR.H(J-1,I-1).EQ.PF)GO TO 4          !
  2645.  
  2646.       HS1(J,I)=0.4*HS(J,I)+0.1*(HS(J+1,I)+HS(J-1,I)+HS(J,I-1)+
  2647.      & HS(J,I+1))+0.05*(HS(J+1,I+1)+HS(J-1,I+1)+HS(J+1,I-1)+
  2648.      & HS(J-1,I-1))
  2649.       HS1(J,I)=AMAX1(HS1(J,I),DMIN)
  2650.    4  CONTINUE
  2651.  
  2652.       DO 5 I=2,M
  2653.       DO 5 J=2,N
  2654.       IF(H(J,I).EQ.PF)GO TO 5
  2655.       H(J,I)=HS1(J,I)*WEIGHT+(1.-WEIGHT)*H(J,I)
  2656.    5  CONTINUE
  2657.  
  2658.       RETURN
  2659.       END
  2660.  
  2661.       subroutine inic
  2662.       include 'VARS.INC'
  2663. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 2.2, 2001
  2664.       open (1,file=LITOP//'monitor.dat')
  2665.       write(1,*)'0'
  2666.       close (1)
  2667.       return
  2668.       end
  2669.  
  2670.  
  2671.  
  2672.       SUBROUTINE INTERP1
  2673. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 2.2, 2001
  2674.  
  2675.       INCLUDE 'COMML.FOR'
  2676.       INCLUDE 'VARS.INC'
  2677.       REAL X00(160000),Y00(160000),HI(160000),R(160000),XN(160000)
  2678.      & ,YN(160000),HN(160000),A(160000)
  2679.  
  2680.       IF(IAUTO.EQ.0)THEN
  2681.       RMIN0=HAG
  2682.       RMIN1=HAG
  2683.       L5=5
  2684.       ELSE
  2685.       END IF
  2686.  
  2687.       L0=0
  2688.       DO I=1,M
  2689.       DO J=1,N
  2690.       L0=L0+1
  2691.       X00(L0)=X(J,I)
  2692.       Y00(L0)=Y(J,I)
  2693.       HI(L0)=H1(J,I)
  2694.       END DO
  2695.       END DO
  2696.       IF(L0.GT.160000)STOP'Cambiar dimensiones en INTERP1'
  2697. C------------------------------------------------------
  2698.       DO 33 II=1,NPERF1
  2699.       DO 3 JJ=1,NP(II)
  2700.       rmin=rmin0
  2701.       XI=XPP(II,JJ)
  2702.       YI=YPP(II,JJ)
  2703. c ---- Determination of the weights --------
  2704.  800  LL=0
  2705.       DO 20 k=1,L0
  2706.       R0=SQRT((XI-X00(k))*(XI-X00(k))+(YI-Y00(k))*(YI-Y00(k)))
  2707.       IF(R0.GT.RMIN)GO TO 20
  2708.       LL=LL+1
  2709.       R(LL)=R0
  2710.       XN(LL)=X00(K)
  2711.       YN(LL)=Y00(K)
  2712.       HN(LL)=HI(K)
  2713.  20   continue
  2714.       IF(LL.LT.L5)THEN
  2715.       RMIN=RMIN+RMIN1
  2716.       GO TO 800
  2717.       ELSE
  2718.       END IF
  2719.       NNN=LL
  2720.  
  2721.       j=0
  2722.       do 22 k1=1,NNN
  2723.       do 22 k=1,NNN
  2724.       j=j+1
  2725.       A(j)=Sqrt((Xn(k1)-Xn(k))*(Xn(k1)-Xn(k))+(Yn(k1)-Yn(k))*
  2726.      *(Yn(k1)-Yn(k)))
  2727.  22   continue
  2728.  
  2729.       CALL GELG(R,A,NNN,1,.1e-06,IER)
  2730.       R1=0.
  2731.       R2=0.
  2732.       DO 2 k=1,NNN
  2733.       R1=R1+R(k)*HN(k)
  2734.       R2=R2+R(k)
  2735.    2  continue
  2736.       HPERF(II,JJ)=-R1/R2
  2737.    3  continue
  2738.   33  continue
  2739. c----------------------------------------------------------
  2740.       OPEN (1,FILE=LITOP//'PERFILD.DAT')
  2741.       WRITE(1,*)NPERF1
  2742.       DO II=1,NPERF1
  2743.       WRITE(1,*)NP(II)
  2744.       DO JJ=1,NP(II)
  2745.       WRITE(1,*)XPP(II,JJ),YPP(II,JJ),HPERF(II,JJ)
  2746.       END DO
  2747.       END DO
  2748.       CLOSE (1)
  2749. c----------------------------------------------------------
  2750.       if(IER.eq.-1)write(*,*)
  2751.      *'NO RESULT BECAUSE OF M LESS THAN 1 OR PIVOT ELEMENT AT ANY',
  2752.      *'ELIMINATION STEP EQUAL TO 0'
  2753.       if(ier.eq.0.or.ier.eq.-1)go to 110
  2754.       write(*,*)'IER=K= ',IER,'WARNING DUE TO POSSIBLE LOSS OF',
  2755.      *'SIGNIFICANCE INDICATED AT ELIMINATION STEP K+1, WHERE PILOT',
  2756.      *'ELEMENT WAS LESS THAN OR EQUAL TO THE INTERNAL TOLERANCE EPS',
  2757.      *'TIMES ABSOLUTELY GREATEST ELEMENT OF MATRIX A.'
  2758.       PAUSE
  2759.  110  continue
  2760.  
  2761.       RETURN
  2762.       END
  2763. C     ..................................................................
  2764. C
  2765. C        SUBROUTINE GELG
  2766. C
  2767. C        PURPOSE
  2768. C           TO SOLVE A GENERAL SYSTEM OF SIMULTANEOUS LINEAR EQUATIONS.
  2769. C
  2770. C        USAGE
  2771. C           CALL GELG(R,A,M,N,EPS,IER)
  2772. C
  2773. C        DESCRIPTION OF PARAMETERS
  2774. C           R      - THE M BY N MATRIX OF RIGHT HAND SIDES.  (DESTROYED)
  2775. C                    ON RETURN R CONTAINS THE SOLUTION OF THE EQUATIONS.
  2776. C           A      - THE M BY M COEFFICIENT MATRIX.  (DESTROYED)
  2777. C           M      - THE NUMBER OF EQUATIONS IN THE SYSTEM.
  2778. C           N      - THE NUMBER OF RIGHT HAND SIDE VECTORS.
  2779. C           EPS    - AN INPUT CONSTANT WHICH IS USED AS RELATIVE
  2780. C                    TOLERANCE FOR TEST ON LOSS OF SIGNIFICANCE.
  2781. C           IER    - RESULTING ERROR PARAMETER CODED AS FOLLOWS
  2782. C                    IER=0  - NO ERROR,
  2783. C                    IER=-1 - NO RESULT BECAUSE OF M LESS THAN 1 OR
  2784. C                             PIVOT ELEMENT AT ANY ELIMINATION STEP
  2785. C                             EQUAL TO 0,
  2786. C                    IER=K  - WARNING DUE TO POSSIBLE LOSS OF SIGNIFI-
  2787. C                             CANCE INDICATED AT ELIMINATION STEP K+1,
  2788. C                             WHERE PIVOT ELEMENT WAS LESS THAN OR
  2789. C                             EQUAL TO THE INTERNAL TOLERANCE EPS TIMES
  2790. C                             ABSOLUTELY GREATEST ELEMENT OF MATRIX A.
  2791. C
  2792. C        REMARKS
  2793. C           INPUT MATRICES R AND A ARE ASSUMED TO BE STORED COLUMNWISE
  2794. C           IN M*N RESP. M*M SUCCESSIVE STORAGE LOCATIONS. ON RETURN
  2795. C           SOLUTION MATRIX R IS STORED COLUMNWISE TOO.
  2796. C           THE PROCEDURE GIVES RESULTS IF THE NUMBER OF EQUATIONS M IS
  2797. C           GREATER THAN 0 AND PIVOT ELEMENTS AT ALL ELIMINATION STEPS
  2798. C           ARE DIFFERENT FROM 0. HOWEVER WARNING IER=K - IF GIVEN -
  2799. C           INDICATES POSSIBLE LOSS OF SIGNIFICANCE. IN CASE OF A WELL
  2800. C           SCALED MATRIX A AND APPROPRIATE TOLERANCE EPS, IER=K MAY BE
  2801. C           INTERPRETED THAT MATRIX A HAS THE RANK K. NO WARNING IS
  2802. C           GIVEN IN CASE M=1.
  2803. C
  2804. C        SUBROUTINES AND FUNCTION SUBPROGRAMS REQUIRED
  2805. C           NONE
  2806. C
  2807. C        METHOD
  2808. C           SOLUTION IS DONE BY MEANS OF GAUSS-ELIMINATION WITH
  2809. C           COMPLETE PIVOTING.
  2810. C
  2811. C     ..................................................................
  2812. C
  2813.       SUBROUTINE GELG(R,A,M,N,EPS,IER)
  2814.       INCLUDE 'VARS.INC'
  2815. C
  2816. C
  2817.       dimension R(1),A(1)
  2818.  
  2819.       IF(M)23,23,1
  2820. C
  2821. C     SEARCH FOR GREATEST ELEMENT IN MATRIX A
  2822.     1 IER=0
  2823.       PIV=0.
  2824.       MM=M*M
  2825.       NM=N*M
  2826.       DO 3 L=1,MM
  2827.       TB=ABS(A(L))
  2828.       IF(TB-PIV)3,3,2
  2829.     2 PIV=TB
  2830.       I=L
  2831.     3 CONTINUE
  2832.       TOL=EPS*PIV
  2833. C     A(I) IS PIVOT ELEMENT. PIV CONTAINS THE ABSOLUTE VALUE OF A(I).
  2834. C
  2835. C
  2836. C     START ELIMINATION LOOP
  2837.       LST=1
  2838.       DO 17 K=1,M
  2839. C
  2840. C     TEST ON SINGULARITY
  2841.       IF(PIV)23,23,4
  2842.     4 IF(IER)7,5,7
  2843.     5 IF(PIV-TOL)6,6,7
  2844.     6 IER=K-1
  2845.     7 PIVI=1./A(I)
  2846.       J=(I-1)/M
  2847.       I=I-J*M-K
  2848.       J=J+1-K
  2849. C     I+K IS ROW-INDEX, J+K COLUMN-INDEX OF PIVOT ELEMENT
  2850. C
  2851. C     PIVOT ROW REDUCTION AND ROW INTERCHANGE IN RIGHT HAND SIDE R
  2852.       DO 8 L=K,NM,M
  2853.       LL=L+I
  2854.       TB=PIVI*R(LL)
  2855.       R(LL)=R(L)
  2856.     8 R(L)=TB
  2857. C
  2858. C     IS ELIMINATION TERMINATED
  2859.       IF(K-M)9,18,18
  2860. C
  2861. C     COLUMN INTERCHANGE IN MATRIX A
  2862.     9 LEND=LST+M-K
  2863.       IF(J)12,12,10
  2864.    10 II=J*M
  2865.       DO 11 L=LST,LEND
  2866.       TB=A(L)
  2867.       LL=L+II
  2868.       A(L)=A(LL)
  2869.    11 A(LL)=TB
  2870. C
  2871. C     ROW INTERCHANGE AND PIVOT ROW REDUCTION IN MATRIX A
  2872.    12 DO 13 L=LST,MM,M
  2873.       LL=L+I
  2874.       TB=PIVI*A(LL)
  2875.       A(LL)=A(L)
  2876.    13 A(L)=TB
  2877. C
  2878. C     SAVE COLUMN INTERCHANGE INFORMATION
  2879.       A(LST)=J
  2880. C
  2881. C     ELEMENT REDUCTION AND NEXT PIVOT SEARCH
  2882.       PIV=0.
  2883.       LST=LST+1
  2884.       J=0
  2885.       DO 16 II=LST,LEND
  2886.       PIVI=-A(II)
  2887.       IST=II+M
  2888.       J=J+1
  2889.       DO 15 L=IST,MM,M
  2890.       LL=L-J
  2891.       A(L)=A(L)+PIVI*A(LL)
  2892.       TB=ABS(A(L))
  2893.       IF(TB-PIV)15,15,14
  2894.    14 PIV=TB
  2895.       I=L
  2896.    15 CONTINUE
  2897.       DO 16 L=K,NM,M
  2898.       LL=L+J
  2899.    16 R(LL)=R(LL)+PIVI*R(L)
  2900.    17 LST=LST+M
  2901. C     END OF ELIMINATION LOOP
  2902. C     BACK SUBSTITUTION AND BACK INTERCHANGE
  2903.    18 IF(M-1)23,22,19
  2904.    19 IST=MM+M
  2905.       LST=M+1
  2906.       DO 21 I=2,M
  2907.       II=LST-I
  2908.       IST=IST-LST
  2909.       L=IST-M
  2910.       L=A(L)+.5
  2911.       DO 21 J=II,NM,M
  2912.       TB=R(J)
  2913.       LL=J
  2914.       DO 20 K=IST,MM,M
  2915.       LL=LL+1
  2916.    20 TB=TB-A(K)*R(LL)
  2917.       K=J+L
  2918.       R(J)=R(K)
  2919.    21 R(K)=TB
  2920.    22 RETURN
  2921. C     ERROR RETURN
  2922.    23 IER=-1
  2923.       RETURN
  2924.       END
  2925.  
  2926.  
  2927.       SUBROUTINE SMOOTHW
  2928. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 2.2, 2001
  2929.       INCLUDE 'COMML.FOR'
  2930.       REAL HS(400,400),HS1(400,400)
  2931.  
  2932.       IF(M.GT.399)STOP'Cambiar M en SMOOTHW'
  2933.       IF(N.GT.399)STOP'Cambiar N en SMOOTHW'
  2934.       WEIGH1=WEIGHTW       ! PESOS
  2935.       DO 1 LTIME=1,KRATSW  ! VECES
  2936.  
  2937.       DO K=1,ICOMP             ! COMPONENTES
  2938.  
  2939.       DO I=1,M
  2940.       DO J=1,N
  2941.       IF(K.EQ.1)HS(J,I)=UORB(J,I)
  2942.       IF(K.EQ.2)HS(J,I)=FX(J,I)
  2943.       IF(K.EQ.3)HS(J,I)=FY(J,I)
  2944.       IF(K.EQ.4)HS(J,I)=HW(J,I)
  2945.       IF(K.EQ.5)HS(J,I)=FLAMB(J,I)
  2946.  
  2947.       IF(H1(J,I).EQ.0.)HS(J,I)=0.
  2948.       END DO
  2949.       END DO
  2950.  
  2951.       DO 4 I=2,M-1
  2952.       DO 4 J=2,N-1
  2953.       IF(H1(J,I).eq.0.)go to 4
  2954.       HS1(J,I)=HS(J,I)
  2955.  
  2956. C     IF(H1(J+1,I).EQ.0..OR.H1(J-1,I).EQ.0..OR.H1(J,I-1).       !
  2957. C    & EQ.0..OR.                                             !
  2958. C    & H1(J,I+1).EQ.0..OR.H1(J+1,I+1).EQ.0..OR.H1(J+1,I-1).     !  VSTAVKA !!!
  2959. C    & EQ.0..OR.                                             !
  2960. C    & H1(J-1,I+1).EQ.0..OR.H1(J-1,I-1).EQ.0.)GO TO 4          !
  2961.  
  2962.       HS1(J,I)=0.4*HS(J,I)+0.1*(HS(J+1,I)+HS(J-1,I)+HS(J,I-1)+
  2963.      & HS(J,I+1))+0.05*(HS(J+1,I+1)+HS(J-1,I+1)+HS(J+1,I-1)+
  2964.      & HS(J-1,I-1))
  2965.    4  CONTINUE
  2966.  
  2967.       DO I=2,M
  2968.       IF(H1(1,I).NE.0.)HS1(1,I)=HS1(2,I)
  2969.       IF(H1(N,I).NE.0.)HS1(N,I)=HS1(N-1,I)
  2970.       END DO
  2971.       DO J=2,N
  2972.       IF(H1(J,1).NE.0.)HS1(J,1)=HS1(J,2)
  2973.       IF(H1(J,M).NE.0.)HS1(J,M)=HS1(J,M-1)
  2974.       END DO
  2975.       IF(H1(1,1).NE.0.)HS1(1,1)=HS1(1,2)+HS1(2,1)-HS1(2,2)
  2976.       IF(H1(1,M).NE.0.)HS1(1,M)=HS1(1,M-1)+HS1(2,M)-HS1(2,M-1)
  2977.       IF(H1(N,1).NE.0.)HS1(N,1)=HS1(N-1,1)+HS1(N,2)-HS1(N-1,2)
  2978.       IF(H1(N,M).NE.0.)HS1(N,M)=HS1(N-1,M)+HS1(N,M-1)-HS1(N-1,M-1)
  2979.  
  2980.  
  2981.       DO 5 I=2,M
  2982.       DO 5 J=2,N
  2983.       IF(H1(J,I).EQ.0.)GO TO 5
  2984.       IF(K.EQ.1)UORB(J,I)=HS1(J,I)*WEIGH1+UORB(J,I)*(1.-WEIGH1)
  2985.       IF(K.EQ.2)FX(J,I)=HS1(J,I)*WEIGH1+FX(J,I)*(1.-WEIGH1)
  2986. IF(K.EQ.3)FY(J,I)=HS1(J,I)*WEIGH1+FY(J,I)*(1.-WEIGH1)
  2987.       IF(K.EQ.4)HW(J,I)=HS1(J,I)*WEIGH1+HW(J,I)*(1.-WEIGH1)
  2988.       IF(K.EQ.5)FLAMB(J,I)=HS1(J,I)*WEIGH1+FLAMB(J,I)*(1.-WEIGH1)
  2989.    5  CONTINUE
  2990.  
  2991.       END DO
  2992.  
  2993.    1  CONTINUE
  2994.       RETURN
  2995.       END
  2996.  
  2997.  
  2998.       SUBROUTINE PRNH
  2999. c     Elaborado por Serguei A. Lonin, 1999-2000 Version 2.2, 2001
  3000.       INCLUDE 'COMML.FOR'
  3001.       INCLUDE 'VARS.INC'
  3002.  
  3003.       OPEN (1,FILE=LITOP//'BOT0.DAT')
  3004.  
  3005.       DO 8 J=1,N1
  3006.       DO 8 I=1,M1
  3007.       IF(X0(J,I).EQ.XLIM)GO TO 8
  3008.       if(h0(j,i).eq.pf)go to 8
  3009.       IF(IPRT(5).EQ.1)WRITE(1,*)X0(J,I),Y0(J,I),H0(J,I)
  3010.   8   continue
  3011.       RETURN
  3012.       END
Advertisement
Add Comment
Please, Sign In to add comment