6 SUBROUTINE bilin_value (KLUOUT,KX,KY,PFIELD1,PCX,PCY,KCI,KCJ,PFIELD2)
102 INTEGER,
INTENT(IN) :: KLUOUT
103 INTEGER,
INTENT(IN) :: KX, KY
104 REAL,
DIMENSION(:,:),
INTENT(IN) :: PFIELD1
105 REAL,
DIMENSION(:,:),
INTENT(IN) :: PCX, PCY
106 INTEGER,
DIMENSION(:),
INTENT(IN):: KCI, KCJ
107 REAL,
DIMENSION(:,:),
INTENT(OUT) :: PFIELD2
112 INTEGER,
DIMENSION(MPI_STATUS_SIZE) :: ISTATUS
114 REAL,
DIMENSION(:,:,:),
ALLOCATABLE :: ZFIELD1,ZFIELDS
115 REAL,
DIMENSION(:,:),
ALLOCATABLE :: ZFIELD_X, ZFIELD_Y, ZFIELD_XY
116 INTEGER,
DIMENSION(2) :: IB
117 INTEGER,
DIMENSION(2,2) :: IJEXT
118 INTEGER,
DIMENSION(2,2,0:NPROC-1) :: IBOR
119 INTEGER :: INFOMPI, ISIZE, IS1, IS2, J, IT1, IT2
120 INTEGER :: JL, JK, JI, JJ, INL
122 REAL(KIND=JPRB) :: ZHOOK_HANDLE, ZHOOK_HANDLE_OMP
127 inl =
SIZE(pfield2,2)
129 IF (
SIZE(kci)>0)
THEN 130 ijext(1,1) = max(1,minval(kci)-1)
131 ijext(1,2) = min(maxval(kci)+1,kx)
132 ijext(2,1) = max(1,minval(kcj)-1)
133 ijext(2,2) = min(maxval(kcj)+1,ky)
144 CALL mpi_gather(ijext,4*kind(ijext)/4,mpi_integer,&
145 ibor,4*kind(ibor)/4,mpi_integer,&
149 ibor(:,:,0) = ijext(:,:)
159 is1 = ijext(1,2)-ijext(1,1)+1
160 is2 = ijext(2,2)-ijext(2,1)+1
162 ALLOCATE(zfield1(is1,is2,inl))
165 CALL mpi_recv(zfield1,isize*inl*kind(zfield1)/4,mpi_real,
npio,
idx_i,
ncomm,istatus,infompi)
178 IF (
lhook)
CALL dr_hook(
'BILIN_VALUE_31',0,zhook_handle_omp)
180 it1 = ibor(1,2,j)-ibor(1,1,j)+1
181 it2 = ibor(2,2,j)-ibor(2,1,j)+1
183 IF (
sum(ibor(:,:,j))/=0)
THEN 184 ALLOCATE(zfields(it1,it2,inl))
185 DO jl=ibor(2,1,j),ibor(2,2,j)
186 zfields(:,jl-ibor(2,1,j)+1,:) = pfield1(kx*(jl-1)+ibor(1,1,j):kx*(jl-1)+ibor(1,2,j),:)
189 CALL mpi_send(zfields,
SIZE(zfields)*kind(zfields)/4,mpi_real,j,
idx_i+1,
ncomm,infompi)
193 IF (
lhook)
CALL dr_hook(
'BILIN_VALUE_31',1,zhook_handle_omp)
197 IF (
lhook)
CALL dr_hook(
'BILIN_VALUE_32',0,zhook_handle_omp)
199 is1 = ibor(1,2,0)-ibor(1,1,0)+1
200 is2 = ibor(2,2,0)-ibor(2,1,0)+1
202 ALLOCATE(zfield1(is1,is2,inl))
203 IF (
sum(ibor(:,:,0))/=0)
THEN 204 DO jl=ibor(2,1,0),ibor(2,2,0)
205 zfield1(:,jl-ibor(2,1,0)+1,:) = pfield1(kx*(jl-1)+ibor(1,1,0):kx*(jl-1)+ibor(1,2,0),:)
209 IF (
lhook)
CALL dr_hook(
'BILIN_VALUE_32',1,zhook_handle_omp)
221 ALLOCATE(zfield_x(is1+1,is2),zfield_y(is1,is2+1),zfield_xy(is1+1,is2+1))
226 CALL bilin_gridin(zfield1(:,:,jk),zfield_x,zfield_y,zfield_xy)
232 DO jl=1,
SIZE(pfield2,1)
234 ji = kci(jl) - ijext(1,1) + 1
235 jj = kcj(jl) - ijext(2,1) + 1
236 ji = max(min(ji,
SIZE(zfield1,1)),0)
237 jj = max(min(jj,
SIZE(zfield1,2)),0)
244 IF(zfield1(ji,jj,jk) /=
xundef)
THEN 246 pfield2(jl,jk) = pcy(jl,1) * &
247 ( pcx(jl,1) * zfield_xy(ji,jj) + pcx(jl,2) * zfield_y(ji,jj) + pcx(jl,3) * zfield_xy(ji+1,jj) ) &
249 ( pcx(jl,1) * zfield_x(ji,jj) + pcx(jl,2) * zfield1(ji,jj,jk) + pcx(jl,3) * zfield_x(ji+1,jj) ) &
251 ( pcx(jl,1) * zfield_xy(ji,jj+1) + pcx(jl,2) * zfield_y(ji,jj+1) + pcx(jl,3) * zfield_xy(ji+1,jj+1) )
263 DEALLOCATE(zfield1,zfield_x,zfield_y,zfield_xy)
subroutine bilin_gridin(PFIELD1, PFIELD_X, PFIELD_Y, PFIELD_XY)
intent(out) overrides sub arrays one Sort by the least significant key first sum(iindex(1:n))
subroutine bilin_value(KLUOUT, KX, KY, PFIELD1, PCX, PCY, KCI, KCJ, PFIELD2)