/[lmdze]/trunk/Sources/dyn3d/fxhyp.f
ViewVC logotype

Diff of /trunk/Sources/dyn3d/fxhyp.f

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 82 by guez, Wed Mar 5 14:57:53 2014 UTC revision 124 by guez, Thu Feb 5 15:19:37 2015 UTC
# Line 4  module fxhyp_m Line 4  module fxhyp_m
4    
5  contains  contains
6    
7    SUBROUTINE fxhyp(xzoomdeg, grossism, dzooma, tau, rlonm025, xprimm025, &    SUBROUTINE fxhyp(xprimm025, rlonv, xprimv, rlonu, xprimu, xprimp025)
        rlonv, xprimv, rlonu, xprimu, rlonp025, xprimp025, champmin, champmax)  
8    
9      ! From LMDZ4/libf/dyn3d/fxhyp.F, v 1.2 2005/06/03 09:11:32 fairhead      ! From LMDZ4/libf/dyn3d/fxhyp.F, version 1.2, 2005/06/03 09:11:32
10        ! Author: P. Le Van, from formulas by R. Sadourny
     ! Auteur : P. Le Van  
11    
12      ! Calcule les longitudes et dérivées dans la grille du GCM pour      ! Calcule les longitudes et dérivées dans la grille du GCM pour
13      ! une fonction f(x) à tangente hyperbolique.      ! une fonction f(x) à dérivée tangente hyperbolique.
   
     ! On doit avoir grossism \times dzoom < pi (radians), en longitude.  
   
     USE dimens_m, ONLY: iim  
     USE paramet_m, ONLY: iip1  
   
     INTEGER nmax, nmax2  
     PARAMETER (nmax = 30000, nmax2 = 2*nmax)  
   
     LOGICAL scal180  
     PARAMETER (scal180 = .TRUE.)  
14    
15      ! scal180 = .TRUE. si on veut avoir le premier point scalaire pour      ! Il vaut mieux avoir : grossismx \times dzoom < pi
     ! une grille reguliere (grossism = 1., tau=0., clon=0.) a -180. degres.  
     ! sinon scal180 = .FALSE.  
16    
17      ! ...... arguments d'entree .......      ! Le premier point scalaire pour une grille regulière (grossismx =
18        ! 1., taux=0., clon=0.) est à - 180 degrés.
19    
20      REAL xzoomdeg, dzooma, tau, grossism      USE dimens_m, ONLY: iim
21      ! grossism etant le grossissement (= 2 si 2 fois, = 3 si 3 fois, etc.)      use fxhyp_loop_ik_m, only: fxhyp_loop_ik, nmax
22      ! dzooma etant la distance totale de la zone du zoom      use nr_util, only: pi, pi_d, twopi_d, arth
23      ! tau la raideur de la transition de l'interieur a l'exterieur du zoom      use principal_cshift_m, only: principal_cshift
24        use serre, only: clon, grossismx, dzoomx, taux
     ! ...... arguments de sortie ......  
   
     REAL rlonm025(iip1), xprimm025(iip1), rlonv(iip1), xprimv(iip1), &  
          rlonu(iip1), xprimu(iip1), rlonp025(iip1), xprimp025(iip1)  
