15 SUBROUTINE read_surf_layers (HPROGRAM,HREC,ODIM,PFIELD,KRESP,HCOMMENT,HDIR,KPATCH)
42 USE modi_make_choice_array
57 CHARACTER(LEN=6),
INTENT(IN) :: HPROGRAM
58 CHARACTER(LEN=*),
INTENT(IN) :: HREC
59 LOGICAL,
INTENT(IN) :: ODIM
60 REAL,
DIMENSION(:,:,:),
INTENT(OUT) :: PFIELD
61 INTEGER,
INTENT(OUT) :: KRESP
62 CHARACTER(LEN=*),
OPTIONAL,
INTENT(OUT) :: HCOMMENT
63 CHARACTER(LEN=1),
OPTIONAL,
INTENT(IN) :: HDIR
67 INTEGER,
OPTIONAL,
INTENT(IN) :: KPATCH
72 INTEGER,
DIMENSION(MPI_STATUS_SIZE,NPROC-1) :: ISTATUS
75 REAL,
DIMENSION(:,:),
ALLOCATABLE :: ZWORKR
76 REAL,
DIMENSION(:,:),
ALLOCATABLE :: ZFIELD
77 INTEGER,
DIMENSION(:),
POINTER :: IMASKF
78 CHARACTER(LEN=100) :: YCOMMENT
79 CHARACTER(LEN=16) :: YREC
80 CHARACTER(LEN=1) :: YDIR
81 CHARACTER(LEN=4) :: YLVL
82 INTEGER :: IFLAG, IPATCH, INPATCH
83 INTEGER :: IPIO_SAVE, IPAS, JP, IDEB, IFIN, JJ, JL
84 INTEGER :: JLAYER, JPROC, IPROC, IRESP
85 INTEGER :: IL1, IL2, IL3, IDX_SAVE, IDX, IVAL
86 INTEGER :: INFOMPI, IREQ, JPROC2, IFULL
87 REAL(KIND=JPRB) :: ZHOOK_HANDLE, ZHOOK_HANDLE_OMP
89 IF (
lhook)
CALL dr_hook(
'READ_SURF_LAYERS_1',0,zhook_handle)
95 IF (
PRESENT(hdir)) ydir = hdir
96 inpatch =
SIZE(pfield,3)
98 IF (
PRESENT(kpatch).AND.inpatch==1) ipatch = kpatch
104 IF (
lhook)
CALL dr_hook(
'READ_SURF_LAYERS_1',1,zhook_handle)
106 IF (hprogram==
'MESONH')
THEN 109 WRITE(ylvl,
'(I4)') jl
110 yrec=
trim(hrec)//adjustl(ylvl(:len_trim(ylvl)))
111 CALL make_choice_array(hprogram, inpatch, odim, yrec, pfield(:,jl,:), hdir=ydir, kpatch=ipatch)
116 IF (
lhook)
CALL dr_hook(
'READ_SURF_LAYERS_2',0,zhook_handle)
119 IF (hprogram==
'LFI ')
THEN 122 ALLOCATE(zfield(nfull_lfi,il3))
125 ELSEIF (hprogram==
'ASCII ')
THEN 128 ALLOCATE(zfield(nfull_asc,il3))
131 ELSEIF (hprogram==
'FA ')
THEN 134 ALLOCATE(zfield(nfull_fa,il3))
137 ELSEIF (hprogram==
'NC ')
THEN 140 ALLOCATE(zfield(nfull_nc,il3))
144 ALLOCATE(zfield(0,0))
150 ALLOCATE(zworkr(
nsize,il3))
152 ALLOCATE(zworkr(ifull,il3))
154 ALLOCATE(zworkr(0,0))
158 IF (
nproc>1 .AND. ydir==
'H')
THEN 162 IF (
ALLOCATED(
nindex))
THEN 163 IF (
SIZE(
nindex)==ifull) iflag=1
175 ipas = ceiling(il2*1./
nproc)
182 IF (
lhook)
CALL dr_hook(
'READ_SURF_LAYERS_2',1,zhook_handle)
186 IF (
lhook)
CALL dr_hook(
'READ_SURF_LAYERS_3',0,zhook_handle)
191 IF (jlayer<=il2)
THEN 193 WRITE(ylvl,
'(I4)') jlayer
194 yrec =
trim(hrec)//adjustl(ylvl(:len_trim(ylvl)))
195 ycomment=
'X_Y_'//yrec
198 IF (hprogram==
'AROME ')
THEN 200 CALL make_choice_array(hprogram, inpatch, odim, yrec, pfield(:,jlayer,:), hdir=ydir, kpatch=ipatch)
210 CALL make_choice_array(hprogram, inpatch, odim, yrec, zfield, hdir=
'A', kpatch=ipatch)
221 ELSEIF (ydir==
'A' .OR. ydir==
'E')
THEN 227 CALL mpi_send(zfield,
SIZE(zfield)*kind(zfield)/4,mpi_real,
npio,idx,
ncomm,infompi)
234 CALL abor1_sfx(
"READ_SURF_LAYERS:HDIR MUST BE H OR A OR E")
241 IF (
lhook)
CALL dr_hook(
'READ_SURF_LAYERS_3',1,zhook_handle)
249 IF (
lhook)
CALL dr_hook(
'READ_SURF_LAYERS_4',0,zhook_handle_omp)
256 IF (ipas*jproc + jp<=il2)
THEN 264 IF (jproc/=
nrank)
THEN 265 idx = idx_save + jp + 1
269 CALL mpi_recv(zworkr(:,:),
SIZE(zworkr)*kind(zworkr)/4,&
270 mpi_real,jproc,idx,
ncomm,istatus,infompi)
272 ival = ipas*jproc + jp
283 IF (
lhook)
CALL dr_hook(
'READ_SURF_LAYERS_4',1,zhook_handle_omp)
287 IF (
lhook)
CALL dr_hook(
'READ_SURF_LAYERS_5',0,zhook_handle)
291 IF (ydir==
'H' .AND. ipas*
nrank+jp<=il2 .AND.
nproc>1)
THEN 296 IF (
lhook)
CALL dr_hook(
'READ_SURF_LAYERS_5',1,zhook_handle)
318 IF (
lhook)
CALL dr_hook(
'READ_SURF_LAYERS_7',0,zhook_handle)
320 IF (
nrank/=
npio .AND. ydir==
'H' .AND. iflag==0)
THEN 327 IF (hprogram/=
"AROME ")
DEALLOCATE(zfield)
330 IF (
lhook)
CALL dr_hook(
'READ_SURF_LAYERS_7',1,zhook_handle)
334 IF (
lhook)
CALL dr_hook(
'READ_SURF_LAYERS_8',0,zhook_handle)
337 IF (
PRESENT(hcomment)) hcomment = ycomment
339 IF (
lhook)
CALL dr_hook(
'READ_SURF_LAYERS_8',1,zhook_handle)
static const char * trim(const char *name, int *n)
subroutine make_choice_array(HPROGRAM, KNPATCH, ODIM, HRECFM, PWORK, HDIR, KPATCH)
integer, dimension(:), allocatable nreq
integer, dimension(:), pointer nmask
subroutine read_surf_layers(HPROGRAM, HREC, ODIM, PFIELD, KRESP, HCOMMENT, HDIR, KPATCH)
subroutine abor1_sfx(YTEXT)
integer, dimension(:), pointer nmask
integer, dimension(:), allocatable nindex