50 INTEGER,
INTENT(IN) :: KLUOUT
51 REAL,
DIMENSION(:,:),
INTENT(IN) :: PFIELDIN
52 REAL,
DIMENSION(:,:),
INTENT(OUT) :: PFIELDOUT
57 INTEGER,
DIMENSION(MPI_STATUS_SIZE) :: ISTATUS
59 REAL,
DIMENSION(:,:,:),
ALLOCATABLE :: ZW, ZFIELDIN,ZFGET
60 INTEGER,
DIMENSION(:,:,:),
ALLOCATABLE :: IJD,IJGET
61 REAL,
DIMENSION(:),
ALLOCATABLE :: XLAT_IND, XLON_IND, XRAT_OUT, XRON_OUT
64 INTEGER :: J, I, JI, INO, JL, INL, ILON, ILAT, ISIZE
65 REAL :: ZWX, ZWY, ZWSUM
67 REAL(KIND=JPRB) :: ZHOOK_HANDLE
70 IF (
lhook)
CALL dr_hook(
'HOR_INTERPOL_ROTLATLON',0,zhook_handle)
72 WRITE(kluout,
'(A)')
' | Running rotated latlon interpolation' 75 inl =
SIZE(pfieldout,2)
80 ALLOCATE(xrat_out(ino),xron_out(ino),xlat_ind(ino),xlon_ind(ino),ijd(ino,inl,4),zw(ino,inl,4))
87 xlat_ind(j) = ( xrat_out(j) -
xrila1) /
xrdy + 1.
88 xlon_ind(j) = ( xron_out(j) -
xrilo1) /
xrdx + 1.
98 ilon = int(xlon_ind(ji))
99 ilat = int(xlat_ind(ji))
101 zwx = xlon_ind(ji) - float(ilon)
102 zwy = xlat_ind(ji) - float(ilat)
104 zw(ji,jl,1) = (1.-zwx)*(1.-zwy)
105 zw(ji,jl,2) = (1.-zwx)* zwy
106 zw(ji,jl,3) = zwx *(1.-zwy)
107 zw(ji,jl,4) = zwx * zwy
109 ijd(ji,jl,1) = ilon +
nrx*(ilat -1)
110 ijd(ji,jl,2) = ilon +
nrx*(ilat+1 -1)
111 ijd(ji,jl,3) = ilon+1 +
nrx*(ilat -1)
112 ijd(ji,jl,4) = ilon+1 +
nrx*(ilat+1 -1)
118 ALLOCATE(zfieldin(ino,inl,4))
124 CALL mpi_send(ino,kind(ino)/4,mpi_integer,
npio,
idx_i,
ncomm,infompi)
129 CALL mpi_send(ijd,
SIZE(ijd)*kind(ijd)/4,mpi_integer,
npio,
idx_i,
ncomm,infompi)
134 CALL mpi_recv(zfieldin,
SIZE(zfieldin)*kind(zfieldin)/4,mpi_real,
npio,
idx_i,
ncomm,istatus,infompi)
143 CALL mpi_recv(isize,kind(isize)/4,mpi_integer,j,
idx_i+1,
ncomm,istatus,infompi)
145 ALLOCATE(ijget(isize,inl,4))
147 CALL mpi_recv(ijget,
SIZE(ijget)*kind(ijget)/4,mpi_integer,j,
idx_i+2,
ncomm,istatus,infompi)
151 ALLOCATE(ijget(isize,inl,4))
152 ijget(:,:,:) = ijd(:,:,:)
155 ALLOCATE(zfget(isize,inl,4))
161 zfget(ji,jl,i) = pfieldin(ijget(ji,jl,i),jl)
168 CALL mpi_send(zfget,
SIZE(zfget)*kind(zfget)/4,mpi_real,j,
idx_i+3,
ncomm,infompi)
171 zfieldin(:,:,:) = zfget(:,:,:)
174 DEALLOCATE(ijget,zfget)
186 IF (abs(zfieldin(ji,jl,i)-
xundef)<1.e-6) zw(ji,jl,i) = 0.
189 zwsum = zw(ji,jl,1) + zw(ji,jl,2) + zw(ji,jl,3) + zw(ji,jl,4)
191 IF ( abs(zwsum)<1.e-6 )
THEN 195 zw(ji,jl,i) = zw(ji,jl,i)/zwsum
199 pfieldout(ji,jl) = zw(ji,jl,1)*zfieldin(ji,jl,1) + zw(ji,jl,2)*zfieldin(ji,jl,2) + &
200 zw(ji,jl,3)*zfieldin(ji,jl,3) + zw(ji,jl,4)*zfieldin(ji,jl,4)
206 DEALLOCATE(xrat_out,xron_out,xlat_ind,xlon_ind,ijd,zfieldin)
208 IF (
lhook)
CALL dr_hook(
'HOR_INTERPOL_ROTLATLON',1,zhook_handle)
212 SUBROUTINE regrot(PXREG,PYREG,PXROT,PYROT,PXCEN,PYCEN,KCALL)
244 INTEGER,
INTENT(IN) :: KCALL
245 REAL,
INTENT(IN) :: PXCEN,PYCEN
246 REAL,
DIMENSION(:),
INTENT(INOUT) :: PXREG, PYREG
247 REAL,
DIMENSION(:),
INTENT(INOUT) :: PXROT, PYROT
251 REAL :: ZRAD,ZSYCEN,ZCYCEN,ZXMXC,ZSXMXC,ZCXMXC,ZSYREG,ZCYREG, &
252 ZSYROT,ZCYROT,ZCXROT,ZSXROT,ZRADI
254 REAL(KIND=JPRB) :: ZHOOK_HANDLE
264 zsycen = sin(zrad*(pycen+90.))
265 zcycen = cos(zrad*(pycen+90.))
271 zxmxc = zrad*(pxreg(ji) - pxcen)
275 zsyreg = sin(zrad*pyreg(ji))
276 zcyreg = cos(zrad*pyreg(ji))
278 zsyrot = zcycen*zsyreg - zsycen*zcyreg*zcxmxc
279 zsyrot = min(max(zsyrot,-1.0),+1.0)
281 pyrot(ji) = asin(zsyrot)*zradi
283 zcyrot = cos(zrad*pyrot(ji))
284 zcxrot = (zcycen*zcyreg*zcxmxc + zsycen*zsyreg)/zcyrot
285 zcxrot = min(max(zcxrot,-1.0),+1.0)
286 zsxrot = zcyreg*zsxmxc/zcyrot
288 pxrot(ji) = acos(zcxrot)*zradi
290 IF (zsxrot.LT.0.0) pxrot(ji) = -pxrot(ji)
294 ELSEIF (kcall.EQ.-1)
THEN 298 zsxrot = sin(zrad*pxrot(ji))
299 zcxrot = cos(zrad*pxrot(ji))
300 zsyrot = sin(zrad*pyrot(ji))
301 zcyrot = cos(zrad*pyrot(ji))
303 zsyreg = zcycen*zsyrot + zsycen*zcyrot*zcxrot
304 zsyreg = max(zsyreg,-1.0)
305 zsyreg = min(zsyreg,+1.0)
307 pyreg(ji) = asin(zsyreg)*zradi
309 zcyreg = cos(pyreg(ji)*zrad)
311 zcxmxc = (zcycen*zcyrot*zcxrot - zsycen*zsyrot)/zcyreg
312 zcxmxc = max(zcxmxc,-1.0)
313 zcxmxc = min(zcxmxc,+1.0)
314 zsxmxc = zcyrot*zsxrot/zcyreg
315 zxmxc = acos(zcxmxc)*zradi
316 IF (zsxmxc.LT.0.0) zxmxc = -zxmxc
318 pxreg(ji) = zxmxc + pxcen
324 WRITE(6,
'(1X,''INVALID KCALL IN REGROT'')')
325 CALL abor1_sfx(
'HOR_INTERPOL_ROTLATON:REGROT:KCALL MUST BE 1 OR -1')
subroutine regrot(PXREG, PYREG, PXROT, PYROT, PXCEN, PYCEN, KCALL)
real, dimension(:), allocatable xlon_out
subroutine abor1_sfx(YTEXT)
real, dimension(:), allocatable xlat_out
subroutine hor_interpol_rotlatlon(KLUOUT, PFIELDIN, PFIELDOUT)