25    
26      ! .... variables locales ....      REAL, intent(out):: xprimm025(:), rlonv(:), xprimv(:) ! (iim + 1)
27        real, intent(out):: rlonu(:), xprimu(:), xprimp025(:) ! (iim + 1)
28    
29        ! Local:
30        real rlonm025(iim + 1), rlonp025(iim + 1)
31      REAL dzoom      REAL dzoom
32      DOUBLE PRECISION xlon(iip1), xprimm(iip1), xuv      real d_rlonv(iim)
33      DOUBLE PRECISION xtild(0:nmax2)      DOUBLE PRECISION xtild(0:2 * nmax)
34      DOUBLE PRECISION fhyp(0:nmax2), ffdx, beta, Xprimt(0:nmax2)      DOUBLE PRECISION fhyp(nmax:2 * nmax), ffdx, beta, Xprimt(0:2 * nmax)
35      DOUBLE PRECISION Xf(0:nmax2), xxpr(0:nmax2)      DOUBLE PRECISION Xf(0:2 * nmax), xxpr(2 * nmax)
36      DOUBLE PRECISION xvrai(iip1), xxprim(iip1)      DOUBLE PRECISION xzoom, fa, fb
37      DOUBLE PRECISION pi, depi, epsilon, xzoom, fa, fb      INTEGER i, is2
38      DOUBLE PRECISION Xf1, Xfi, a0, a1, a2, a3, xi2      DOUBLE PRECISION xmoy, fxm
39      INTEGER i, it, ik, iter, ii, idif, ii1, ii2      DOUBLE PRECISION decalx
40      DOUBLE PRECISION xi, xo1, xmoy, xlon2, fxm, Xprimin  
41      DOUBLE PRECISION champmin, champmax, decalx      !----------------------------------------------------------------------
42      INTEGER is2  
43      SAVE is2      print *, "Call sequence information: fxhyp"
44    
45      DOUBLE PRECISION heavyside      dzoom = dzoomx * twopi_d
46        xtild = arth(- pi_d, pi_d / nmax, 2 * nmax + 1)
47      pi = 2. * ASIN(1.)  
48      depi = 2. * pi      ! Compute fhyp:
49      epsilon = 1.e-3      DO i = nmax, 2 * nmax
50      xzoom = xzoomdeg * pi/180.         fa = taux * (dzoom / 2. - xtild(i))
51           fb = xtild(i) * (pi_d - xtild(i))
52      decalx = .75  
53      IF(grossism.EQ.1..AND.scal180) THEN         IF (200. * fb < - fa) THEN
54         decalx = 1.            fhyp(i) = - 1.
55      ENDIF         ELSE IF (200. * fb < fa) THEN
56              fhyp(i) = 1.
     WRITE(6, *) 'FXHYP scal180, decalx', scal180, decalx  
   
     IF(dzooma.LT.1.) THEN  
        dzoom = dzooma * depi  
     ELSEIF(dzooma.LT. 25.) THEN  
        WRITE(6, *) ' Le param. dzoomx pour fxhyp est trop petit ! L augmenter et relancer ! '  
        STOP 1  
     ELSE  
        dzoom = dzooma * pi/180.  
     ENDIF  
   
     WRITE(6, *) ' xzoom(rad.), grossism, tau, dzoom (radians)'  
     WRITE(6, 24) xzoom, grossism, tau, dzoom  
   
     DO i = 0, nmax2  
        xtild(i) = - pi + FLOAT(i) * depi /nmax2  
     ENDDO  
   
     DO i = nmax, nmax2  
   
        fa = tau* (dzoom/2. - xtild(i))  
        fb = xtild(i) * (pi - xtild(i))  
   
        IF(200.* fb .LT. - fa) THEN  
           fhyp (i) = - 1.  
        ELSEIF(200. * fb .LT. fa) THEN  
           fhyp (i) = 1.  
57         ELSE         ELSE
58            IF(ABS(fa).LT.1.e-13.AND.ABS(fb).LT.1.e-13) THEN            IF (ABS(fa) < 1e-13 .AND. ABS(fb) < 1e-13) THEN
59               IF(200.*fb + fa.LT.1.e-10) THEN               IF (200. * fb + fa < 1e-10) THEN
60                  fhyp (i) = - 1.                  fhyp(i) = - 1.
61               ELSEIF(200.*fb - fa.LT.1.e-10) THEN               ELSE IF (200. * fb - fa < 1e-10) THEN
62                  fhyp (i) = 1.                  fhyp(i) = 1.
63               ENDIF               END IF
64            ELSE            ELSE
65               fhyp (i) = TANH (fa/fb)               fhyp(i) = TANH(fa / fb)
66            ENDIF            END IF
67         ENDIF         END IF
68         IF (xtild(i).EQ. 0.) fhyp(i) = 1.  
69         IF (xtild(i).EQ. pi) fhyp(i) = -1.         IF (xtild(i) == 0.) fhyp(i) = 1.
70           IF (xtild(i) == pi_d) fhyp(i) = -1.
71      ENDDO      END DO
72    
73      !c .... Calcul de beta ....      ! Calcul de beta
74    
75      ffdx = 0.      ffdx = 0.
76    
77      DO i = nmax +1, nmax2      DO i = nmax + 1, 2 * nmax
   
