8 REAL,
allocatable,
dimension(:),
save :: io_lat
9 REAL,
allocatable,
dimension(:),
save :: io_lon
10 INTEGER,
save :: phys_domain_id
11 INTEGER,
save :: npstn
12 INTEGER,
allocatable,
dimension(:),
save :: nptabij
31 include
'dimensions.h'
32 real,
dimension(klon),
intent(in) ::
rlon
33 real,
dimension(klon),
intent(in) ::
rlat
35 REAL,
dimension(klon_glo) :: rlat_glo
36 REAL,
dimension(klon_glo) :: rlon_glo
38 INTEGER,
DIMENSION(2) :: ddid
39 INTEGER,
DIMENSION(2) :: dsg
40 INTEGER,
DIMENSION(2) :: dsl
41 INTEGER,
DIMENSION(2) :: dpf
42 INTEGER,
DIMENSION(2) :: dpl
43 INTEGER,
DIMENSION(2) :: dhs
44 INTEGER,
DIMENSION(2) :: dhe
53 ALLOCATE(io_lat(jjm+1-1/(
iim*jjm)))
55 io_lat(jjm+1-1/(
iim*jjm))=rlat_glo(klon_glo)
56 IF ((
iim*jjm) > 1)
then
58 io_lat(
i)=rlat_glo(2+(
i-2)*
iim)
63 io_lon(:)=rlon_glo(2-1/(
iim*jjm):
iim+1-1/(
iim*jjm))
66 dsg=(/
iim, jjm+1-1/(
iim*jjm) /)
70 dhs=(/ ii_begin-1,0 /)
71 if (mpi_rank==mpi_size-1)
then
74 dhe=(/
iim-ii_end,0 /)
77 call flio_dom_set(mpi_size,mpi_rank,ddid,dsg,dsl,dpf,dpl,dhs,dhe, &
78 'APPLE',phys_domain_id)
89 include
'dimensions.h'
90 real,
dimension(iim),
intent(in) ::
lon
91 real,
dimension(jjm+1-1/(iim*jjm)),
intent(in) :: lat
93 INTEGER,
DIMENSION(2) :: ddid
94 INTEGER,
DIMENSION(2) :: dsg
95 INTEGER,
DIMENSION(2) :: dsl
96 INTEGER,
DIMENSION(2) :: dpf
97 INTEGER,
DIMENSION(2) :: dpl
98 INTEGER,
DIMENSION(2) :: dhs
99 INTEGER,
DIMENSION(2) :: dhe
102 allocate(io_lat(jjm+1-1/(
iim*jjm)))
104 allocate(io_lon(
iim))
108 dsg=(/
iim, jjm+1-1/(
iim*jjm) /)
111 dpl=(/
iim, jj_end /)
112 dhs=(/ ii_begin-1,0 /)
113 if (mpi_rank==mpi_size-1)
then
116 dhe=(/
iim-ii_end,0 /)
119 call flio_dom_set(mpi_size,mpi_rank,ddid,dsg,dsl,dpf,dpl,dhs,dhe, &
120 'APPLE',phys_domain_id)
132 include
'dimensions.h'
134 character*(*),
intent(IN) :: name
135 integer,
intent(in) :: itau0
137 real,
intent(in) ::
dtime
138 integer,
intent(out) ::
nhori
139 integer,
intent(out) :: nid_day
142 if (is_sequential)
then
154 plon,plat,plon_bounds,plat_bounds, &
162 include
'dimensions.h'
164 real,
dimension(klon),
intent(in) ::
rlon
165 real,
dimension(klon),
intent(in) ::
rlat
166 integer,
intent(in) :: itau0
168 real,
intent(in) ::
dtime
169 integer,
intent(in) :: pim
170 integer,
intent(out) :: nnhori
171 character(len=20),
intent(in) :: nname
172 INTEGER,
intent(out) :: nnid_day
174 REAL,
dimension(klon_glo) :: rlat_glo
175 REAL,
dimension(klon_glo) :: rlon_glo
176 INTEGER,
DIMENSION(pim),
intent(in) :: tabij
177 REAL,
dimension(pim),
intent(in) :: plat, plon
178 INTEGER,
dimension(pim),
intent(in) :: ipt, jpt
179 REAL,
dimension(pim,2),
intent(out) :: plat_bounds, plon_bounds
181 INTEGER,
SAVE :: tabprocbeg, tabprocend
184 INTEGER,
PARAMETER :: nip=1
186 REAL,
allocatable,
dimension(:) :: npplat, npplon
187 REAL,
allocatable,
dimension(:,:) :: npplat_bounds, npplon_bounds
188 INTEGER,
PARAMETER ::
jjmp1=jjm+1-1/jjm
201 plon_bounds(
i,1)=rlon_glo(tabij(
i)-1)
202 plon_bounds(
i,2)=rlon_glo(tabij(
i)+1)
203 if(plon_bounds(
i,2).LE.0..AND.plon_bounds(
i,1).GE.0.)
THEN
204 if(rlon_glo(tabij(
i)).GE.0.)
THEN
205 plon_bounds(
i,2)=-1*plon_bounds(
i,2)
208 if(plon_bounds(
i,2).GE.0..AND.plon_bounds(
i,1).LE.0.)
THEN
209 if(rlon_glo(tabij(
i)).LE.0.)
THEN
210 plon_bounds(
i,2)=-1*plon_bounds(
i,2)
214 IF ( tabij(
i).LE.
iim)
THEN
215 plat_bounds(
i,1)=rlat_glo(tabij(
i))
217 plat_bounds(
i,1)=rlat_glo(tabij(
i)-
iim)
219 plat_bounds(
i,2)=rlat_glo(tabij(
i)+
iim)
225 if (is_sequential)
then
228 IF(.NOT.
ALLOCATED(nptabij))
THEN
229 ALLOCATE(nptabij(pim))
236 if ((
iim*jjm).gt.1)
then
250 if (ipt(
i).EQ.1)
then
252 plon_bounds(
i,2)=360.+
zx_lon(ipt(
i)+1,jpt(
i))
255 if (ipt(
i).EQ.
iim)
then
256 plon_bounds(
i,2)=360.+
zx_lon(1,jpt(
i))
262 if (jpt(
i).EQ.1)
then
263 plat_bounds(
i,1)=
zx_lat(ipt(
i),1)+0.001
264 plat_bounds(
i,2)=
zx_lat(ipt(
i),1)-0.001
277 call
histbeg(nname,pim,plon,plon_bounds, &
283 tabprocbeg=klon_mpi_begin
284 tabprocend=klon_mpi_end
285 IF(tabij(ip).GE.tabprocbeg.AND.tabij(ip).LE.tabprocend)
THEN
291 IF(.NOT.
ALLOCATED(nptabij))
THEN
292 ALLOCATE(nptabij(npstn))
293 ALLOCATE(npplon(npstn), npplat(npstn))
294 ALLOCATE(npplon_bounds(npstn,2), npplat_bounds(npstn,2))
298 IF(tabij(ip).GE.tabprocbeg.AND.tabij(ip).LE.tabprocend)
THEN
300 nptabij(npproc)=tabij(ip)
303 npplon(npproc)=plon(ip)
304 npplat(npproc)=plat(ip)
305 npplon_bounds(npproc,1)=plon_bounds(ip,1)
306 npplon_bounds(npproc,2)=plon_bounds(ip,2)
307 npplat_bounds(npproc,1)=plat_bounds(ip,1)
308 npplat_bounds(npproc,2)=plat_bounds(ip,2)
312 print*,
'iophy_mpi rank ip lon lat',mpi_rank,ip,plon(ip),plat(ip)
316 call
histbeg(nname,npstn,npplon,npplon_bounds, &
317 npplat,npplat_bounds, &
329 include
'dimensions.h'
332 integer,
intent(in) :: nid
333 logical,
intent(in) :: lpoint
334 character*(*),
intent(IN) :: name
335 integer,
intent(in) :: itau
336 real,
dimension(:),
intent(in) :: field
337 REAL,
dimension(klon_mpi) :: buffer_omp
338 INTEGER,
allocatable,
dimension(:) :: index2d
342 real,
allocatable,
dimension(:) :: fieldok
344 IF (
size(field)/=klon) CALL
abort_gcm(
'iophy::histwrite2d',
'Field first dimension not equal to klon',1)
346 CALL gather_omp(field,buffer_omp)
348 CALL grid1dto2d_mpi(buffer_omp,field2d)
353 CALL histwrite(nid,name,itau,field2d,
iim*
jj_nb,index2d)
354 IF (
prt_level >= 9)
write(
lunout,*)
'Finished sending ',name,
' to IOIPSL'
356 ALLOCATE(fieldok(npstn))
357 ALLOCATE(index2d(npstn))
359 if(is_sequential)
then
363 fieldok(ip)=buffer_omp(nptabij(ip))
368 IF(nptabij(ip).GE.klon_mpi_begin.AND. &
369 nptabij(ip).LE.klon_mpi_end)
THEN
370 fieldok(ip)=buffer_omp(nptabij(ip)-klon_mpi_begin+1)
375 CALL histwrite(nid,name,itau,fieldok,npstn,index2d)
376 IF (
prt_level >= 9)
write(
lunout,*)
'Finished sending ',name,
' to IOIPSL'
390 include
'dimensions.h'
393 integer,
intent(in) :: nid
394 logical,
intent(in) :: lpoint
395 character*(*),
intent(IN) :: name
396 integer,
intent(in) :: itau
397 real,
dimension(:,:),
intent(in) :: field
398 REAL,
dimension(klon_mpi,size(field,2)) :: buffer_omp
399 REAL :: field3d(
iim,
jj_nb,size(field,2))
400 INTEGER :: ip,
n, nlev
401 INTEGER,
ALLOCATABLE,
dimension(:) :: index3d
402 real,
allocatable,
dimension(:,:) :: fieldok
404 IF (
size(field,1)/=klon) CALL
abort_gcm(
'iophy::histwrite3d',
'Field first dimension not equal to klon',1)
413 CALL gather_omp(field,buffer_omp)
415 CALL grid1dto2d_mpi(buffer_omp,field3d)
420 CALL histwrite(nid,name,itau,field3d,
iim*
jj_nb*nlev,index3d)
421 IF (
prt_level >= 9)
write(
lunout,*)
'Finished sending ',name,
' to IOIPSL'
424 ALLOCATE(index3d(npstn*nlev))
425 ALLOCATE(fieldok(npstn,nlev))
427 if(is_sequential)
then
432 fieldok(ip,
n)=buffer_omp(nptabij(ip),
n)
438 IF(nptabij(ip).GE.klon_mpi_begin.AND. &
439 nptabij(ip).LE.klon_mpi_end)
THEN
440 fieldok(ip,
n)=buffer_omp(nptabij(ip)-klon_mpi_begin+1,
n)
446 CALL histwrite(nid,name,itau,fieldok,npstn*nlev,index3d)
447 IF (
prt_level >= 9)
write(
lunout,*)
'Finished sending ',name,
' to IOIPSL'