source: trunk/LMDZ.VENUS/libf/phyvenus/bilinearbig.F90 @ 3556

Last change on this file since 3556 was 2560, checked in by slebonnois, 3 years ago

SL: Implementation of SW computation based on generic model. Switch between this new SW module or old module that reads R. Haus tables implemented with a key (solarchoice)

File size: 2.6 KB
Line 
1      subroutine bilinearbig(nX,nY,x_arr,y_arr,f2d_arr,x_in,y_in,f,ind)
2
3!     Necessary for interpolation of continuum data
4!     optimized by A. Spiga 01/2013
5
6      implicit none
7
8      integer nX,nY,i,j,ind,b
9
10      real*8 x_in,y_in,x1,x2,y1,y2
11      real*8 f,f11,f12,f21,f22,fA,fB
12      real*8 x_arr(nX)
13      real*8 y_arr(nY)
14      real*8 f2d_arr(nX,nY)
15      real*8,save :: x,y
16!$OMP THREADPRIVATE(x,y)
17
18      integer strlen
19      character*100 label
20      label='subroutine bilinear'
21
22
23      x=x_in
24      y=y_in
25
26   !! AS: important to optimize here because the array is quite large
27   !! ... and actually calculations only need to be done once
28   !! IF ind=-9999 we have not calculated yet
29   if ( ind == -9999) then
30      !1st check we're within the wavenumber range
31      if ((x.lt.x_arr(2)).or.(x.gt.x_arr(nX-2))) then
32         ind=-1
33      else
34        i=1
35        x2=x_arr(i)
36        do while ( x2 .le. x )
37          x1=x2
38          i=i+1
39          x2=x_arr(i)
40          ind=i-1
41        end do
42      endif
43   endif
44
45   !! Either we already saw we are out of wavenumber range
46   !! ... and we just have to set f=0 and exit
47   if ( ind == -1) then
48      f=0.0D+0
49      return
50   !! Or we already determined ind -- so we just proceed
51   else
52      x1=x_arr(ind)
53      x2=x_arr(ind+1)
54   endif
55
56!     ... and for y within the temperature range
57      if ((y.le.y_arr(1)).or.(y.ge.y_arr(nY))) then
58         !print*,y_arr(1),y_arr(nY)
59         !write(*,*) 'Warning from bilinearbig routine:'
60         !write(*,*) 'Outside continuum temperature range!'
61         if(y.le.y_arr(1))then
62            y=y_arr(1)+0.01
63            b=1
64            y1=y_arr(b)
65            y2=y_arr(b+1)
66         endif
67         if(y.ge.y_arr(nY))then
68            y=y_arr(nY)-0.01
69            b=nY-1
70            y1=y_arr(b)
71            y2=y_arr(b+1)
72         endif
73      else
74        j=1
75        y2=y_arr(j)
76        do while ( y2 .lt. y )
77          y1=y2
78          j=j+1
79          y2=y_arr(j)
80          b=j-1
81        end do
82      endif
83     
84      f11=f2d_arr(ind,b)
85      f21=f2d_arr(ind+1,b)
86      f12=f2d_arr(ind,b+1)
87      f22=f2d_arr(ind+1,b+1)
88
89      call bilinear(f,f11,f21,f12,f22,x,x1,x2,y,y1,y2)
90
91      return
92    end subroutine bilinearbig
93
94!-------------------------------------------------------------------------
95subroutine bilinear(f,f11,f21,f12,f22,x,x1,x2,y,y1,y2)
96! Used for interpolation of continuum data
97
98  implicit none
99
100  real*8 x,y,x1,x2,y1,y2
101  real*8 f,f11,f12,f21,f22,fA,fB
102
103  ! 1st in x-direction
104  fA=f11*(x2-x)/(x2-x1)+f21*(x-x1)/(x2-x1)
105  fB=f12*(x2-x)/(x2-x1)+f22*(x-x1)/(x2-x1)
106
107  ! then in y-direction
108  f=fA*(y2-y)/(y2-y1)+fB*(y-y1)/(y2-y1)
109
110  return
111end subroutine bilinear
112
Note: See TracBrowser for help on using the repository browser.