78         xmoy = 0.5 * (xtild(i-1) + xtild(i))         xmoy = 0.5 * (xtild(i-1) + xtild(i))
79         fa = tau* (dzoom/2. - xmoy)         fa = taux * (dzoom / 2. - xmoy)
80         fb = xmoy * (pi - xmoy)         fb = xmoy * (pi_d - xmoy)
81    
82         IF(200.* fb .LT. - fa) THEN         IF (200. * fb < - fa) THEN
83            fxm = - 1.            fxm = - 1.
84         ELSEIF(200. * fb .LT. fa) THEN         ELSE IF (200. * fb < fa) THEN
85            fxm = 1.            fxm = 1.
86         ELSE         ELSE
87            IF(ABS(fa).LT.1.e-13.AND.ABS(fb).LT.1.e-13) THEN            IF (ABS(fa) < 1e-13 .AND. ABS(fb) < 1e-13) THEN
88               IF(200.*fb + fa.LT.1.e-10) THEN               IF (200. * fb + fa < 1e-10) THEN
89                  fxm = - 1.                  fxm = - 1.
90               ELSEIF(200.*fb - fa.LT.1.e-10) THEN               ELSE IF (200. * fb - fa < 1e-10) THEN
91                  fxm = 1.                  fxm = 1.
92               ENDIF               END IF
93            ELSE            ELSE
94               fxm = TANH (fa/fb)               fxm = TANH(fa / fb)
95            ENDIF            END IF
96         ENDIF         END IF
97    
98         IF (xmoy.EQ. 0.) fxm = 1.         IF (xmoy == 0.) fxm = 1.
99         IF (xmoy.EQ. pi) fxm = -1.         IF (xmoy == pi_d) fxm = -1.
100    
101         ffdx = ffdx + fxm * (xtild(i) - xtild(i-1))         ffdx = ffdx + fxm * (xtild(i) - xtild(i-1))
102        END DO
103    
104      ENDDO      print *, "ffdx = ", ffdx
105        beta = (grossismx * ffdx - pi_d) / (ffdx - pi_d)
106      beta = (grossism * ffdx - pi) / (ffdx - pi)      print *, "beta = ", beta
107    
108      IF(2.*beta - grossism.LE. 0.) THEN      IF (2. * beta - grossismx <= 0.) THEN
109         WRITE(6, *) ' ** Attention ! La valeur beta calculee dans la routine fxhyp est mauvaise ! '         print *, 'Bad choice of grossismx, taux, dzoomx.'
110         WRITE(6, *)'Modifier les valeurs de grossismx, tau ou dzoomx ', &         print *, 'Decrease dzoomx or grossismx.'
             ' et relancer ! *** '  
111         STOP 1         STOP 1
112      ENDIF      END IF
   
     ! ..... calcul de Xprimt .....  
   
   
     DO i = nmax, nmax2  
        Xprimt(i) = beta + (grossism - beta) * fhyp(i)  
     ENDDO  
113    
114      DO i = nmax+1, nmax2      ! calcul de Xprimt
115         Xprimt(nmax2 - i) = Xprimt(i)      Xprimt(nmax:2 * nmax) = beta + (grossismx - beta) * fhyp
116      ENDDO      xprimt(:nmax - 1) = xprimt(2 * nmax:nmax + 1:- 1)
117    
118        ! Calcul de Xf
119    
120      ! ..... Calcul de Xf ........      DO i = nmax + 1, 2 * nmax
   
     Xf(0) = - pi  
   
     DO i = nmax +1, nmax2  
   
121         xmoy = 0.5 * (xtild(i-1) + xtild(i))         xmoy = 0.5 * (xtild(i-1) + xtild(i))
122         fa = tau* (dzoom/2. - xmoy)         fa = taux * (dzoom / 2. - xmoy)
123         fb = xmoy * (pi - xmoy)         fb = xmoy * (pi_d - xmoy)
124    
125         IF(200.* fb .LT. - fa) THEN         IF (200. * fb < - fa) THEN
126            fxm = - 1.            fxm = - 1.
127         ELSEIF(200. * fb .LT. fa) THEN         ELSE IF (200. * fb < fa) THEN
128            fxm = 1.            fxm = 1.
129         ELSE         ELSE
130            fxm = TANH (fa/fb)            fxm = TANH(fa / fb)
131         ENDIF         END IF
132    
133         IF (xmoy.EQ. 0.) fxm = 1.         IF (xmoy == 0.) fxm = 1.
134         IF (xmoy.EQ. pi) fxm = -1.         IF (xmoy == pi_d) fxm = -1.
135         xxpr(i) = beta + (grossism - beta) * fxm         xxpr(i) = beta + (grossismx - beta) * fxm
136        END DO
137    
138      ENDDO      xxpr(:nmax) = xxpr(2 * nmax:nmax + 1:- 1)
139    
140      DO i = nmax+1, nmax2      Xf(0) = - pi_d
        xxpr(nmax2-i+1) = xxpr(i)  
     ENDDO  
