/[lmdze]/trunk/dyn3d/fxhyp_loop_ik.f
ViewVC logotype

Annotation of /trunk/dyn3d/fxhyp_loop_ik.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 127 - (hide annotations)
Tue Feb 10 17:58:56 2015 UTC (9 years, 3 months ago) by guez
File size: 2234 byte(s)
clon and clat from module serre are now in rad instead of
degrees. They are only used in rad, so we do only one conversion when
we read them.

1 guez 121 module fxhyp_loop_ik_m
2    
3     implicit none
4    
5     INTEGER, PARAMETER:: nmax = 30000
6    
7     contains
8    
9 guez 127 subroutine fxhyp_loop_ik(xf, xtild, Xprimt, xlon, xprimm, xuv)
10 guez 121
11     use coefpoly_m, only: coefpoly
12     USE dimens_m, ONLY: iim
13 guez 124 use nr_util, only: pi_d, twopi_d
14 guez 127 use serre, only: clon
15 guez 121
16     DOUBLE PRECISION, intent(in):: Xf(0:), xtild(0:), Xprimt(0:) ! (0:2 * nmax)
17 guez 124 real, intent(out):: xlon(:), xprimm(:) ! (iim)
18 guez 121
19     DOUBLE PRECISION, intent(in):: xuv
20     ! 0. si calcul aux points scalaires
21     ! 0.5 si calcul aux points U
22    
23     ! Local:
24 guez 126 DOUBLE PRECISION xo1, Xfi, a0, a1, a2, a3, Xf1, Xprimin
25     integer i, it, iter
26     DOUBLE PRECISION, parameter:: my_eps = 1d-6
27 guez 121
28 guez 126 DOUBLE PRECISION xxprim(iim), xvrai(iim)
29     ! intermediary variables because xlon and xprimm are simple precision
30    
31 guez 121 !------------------------------------------------------------------
32    
33 guez 126 DO i = 1, iim
34     Xfi = - pi_d + (i + xuv - 0.75d0) * twopi_d / iim
35 guez 121
36     it = 2 * nmax
37     do while (xfi < xf(it) .and. it >= 1)
38     it = it - 1
39     end do
40    
41 guez 126 ! Calcul de Xf(xvrai(i))
42 guez 121
43 guez 126 xvrai(i) = xtild(it)
44 guez 121
45     IF (it == 2 * nmax) THEN
46     it = 2 * nmax -1
47     END IF
48    
49     CALL coefpoly(Xf(it), Xf(it + 1), Xprimt(it), Xprimt(it + 1), &
50     xtild(it), xtild(it + 1), a0, a1, a2, a3)
51     Xf1 = Xf(it)
52 guez 126 Xprimin = a1 + xvrai(i) * (2d0 * a2 + xvrai(i) * 3d0 * a3)
53     xo1 = xvrai(i)
54 guez 121 iter = 1
55    
56     do
57 guez 126 xvrai(i) = xvrai(i) - (Xf1 - Xfi) / Xprimin
58     IF (ABS(xvrai(i) - xo1) <= my_eps .or. iter == 300) exit
59     xo1 = xvrai(i)
60     Xf1 = a0 + xvrai(i) * (a1 + xvrai(i) * (a2 + xvrai(i) * a3))
61     Xprimin = a1 + xvrai(i) * (2d0 * a2 + xvrai(i) * 3d0 * a3)
62 guez 121 end DO
63    
64 guez 126 if (ABS(xvrai(i) - xo1) > my_eps) then
65 guez 121 ! iter == 300
66     print *, 'Pas de solution.'
67     print *, i, xfi
68     STOP 1
69     end if
70    
71 guez 126 xxprim(i) = twopi_d / (iim * Xprimin)
72 guez 121 end DO
73    
74     DO i = 1, iim -1
75     IF (xvrai(i + 1) < xvrai(i)) THEN
76 guez 124 print *, 'xvrai(', i + 1, ') < xvrai(', i, ')'
77 guez 121 STOP 1
78     END IF
79     END DO
80    
81 guez 127 xlon = xvrai + clon
82 guez 126 xprimm = xxprim
83 guez 121
84     end subroutine fxhyp_loop_ik
85    
86     end module fxhyp_loop_ik_m

  ViewVC Help
Powered by ViewVC 1.1.21