6 HDOMAIN,HAXIS,HAXIS2,HDCOMMENT,KFREQOP)
71 USE modi_sfx_xios_declare_field
72 USE xios
,ONLY : xios_is_defined_field_attr, xios_get_field_attr, &
73 xios_is_defined_grid_attr, xios_get_grid_attr, &
74 xios_is_defined_domain_attr, xios_get_domain_attr, &
75 xios_is_valid_field, xios_send_field, xios_set_field_attr,&
76 xios_get_handle, xios_add_child, xios_set_attr,&
77 xios_field, xios_fieldgroup, xios_field_is_active,&
90 CHARACTER(LEN=*),
INTENT(IN) :: HDTAG
91 REAL(KIND=JPRB) ,
INTENT(IN),
OPTIONAL,
DIMENSION(:) :: PFIELD
92 REAL(KIND=JPRB) ,
INTENT(IN),
OPTIONAL,
DIMENSION(:,:):: PFIELD2
93 REAL(KIND=JPRB) ,
INTENT(IN),
OPTIONAL,
DIMENSION(:,:,:):: PFIELD3
94 CHARACTER(LEN=*),
INTENT(IN),
OPTIONAL :: HDOMAIN
95 CHARACTER(LEN=*),
INTENT(IN),
OPTIONAL :: HAXIS
96 CHARACTER(LEN=*),
INTENT(IN),
OPTIONAL :: HAXIS2
97 CHARACTER(LEN=*),
INTENT(IN),
OPTIONAL :: HDCOMMENT
98 INTEGER ,
INTENT(IN),
OPTIONAL :: KFREQOP
107 CHARACTER(LEN=100) :: YLNAME
108 INTEGER(KIND=JPIM) :: ISIZEMAX
110 INTEGER(KIND=JPIM) :: ISIZE
111 INTEGER(KIND=JPIM) :: INDIM
112 INTEGER(KIND=JPIM) :: ILEV
113 INTEGER(KIND=JPIM) :: ILEV2
114 INTEGER(KIND=JPIM) :: IBLOCK
115 REAL(KIND=JPRB),
ALLOCATABLE,
DIMENSION (:,:,:) :: ZFIELD
118 TYPE(xios_field) :: field_hdl, other_field_hdl
119 TYPE(xios_fieldgroup) :: fieldgroup_hdl
120 INTEGER(KIND=JPIM) :: ISIZE = 1000
121 INTEGER(KIND=JPIM),
PARAMETER :: INCR = 100
122 INTEGER(KIND=JPIM),
PARAMETER :: IMAXSIZE = 10000
124 TYPE(buf_t),
POINTER :: YLF
125 TYPE(buf_t),
ALLOCATABLE,
TARGET,
SAVE :: YLFIELDS(:)
126 TYPE(buf_t),
ALLOCATABLE :: YLTEMP(:)
128 INTEGER(KIND=JPIM) :: JI, IL, IEMPTY, IIDIM, ITAKE, ILEV, INFIELDS
129 CHARACTER(LEN=100) :: YLTAG
130 CHARACTER(LEN=300) :: YLAXIS, YLAXIS2
131 CHARACTER(LEN=300) :: YLDOMAIN
132 CHARACTER(LEN=300) :: YLGRID
133 CHARACTER(LEN=300) :: YLCOMMENT
141 REAL(KIND=JPRB) :: ZHOOK_HANDLE
145 IF (
lhook)
CALL dr_hook(
'SFX_XIOS_SEND_BLOCK_1',0,zhook_handle)
147 IF (.NOT.
lxios)
THEN 148 IF (
lhook)
CALL dr_hook(
'SFX_XIOS_SEND_BLOCK_1',1,zhook_handle)
155 IF (.NOT. xios_field_is_active(hdtag) )
THEN 156 IF (
lhook)
CALL dr_hook(
'SFX_XIOS_SEND_BLOCK_1',1,zhook_handle)
164 ALLOCATE(ylfields(isize))
165 ylfields(:)%YLNAME =
'' 172 IF (ylfields(ji)%YLNAME == yltag)
THEN 178 IF (
lhook)
CALL dr_hook(
'SFX_XIOS_SEND_BLOCK_1',1,zhook_handle)
187 IF (
lhook)
CALL dr_hook(
'SFX_XIOS_SEND_BLOCK_2',0,zhook_handle)
190 IF (
PRESENT(hdomain)) yldomain =
trim(hdomain)
192 IF (
PRESENT(hdcomment)) ylcomment =
trim(hdcomment)
194 IF (
PRESENT(kfreqop)) ifreqop = kfreqop
196 IF (
PRESENT(pfield))
THEN 198 ELSEIF (
PRESENT(pfield2))
THEN 200 IF (
PRESENT(haxis)) ylaxis =
trim(haxis)
202 klev=
SIZE(pfield2,2), hcomment=ylcomment,kfreqop=ifreqop)
203 ELSEIF (
PRESENT(pfield3))
THEN 204 ylaxis =
'' ;
IF (
PRESENT(haxis)) ylaxis =
trim(haxis)
205 ylaxis2=
'' ;
IF (
PRESENT(haxis2)) ylaxis2 =
trim(haxis2)
207 haxis =ylaxis , klev =
SIZE(pfield3,2), &
208 haxis2=ylaxis2, klev2=
SIZE(pfield3,3), hcomment=ylcomment,kfreqop=ifreqop)
210 CALL abor1_sfx(
"SFX_XIOS_SEND_BLOCK: NO PFIELDx FOR "//
trim(yltag))
213 IF (
lhook)
CALL dr_hook(
'SFX_XIOS_SEND_BLOCK_2',1,zhook_handle)
217 IF (.NOT. xios_is_valid_field(yltag))
THEN 219 &
" WASN'T DECLARED TO XIOS (NEITHER IN XML CONFIG FILE, NOR SOON ENOUGH FROM CODE)")
224 IF (
lhook)
CALL dr_hook(
'SFX_XIOS_SEND_BLOCK_3',0,zhook_handle)
228 IF (
trim(ylfields(ji)%YLNAME) ==
'')
THEN 234 IF (
lhook)
CALL dr_hook(
'SFX_XIOS_SEND_BLOCK_3',1,zhook_handle)
235 IF (
lhook)
CALL dr_hook(
'SFX_XIOS_SEND_BLOCK_4',0,zhook_handle)
238 IF ( iempty == 0 )
THEN 240 IF (isize > imaxsize)
THEN 241 CALL abor1_sfx(
"SFX_XIOS_SEND_BLOCK: MAX BUFFER ENTRIES NUMBER WAS REACHED")
244 ALLOCATE(yltemp(isize))
248 ALLOCATE(ylfields(isize+incr))
249 ylfields(1:isize) = yltemp(1:isize)
252 ylfields(isize+1:isize+incr)%YLNAME =
'' 259 IF (
lhook)
CALL dr_hook(
'SFX_XIOS_SEND_BLOCK_4',1,zhook_handle)
260 IF (
lhook)
CALL dr_hook(
'SFX_XIOS_SEND_BLOCK_5',0,zhook_handle)
264 ylf => ylfields(iempty)
265 ylf%YLNAME =
trim(yltag)
267 CALL xios_is_defined_field_attr(yltag, grid_ref=glisdef)
269 CALL xios_get_field_attr(yltag, grid_ref=ylgrid)
270 IF (ylgrid(1:4)==
'FULL')
THEN 272 ELSEIF (ylgrid(1:3)==
'SEA')
THEN 274 ELSEIF (ylgrid(1:5)==
'WATER')
THEN 276 ELSEIF (ylgrid(1:6)==
'NATURE')
THEN 278 ELSEIF (ylgrid(1:4)==
'TOWN')
THEN 282 CALL xios_is_defined_field_attr(yltag, domain_ref=glisdef)
284 CALL xios_get_field_attr(yltag, domain_ref=yldomain)
286 CALL abor1_sfx(
'SFX_XIOS_SEND_BLOCK : FIELD '//
trim(yltag)//
' HAS NO DOMAIN')
290 CALL xios_get_domain_attr(yldomain, data_ni=iidim)
294 IF (
lhook)
CALL dr_hook(
'SFX_XIOS_SEND_BLOCK_5',1,zhook_handle)
295 IF (
lhook)
CALL dr_hook(
'SFX_XIOS_SEND_BLOCK_6',0,zhook_handle)
298 IF (
PRESENT(pfield))
THEN 302 infields = infields+1
304 IF (
PRESENT(pfield2))
THEN 305 ylf%ILEV =
SIZE(pfield2,2)
308 infields = infields+1
310 IF (
PRESENT(pfield3))
THEN 311 ylf%ILEV =
SIZE(pfield3,2)
312 ylf%ILEV2 =
SIZE(pfield3,3)
314 infields = infields+1
316 IF (infields /= 1 ) &
317 CALL abor1_sfx(
'SFX_XIOS_SEND_BLOCK : TOO FEW OR MANY PFIELDx ARGS FOR '//hdtag)
318 ALLOCATE(ylf%ZFIELD(ylf%ISIZEMAX,ylf%ILEV,ylf%ILEV2))
322 IF (
lhook)
CALL dr_hook(
'SFX_XIOS_SEND_BLOCK_6',1,zhook_handle)
341 IF (
lhook)
CALL dr_hook(
'SFX_XIOS_SEND_BLOCK_7',0,zhook_handle)
342 IF (.NOT.
ALLOCATED(ylf%ZFIELD))
THEN 343 ALLOCATE(ylf%ZFIELD(ylf%ISIZEMAX,ylf%ILEV,ylf%ILEV2))
349 IF (ylf%INDIM ==1 )
THEN 351 ELSEIF (ylf%INDIM ==2 )
THEN 352 itake=
SIZE(pfield2,1)
353 ELSEIF (ylf%INDIM ==3 )
THEN 354 itake=
SIZE(pfield3,1)
357 ylf%IBLOCK = ylf%IBLOCK+1
358 IF ((ylf%ISIZE + itake) > ylf%ISIZEMAX)
THEN 360 IF (ylf%IBLOCK .NE.
nblock)
THEN 362 " OVERFLOWS - CHECK ITS DECLARATION TO XIOS (MAYBE TWO INCONSISTENT DECLARATIONS ?)")
364 itake = ylf%ISIZEMAX - ylf%ISIZE
368 IF (ylf%INDIM==1)
THEN 369 ylf%ZFIELD(ylf%ISIZE+1:ylf%ISIZE+itake,1,1) = pfield(1:itake)
370 ELSEIF (ylf%INDIM==2)
THEN 371 ylf%ZFIELD(ylf%ISIZE+1:ylf%ISIZE+itake,:,1) = pfield2(1:itake,:)
372 ELSEIF (ylf%INDIM==3)
THEN 373 ylf%ZFIELD(ylf%ISIZE+1:ylf%ISIZE+itake,:,:) = pfield3(1:itake,:,:)
375 ELSEIF ( itake < 0 )
THEN 376 CALL abor1_sfx(
'SFX_XIOS_SEND_BLOCK :isizemax < isize')
379 ylf%ISIZE = ylf%ISIZE + itake
381 IF (
lhook)
CALL dr_hook(
'SFX_XIOS_SEND_BLOCK_7',1,zhook_handle)
382 IF (
lhook)
CALL dr_hook(
'SFX_XIOS_SEND_BLOCK_8',0,zhook_handle)
383 IF (ylf%IBLOCK==
nblock)
THEN 385 IF (ylf%INDIM==1)
THEN 386 CALL xios_send_field(
trim(yltag),ylf%ZFIELD(:,1,1))
387 ELSEIF (ylf%INDIM==2)
THEN 388 CALL xios_send_field(
trim(yltag),ylf%ZFIELD(:,:,1))
389 ELSEIF (ylf%INDIM==3)
THEN 390 CALL xios_send_field(
trim(yltag),ylf%ZFIELD(:,:,:))
394 DEALLOCATE(ylf%ZFIELD)
396 IF (
lhook)
CALL dr_hook(
'SFX_XIOS_SEND_BLOCK_8',1,zhook_handle)
401 IF (
ALLOCATED(ylfields))
DEALLOCATE(ylfields)
static const char * trim(const char *name, int *n)
subroutine abor1_sfx(YTEXT)
subroutine sfx_xios_send_block(HDTAG, PFIELD, PFIELD2, PFIELD3, HDOMAIN, HAXIS, HAXIS2, HDCOMMENT, KFREQOP)
subroutine sfx_xios_declare_field(HREC, HDOMAIN, HAXIS, KLEV, HAXIS2, KLEV2, HCOMMENT, KFREQOP)