141    
142      DO i=1, nmax2      DO i=1, 2 * nmax - 1
143         Xf(i) = Xf(i-1) + xxpr(i) * (xtild(i) - xtild(i-1))         Xf(i) = Xf(i-1) + xxpr(i) * (xtild(i) - xtild(i-1))
144      ENDDO      END DO
145    
146      ! *****************************************************************      Xf(2 * nmax) = pi_d
147    
148        IF (grossismx == 1.) THEN
149           decalx = 1d0
150        else
151           decalx = 0.75d0
152        END IF
153    
154        xzoom = clon * pi_d / 180d0
155        call fxhyp_loop_ik(1, decalx, xf, xtild, Xprimt, xzoom, rlonm025(:iim), &
156             xprimm025(:iim), xuv = - 0.25d0)
157        call fxhyp_loop_ik(2, decalx, xf, xtild, Xprimt, xzoom, rlonv(:iim), &
158             xprimv(:iim), xuv = 0d0)
159        call fxhyp_loop_ik(3, decalx, xf, xtild, Xprimt, xzoom, rlonu(:iim), &
160             xprimu(:iim), xuv = 0.5d0)
161        call fxhyp_loop_ik(4, decalx, xf, xtild, Xprimt, xzoom, rlonp025(:iim), &
162             xprimp025(:iim), xuv = 0.25d0)
163    
164        is2 = 0
165    
166        IF (MINval(rlonm025(:iim)) < - pi - 0.1 &
167             .or. MAXval(rlonm025(:iim)) > pi + 0.1) THEN
168           IF (clon <= 0.) THEN
169              is2 = 1
170    
171              do while (rlonm025(is2) < - pi .and. is2 < iim)
172                 is2 = is2 + 1
173              end do
174    
175              if (rlonm025(is2) < - pi) then
176                 print *, 'Rlonm025 plus petit que - pi !'
177                 STOP 1
178              end if
179           ELSE
180              is2 = iim
181    
182      ! ..... xuv = 0. si calcul aux pts scalaires ........            do while (rlonm025(is2) > pi .and. is2 > 1)
183      ! ..... xuv = 0.5 si calcul aux pts U ........               is2 = is2 - 1
184              end do
185      WRITE(6, 18)  
186              if (rlonm025(is2) > pi) then
187      DO ik = 1, 4               print *, 'Rlonm025 plus grand que pi !'
188                 STOP 1
189         IF(ik.EQ.1) THEN            end if
190            xuv = -0.25         END IF
191         ELSE IF (ik.EQ.2) THEN      END IF
192            xuv = 0.  
193         ELSE IF (ik.EQ.3) THEN      call principal_cshift(is2, rlonm025, xprimm025)
194            xuv = 0.50      call principal_cshift(is2, rlonv, xprimv)
195         ELSE IF (ik.EQ.4) THEN      call principal_cshift(is2, rlonu, xprimu)
196            xuv = 0.25      call principal_cshift(is2, rlonp025, xprimp025)
197         ENDIF  
198        forall (i = 1: iim) d_rlonv(i) = rlonv(i + 1) - rlonv(i)
199         xo1 = 0.      print *, "Minimum longitude step:", MINval(d_rlonv) * 180. / pi, "degrees"
200        print *, "Maximum longitude step:", MAXval(d_rlonv) * 180. / pi, "degrees"
201         ii1=1  
202         ii2=iim      DO i = 1, iim + 1
203         IF(ik.EQ.1.and.grossism.EQ.1.) THEN         IF (rlonp025(i) < rlonv(i)) THEN
204            ii1 = 2            print *, 'rlonp025(', i, ') = ', rlonp025(i)
205            ii2 = iim+1            print *, "< rlonv(", i, ") = ", rlonv(i)
206         ENDIF            STOP 1
207         DO i = ii1, ii2         END IF
208    
209            xlon2 = - pi + (FLOAT(i) + xuv - decalx) * depi / FLOAT(iim)         IF (rlonv(i) < rlonm025(i)) THEN
210              print *, 'rlonv(', i, ') = ', rlonv(i)
211            Xfi = xlon2            print *, "< rlonm025(", i, ") = ", rlonm025(i)
212              STOP 1
213            DO it = nmax2, 0, -1         END IF
214               IF(Xfi.GE.Xf(it)) GO TO 350  
215            end DO         IF (rlonp025(i) > rlonu(i)) THEN
216              print *, 'rlonp025(', i, ') = ', rlonp025(i)
217            it = 0            print *, "> rlonu(", i, ") = ", rlonu(i)
218              STOP 1
219  350       CONTINUE         END IF
220        END DO
           ! ...... Calcul de Xf(xi) ......  
   
           xi = xtild(it)  
   
           IF(it.EQ.nmax2) THEN  
              it = nmax2 -1  
              Xf(it+1) = pi  
           ENDIF  
           ! .....................................................................  
   
           ! Appel de la routine qui calcule les coefficients a0, a1, a2, a3 d'un  
           ! polynome de degre 3 qui passe par les points (Xf(it), xtild(it))  
           ! et (Xf(it+1), xtild(it+1))  
   
           CALL coefpoly (Xf(it), Xf(it+1), Xprimt(it), Xprimt(it+1), &  
                xtild(it), xtild(it+1), a0, a1, a2, a3)  
   
           Xf1 = Xf(it)  
           Xprimin = a1 + 2.* a2 * xi + 3.*a3 * xi *xi  
   
           DO iter = 1, 300  
              xi = xi - (Xf1 - Xfi)/ Xprimin  
   
              IF(ABS(xi-xo1).LE.epsilon) GO TO 550  
              xo1 = xi  
              xi2 = xi * xi  
              Xf1 = a0 + a1 * xi + a2 * xi2 + a3 * xi2 * xi  
              Xprimin = a1 + 2.* a2 * xi + 3.* a3 * xi2  
           end DO  
           WRITE(6, *) ' Pas de solution ***** ', i, xlon2, iter  
           STOP 6  
 550       CONTINUE  
   
           xxprim(i) = depi/ (FLOAT(iim) * Xprimin)  
           xvrai(i) = xi + xzoom  
   
        end DO  
   
        IF(ik.EQ.1.and.grossism.EQ.1.) THEN  
           xvrai(1) = xvrai(iip1)-depi  
           xxprim(1) = xxprim(iip1)  
        ENDIF  
        DO i = 1, iim  
           xlon(i) = xvrai(i)  
           xprimm(i) = xxprim(i)  
        ENDDO  
        DO i = 1, iim -1  
           IF(xvrai(i+1).LT. xvrai(i)) THEN  
              WRITE(6, *) ' PBS. avec rlonu(', i+1, ') plus petit que rlonu(', i, &  
                   ')'  
              STOP 7  
           ENDIF  
        ENDDO  
   
        ! ... Reorganisation des longitudes pour les avoir entre - pi et pi ..  
        ! ........................................................................  
   
        champmin = 1.e12  
        champmax = -1.e12  
        DO i = 1, iim  
           champmin = MIN(champmin, xvrai(i))  
           champmax = MAX(champmax, xvrai(i))  
        ENDDO  
   
        IF(.not. (champmin .GE.-pi-0.10.and.champmax.LE.pi+0.10)) THEN  
           WRITE(6, *) 'Reorganisation des longitudes pour avoir entre - pi', &  
                ' et pi '  
   
           IF(xzoom.LE.0.) THEN  
              IF(ik.EQ. 1) THEN  
                 DO i = 1, iim  
                    IF(xvrai(i).GE. - pi) GO TO 80  
                 ENDDO  
                 WRITE(6, *) ' PBS. 1 ! Xvrai plus petit que - pi ! '  
                 STOP 8  
 80              CONTINUE  
                 is2 = i  
              ENDIF  
   
              IF(is2.NE. 1) THEN  
                 DO ii = is2, iim  
                    xlon (ii-is2+1) = xvrai(ii)  
                    xprimm(ii-is2+1) = xxprim(ii)  
                 ENDDO  
                 DO ii = 1, is2 -1  
                    xlon (ii+iim-is2+1) = xvrai(ii) + depi  
                    xprimm(ii+iim-is2+1) = xxprim(ii)  
                 ENDDO  
              ENDIF  
           ELSE  
              IF(ik.EQ.1) THEN  
                 DO i = iim, 1, -1  
                    IF(xvrai(i).LE. pi) GO TO 90  
                 ENDDO  
                 WRITE(6, *) ' PBS. 2 ! Xvrai plus grand que pi ! '  
                 STOP 9  
 90              CONTINUE  
                 is2 = i  
              ENDIF  
              idif = iim -is2  
              DO ii = 1, is2  
                 xlon (ii+idif) = xvrai(ii)  
                 xprimm(ii+idif) = xxprim(ii)  
              ENDDO  
              DO ii = 1, idif  
                 xlon (ii) = xvrai (ii+is2) - depi  
                 xprimm(ii) = xxprim(ii+is2)  
              ENDDO  
           ENDIF  
        ENDIF  
   
        ! ......... Fin de la reorganisation ............................  
   
        xlon (iip1) = xlon(1) + depi  
        xprimm(iip1) = xprimm (1)  
   
        DO i = 1, iim+1  
           xvrai(i) = xlon(i)*180./pi  
        ENDDO  
   
        IF(ik.EQ.1) THEN  
           ! WRITE(6, *) ' XLON aux pts. V-0.25 apres (en deg.) '  
           ! WRITE(6, 18)  
           ! WRITE(6, 68) xvrai  
           ! WRITE(6, *) ' XPRIM k ', ik  
           ! WRITE(6, 566) xprimm  
   
           DO i = 1, iim +1  
              rlonm025(i) = xlon(i)  
              xprimm025(i) = xprimm(i)  
           ENDDO  
        ELSE IF(ik.EQ.2) THEN  
           ! WRITE(6, 18)  
           ! WRITE(6, *) ' XLON aux pts. V apres (en deg.) '  
           ! WRITE(6, 68) xvrai  
           ! WRITE(6, *) ' XPRIM k ', ik  
           ! WRITE(6, 566) xprimm  
   
           DO i = 1, iim + 1  
              rlonv(i) = xlon(i)  
              xprimv(i) = xprimm(i)  
           ENDDO  
   
        ELSE IF(ik.EQ.3) THEN  
           ! WRITE(6, 18)  
           ! WRITE(6, *) ' XLON aux pts. U apres (en deg.) '  
           ! WRITE(6, 68) xvrai  
           ! WRITE(6, *) ' XPRIM ik ', ik  
           ! WRITE(6, 566) xprimm  
   
           DO i = 1, iim + 1  
              rlonu(i) = xlon(i)  
              xprimu(i) = xprimm(i)  
           ENDDO  
   
        ELSE IF(ik.EQ.4) THEN  
           ! WRITE(6, 18)  
           ! WRITE(6, *) ' XLON aux pts. V+0.25 apres (en deg.) '  
           ! WRITE(6, 68) xvrai  
           ! WRITE(6, *) ' XPRIM ik ', ik  
           ! WRITE(6, 566) xprimm  
   
           DO i = 1, iim + 1  
              rlonp025(i) = xlon(i)  
              xprimp025(i) = xprimm(i)  
           ENDDO  
   
        ENDIF  
   
     end DO  
   
     WRITE(6, 18)  
   
     DO i = 1, iim  
        xlon(i) = rlonv(i+1) - rlonv(i)  
     ENDDO  
     champmin = 1.e12  
     champmax = -1.e12  
     DO i = 1, iim  
        champmin = MIN(champmin, xlon(i))  
        champmax = MAX(champmax, xlon(i))  
     ENDDO  
     champmin = champmin * 180./pi  
     champmax = champmax * 180./pi  
   
 18  FORMAT(/)  
 24  FORMAT(2x, 'Parametres xzoom, gross, tau, dzoom pour fxhyp ', 4f8.3)  
 68  FORMAT(1x, 7f9.2)  
 566 FORMAT(1x, 7f9.4)  
221    
222    END SUBROUTINE fxhyp    END SUBROUTINE fxhyp
223    

Legend:
Removed from v.82  
changed lines
  Added in v.124

  ViewVC Help
Powered by ViewVC 1.1.21