34 CHARACTER(LEN=*),
PARAMETER ::
notdef =
'NOT DEFINED' 50 SUBROUTINE dist_close(UNIT, FILE, STATUS, IOSTAT)
52 INTEGER(KIND=JPIM),
INTENT(IN) :: UNIT
53 CHARACTER(LEN=*),
INTENT(IN),
OPTIONAL :: FILE, STATUS
54 INTEGER(KIND=JPIM),
INTENT(OUT),
OPTIONAL :: IOSTAT
56 INTEGER(KIND=JPIM) :: IERR, I
58 CHARACTER(LEN=255) CL_FILE
59 CHARACTER(LEN=80) CL_STATUS
61 REAL(KIND=JPRB) :: ZHOOK_HANDLE
62 IF (
lhook)
CALL dr_hook(
'DISTIO_MIX:DIST_CLOSE',0,zhook_handle)
65 IF (
PRESENT(status))
THEN 66 cl_status = adjustl(status)
72 INQUIRE(unit=unit, opened=opened)
75 IF (
PRESENT(file) .AND. .NOT.
PRESENT(status))
THEN 81 cl_file = adjustl(file)
83 IF (i > 0) cl_status =
'DELETE' 87 CLOSE(unit, status=
trim(cl_status), iostat=ierr)
90 IF (
PRESENT(iostat))
THEN 93 IF (
lhook)
CALL dr_hook(
'DISTIO_MIX:DIST_CLOSE',1,zhook_handle)
100 CHARACTER(LEN=*),
INTENT(IN) :: FILE
101 LOGICAL,
INTENT(OUT) :: EXIST
102 INTEGER(KIND=JPIM) :: I_EXIST
104 REAL(KIND=JPRB) :: ZHOOK_HANDLE
105 IF (
lhook)
CALL dr_hook(
'DISTIO_MIX:DIST_INQUIRE',0,zhook_handle)
116 INQUIRE(file=file, exist=exist)
117 IF (exist) i_exist = 1
127 CALL mpl_broadcast(i_exist,kroot=
iroot,ktag=
itag, &
128 & cdstring=
'DIST_INQUIRE:')
132 exist = (i_exist == 1)
133 IF (
lhook)
CALL dr_hook(
'DISTIO_MIX:DIST_INQUIRE',1,zhook_handle)
139 !-- Optional parameters (FORTRAN-OPEN style) --
140 &unit, file, iostat,&
141 &status, form, action,&
191 INTEGER(KIND=JPIM),
INTENT(IN),
OPTIONAL :: UNIT
194 CHARACTER(LEN=*),
INTENT(IN),
OPTIONAL :: FILE
206 INTEGER(KIND=JPIM),
INTENT(OUT),
OPTIONAL :: IOSTAT
209 CHARACTER(LEN=*),
INTENT(IN),
OPTIONAL :: STATUS, FORM, ACTION, ACCESS
210 INTEGER(KIND=JPIM),
INTENT(IN),
OPTIONAL :: RECL
213 CHARACTER(LEN=*),
INTENT(IN),
OPTIONAL :: FMT
216 REAL(KIND=JPRB),
INTENT(OUT),
OPTIONAL :: ARRAY(:)
219 INTEGER(KIND=JPIM),
INTENT(OUT),
OPTIONAL :: IARRAY(:)
223 CHARACTER(LEN=*),
INTENT(OUT),
OPTIONAL :: LOCALFILE
227 INTEGER(KIND=JPIM) :: IERR, ITMP
228 INTEGER(KIND=JPIM) :: I_UNIT, I_RECL
229 LOGICAL LL_OPEN, LL_CLOSE, LL_HAS_BEEN_COMMUNICATED
230 LOGICAL LL_READ_ONLY, LL_FORMATTED, LL_DIRECT_ACCESS
231 LOGICAL LL_REAL_ARRAY, LL_HAS_ARRAY
232 CHARACTER(LEN=255) CL_FILE, CL_TMPNAME
233 CHARACTER(LEN= 80) CL_STATUS, CL_ACTION, CL_FORM, CL_ACCESS, CL_FMT
237 REAL(KIND=JPRB) :: ZHOOK_HANDLE
238 IF (
lhook)
CALL dr_hook(
'DISTIO_MIX:DIST_OPEN',0,zhook_handle)
252 IF (
PRESENT(unit))
THEN 260 IF (
PRESENT(file))
THEN 261 cl_file = adjustl(file)
264 WRITE(cl_file,
"('fort.',i4)") i_unit
265 CALL strip(cl_file,
' ')
273 IF (
PRESENT(status))
THEN 274 cl_status = adjustl(status)
281 IF (
PRESENT(action))
THEN 282 cl_action = adjustl(action)
289 &(cl_status ==
'OLD' .OR. cl_status ==
'UNKNOWN')&
291 &(cl_action ==
'READ') )
293 IF (.NOT. ll_read_only)
THEN 298 IF (
PRESENT(fmt))
THEN 305 IF (
PRESENT(form))
THEN 306 cl_form = adjustl(form)
309 cl_form =
'FORMATTED' 312 ll_formatted = (cl_form ==
'FORMATTED')
314 IF (ll_formatted)
THEN 315 IF (cl_fmt /=
'*')
THEN 316 itmp = len_trim(cl_fmt)
319 ELSE IF (cl_fmt(1:1) /=
'(' .AND. cl_fmt(itmp:itmp) /=
')')
THEN 326 IF (
PRESENT(access))
THEN 327 cl_access = adjustl(access)
330 cl_access =
'SEQUENTIAL' 333 ll_direct_access = (cl_access ==
'DIRECT')
335 IF ( ll_direct_access .AND. ll_formatted .AND. cl_fmt ==
'*')
THEN 340 IF (
PRESENT(recl))
THEN 346 IF (ll_direct_access .AND. i_recl <= 0)
THEN 351 ll_real_array = .true.
353 IF (
PRESENT(array))
THEN 354 ll_real_array = .true.
355 ELSE IF (
PRESENT(iarray))
THEN 356 ll_real_array = .false.
359 ll_has_array = (
PRESENT(array) .OR.
PRESENT(iarray))
361 IF (.NOT. ll_has_array .AND. .NOT.
PRESENT(unit))
THEN 366 IF (ierr /= 0) ierr = -(ierr + 10000)
367 IF (ierr < 0)
GOTO 9999
377 IF (.NOT. ll_has_array)
THEN 379 CALL comm_file(cl_file, ll_has_been_communicated)
382 ll_has_been_communicated = .false.
388 IF (ll_has_been_communicated)
THEN 393 IF (
PRESENT(localfile))
THEN 394 IF (scan(cl_file,
'/') > 0)
THEN 395 localfile = adjustl(cl_file)
397 localfile =
'./'//adjustl(cl_file)
404 IF (ll_formatted)
THEN 407 IF (ll_direct_access)
THEN 409 OPEN(unit=i_unit, file=
trim(cl_file),&
410 &status=
trim(cl_status), form=
'FORMATTED',&
411 &access=
'DIRECT', recl=i_recl, action=
'READ',&
412 &iostat=ierr, err=9999)
415 OPEN(unit=i_unit, file=
trim(cl_file),&
416 &status=
trim(cl_status), form=
'FORMATTED',&
417 &access=
'SEQUENTIAL', action=
'READ',&
419 &iostat=ierr, err=9999)
425 IF (ll_direct_access)
THEN 427 OPEN(unit=i_unit, file=
trim(cl_file),&
428 &status=
trim(cl_status), form=
'UNFORMATTED',&
429 &access=
'DIRECT', recl=i_recl, action=
'READ',&
430 &iostat=ierr, err=9999)
433 OPEN(unit=i_unit, file=
trim(cl_file),&
434 &status=
trim(cl_status), form=
'UNFORMATTED',&
435 &access=
'SEQUENTIAL', action=
'READ',&
437 &iostat=ierr, err=9999)
445 IF (ll_has_array)
THEN 446 IF (ll_real_array)
THEN 448 &
trim(adjustl(cl_fmt)), ierr,&
449 &ll_direct_access, ll_formatted)
452 &
trim(adjustl(cl_fmt)), ierr,&
453 &ll_direct_access, ll_formatted)
457 IF (ierr /= 0)
GOTO 9999
460 IF (ll_close)
CLOSE(i_unit, iostat=ierr, err=9999)
463 IF (
PRESENT(iostat))
THEN 466 IF (
lhook)
CALL dr_hook(
'DISTIO_MIX:DIST_OPEN',1,zhook_handle)
473 INTEGER(KIND=JPIM),
INTENT(OUT) :: KUNIT
474 INTEGER(KIND=JPIM) :: J
476 REAL(KIND=JPRB) :: ZHOOK_HANDLE
477 IF (
lhook)
CALL dr_hook(
'DISTIO_MIX:GET_NEXT_UNIT',0,zhook_handle)
480 INQUIRE(unit=j, opened=lopened)
481 IF (.NOT.lopened)
THEN 483 IF (
lhook)
CALL dr_hook(
'DISTIO_MIX:GET_NEXT_UNIT',1,zhook_handle)
487 IF (
lhook)
CALL dr_hook(
'DISTIO_MIX:GET_NEXT_UNIT',1,zhook_handle)
493 INTEGER(KIND=JPIM),
INTENT(IN) ,
OPTIONAL :: KOUT
494 CHARACTER(LEN=*),
INTENT(OUT),
OPTIONAL :: CDOUT
495 INTEGER(KIND=JPIM) :: I
496 REAL(KIND=JPRB) :: ZHOOK_HANDLE
497 IF (
lhook)
CALL dr_hook(
'DISTIO_MIX:GET_MRFSDIR',0,zhook_handle)
499 CALL get_environment_variable(
'DIST_MRFSPATH',
mrfsdir)
502 loop:
DO WHILE (i > 0)
504 IF (
mrfsdir(i:i) /=
'/')
EXIT loop
511 IF (
PRESENT(kout))
THEN 519 WRITE(kout,*)
'GET_MRFSDIR: MRFSDIR="'//
trim(
mrfsdir)//
'"' 521 WRITE(kout,*)
'GET_MRFSDIR: MRFSDIR not present' 526 IF (
PRESENT(cdout))
THEN 529 IF (
lhook)
CALL dr_hook(
'DISTIO_MIX:GET_MRFSDIR',1,zhook_handle)
537 INTEGER(KIND=JPIM),
INTENT(IN) ,
OPTIONAL :: KOUT
538 INTEGER(KIND=JPIM),
INTENT(OUT),
OPTIONAL :: KMAXSIZE
539 REAL(KIND=JPRB) :: ZHOOK_HANDLE
540 IF (
lhook)
CALL dr_hook(
'DISTIO_MIX:GET_DIST_MAXFILESIZE',0,zhook_handle)
550 IF (
PRESENT(kout))
THEN 557 WRITE(kout,
'(1x,2a,i12,a)')&
558 &
'GET_DIST_MAXFILESIZE: ',&
559 &
'Largest file to be distributed: ',&
564 IF (
PRESENT(kmaxsize))
THEN 567 IF (
lhook)
CALL dr_hook(
'DISTIO_MIX:GET_DIST_MAXFILESIZE',1,zhook_handle)
577 CHARACTER(LEN=*),
INTENT(INOUT) :: CDS
578 INTEGER(KIND=JPIM),
PARAMETER :: ICH_A = ichar(
'A')
579 INTEGER(KIND=JPIM),
PARAMETER :: ICHA = ichar(
'a')
580 INTEGER(KIND=JPIM),
PARAMETER :: ICHZ = ichar(
'z')
581 INTEGER(KIND=JPIM) :: I, ICH, NEW_ICH, ILEN
583 REAL(KIND=JPRB) :: ZHOOK_HANDLE
584 IF (
lhook)
CALL dr_hook(
'DISTIO_MIX:TOUPPER',0,zhook_handle)
589 IF ( ich >= icha .AND. ich <= ichz )
THEN 590 new_ich = ich + (ich_a - icha)
595 IF (
lhook)
CALL dr_hook(
'DISTIO_MIX:TOUPPER',1,zhook_handle)
598 SUBROUTINE strip(CDS,CDWHAT)
601 CHARACTER(LEN=*),
INTENT(INOUT) :: CDS
602 CHARACTER(LEN=1),
INTENT(IN) :: CDWHAT
603 CHARACTER(LEN=LEN(CDS)) CLS
604 INTEGER(KIND=JPIM) :: I, J, ILEN
606 REAL(KIND=JPRB) :: ZHOOK_HANDLE
607 IF (
lhook)
CALL dr_hook(
'DISTIO_MIX:STRIP',0,zhook_handle)
613 IF (ch /= cdwhat)
THEN 618 cds =
trim(adjustl(cls))
619 IF (
lhook)
CALL dr_hook(
'DISTIO_MIX:STRIP',1,zhook_handle)
624 CHARACTER(LEN=*),
INTENT(OUT) :: CLFILE
625 CHARACTER(LEN=*),
INTENT(IN) :: CDFILE
626 LOGICAL,
PARAMETER :: LL_REVERSE = .true.
627 INTEGER(KIND=JPIM) :: I
628 REAL(KIND=JPRB) :: ZHOOK_HANDLE
629 IF (
lhook)
CALL dr_hook(
'DISTIO_MIX:MAKE_LOCAL_FILENAME',0,zhook_handle)
630 clfile = adjustl(cdfile)
631 i = scan(clfile,
'/',ll_reverse)
632 IF (i > 0) clfile(1:i) =
' ' 633 clfile =
trim(adjustl(clfile))
635 WRITE(clfile,
"(a,'.',i4.4)")
trim(adjustl(clfile)),
myproc 636 IF (
lhook)
CALL dr_hook(
'DISTIO_MIX:MAKE_LOCAL_FILENAME',1,zhook_handle)
642 CHARACTER(LEN=*),
INTENT(IN) :: CDFILE
643 LOGICAL,
INTENT(OUT) :: LDSTATUS
645 INTEGER(KIND=JPIM) :: IFILESIZE
646 INTEGER(KIND=JPIM),
ALLOCATABLE :: FILE_CONTENTS(:)
647 LOGICAL LL_HAS_BEEN_COMMUNICATED
648 CHARACTER(LEN=255) CL_TMPNAME
649 CHARACTER(LEN=4) CL_PROCID
651 REAL(KIND=JPRB) :: ZHOOK_HANDLE
652 IF (
lhook)
CALL dr_hook(
'DISTIO_MIX:COMM_FILE',0,zhook_handle)
653 ll_has_been_communicated = .false.
655 IF (
nproc <= 1)
GOTO 9999
661 CALL util_filesize(
trim(cdfile), ifilesize)
663 IF (ifilesize >
maxfilesize) ifilesize = -ifilesize
672 CALL mpl_broadcast(ifilesize,kroot=
iroot,ktag=
itag, &
673 & cdstring=
'COMM_FILE:')
675 IF (ifilesize > 0)
THEN 677 ALLOCATE(file_contents(
iwords))
681 CALL util_readraw(
trim(cdfile), file_contents, ifilesize,
iret)
682 IF (
iret /= ifilesize)
THEN 684 CALL mpl_message(ldabort=.true., &
685 & cdmessage=
'File "'//
trim(cdfile)//
'" read error at proc#1', &
686 & cdstring=
'** Problems with UTIL_READRAW **')
698 CALL mpl_broadcast(file_contents(1:
ilen),kroot=
iroot,ktag=
itag, &
699 & cdstring=
'COMM_FILE:')
706 CALL util_writeraw(
trim(cl_tmpname), file_contents, ifilesize,
iret)
707 IF (
iret /= ifilesize)
THEN 708 WRITE(cl_procid,
'(i4)')
myproc 710 CALL mpl_message(ldabort=.true., &
711 & cdmessage=
'File "'//
trim(cl_tmpname)//
'" write error at proc#'&
712 &//
trim(adjustl(cl_procid)), &
713 & cdstring=
'** Problems with UTIL_WRITERAW **')
717 DEALLOCATE(file_contents)
718 ll_has_been_communicated = .true.
722 ldstatus = ll_has_been_communicated
723 IF (
lhook)
CALL dr_hook(
'DISTIO_MIX:COMM_FILE',1,zhook_handle)
728 &LL_DIRECT_ACCESS, LL_FORMATTED)
730 INTEGER(KIND=JPIM),
INTENT(IN) :: I_UNIT
731 REAL(KIND=JPRB),
INTENT(INOUT) :: ARRAY(:)
732 LOGICAL,
INTENT(IN),
OPTIONAL ::LL_DIRECT_ACCESS, LL_FORMATTED
733 CHARACTER(LEN=*),
INTENT(IN) :: CDFMT
734 INTEGER(KIND=JPIM),
INTENT(OUT) :: IERR
736 LOGICAL LL_FREE_FORMAT, LL_PBIO
737 INTEGER(KIND=JPIM) :: I_SIZE
739 REAL(KIND=JPRB) :: ZHOOK_HANDLE
740 IF (
lhook)
CALL dr_hook(
'DISTIO_MIX:REAL_COMM_ARRAY',0,zhook_handle)
741 ll_free_format = (cdfmt ==
'*')
742 ll_pbio = (cdfmt ==
'PBIO')
747 CALL pbread(i_unit, array, i_size*
jpreabyt, ierr)
748 IF (ierr == i_size*
jpreabyt) ierr = 0
750 IF (ll_formatted)
THEN 751 IF (ll_direct_access)
THEN 752 READ(i_unit, fmt=cdfmt, iostat=ierr, err=9999,rec=1) array
754 IF (ll_free_format)
THEN 755 READ(i_unit, fmt=*, iostat=ierr, err=9999,end=9999) array
757 READ(i_unit, fmt=cdfmt, iostat=ierr, err=9999,end=9999) array
761 IF (ll_direct_access)
THEN 762 READ(i_unit, iostat=ierr, err=9999, rec=1) array
764 READ(i_unit, iostat=ierr, err=9999,end=9999) array
779 CALL mpl_broadcast(ierr,kroot=
iroot,ktag=
itag, &
780 & cdstring=
'REAL_COMM_ARRAY:')
790 & cdstring=
'REAL_COMM_ARRAY:')
796 IF (
lhook)
CALL dr_hook(
'DISTIO_MIX:REAL_COMM_ARRAY',1,zhook_handle)
802 &LL_DIRECT_ACCESS, LL_FORMATTED)
804 INTEGER(KIND=JPIM),
INTENT(IN) :: I_UNIT
805 INTEGER(KIND=JPIM),
INTENT(INOUT) :: IARRAY(:)
806 LOGICAL,
INTENT(IN),
OPTIONAL :: LL_DIRECT_ACCESS, LL_FORMATTED
807 CHARACTER(LEN=*),
INTENT(IN) :: CDFMT
808 INTEGER(KIND=JPIM),
INTENT(OUT) :: IERR
810 LOGICAL LL_FREE_FORMAT, LL_PBIO
811 INTEGER(KIND=JPIM) :: I_SIZE
813 REAL(KIND=JPRB) :: ZHOOK_HANDLE
814 IF (
lhook)
CALL dr_hook(
'DISTIO_MIX:INT_COMM_ARRAY',0,zhook_handle)
815 ll_free_format = (cdfmt ==
'*')
816 ll_pbio = (cdfmt ==
'PBIO')
817 i_size =
SIZE(iarray)
821 CALL pbread(i_unit, iarray, i_size*
jpintbyt, ierr)
822 IF (ierr == i_size*
jpintbyt) ierr = 0
824 IF (ll_formatted)
THEN 825 IF (ll_direct_access)
THEN 826 READ(i_unit, fmt=cdfmt, iostat=ierr, err=9999,rec=1) iarray
828 IF (ll_free_format)
THEN 829 READ(i_unit, fmt=*, iostat=ierr, err=9999,end=9999) iarray
831 READ(i_unit, fmt=cdfmt, iostat=ierr, err=9999,end=9999) iarray
835 IF (ll_direct_access)
THEN 836 READ(i_unit, iostat=ierr, err=9999, rec=1) iarray
838 READ(i_unit, iostat=ierr, err=9999,end=9999) iarray
853 CALL mpl_broadcast(ierr,kroot=
iroot,ktag=
itag,kerror=ierr)
863 & cdstring=
'INT_COMM_ARRAY:')
869 IF (
lhook)
CALL dr_hook(
'DISTIO_MIX:INT_COMM_ARRAY',1,zhook_handle)
872 SUBROUTINE mrfsfile(FILE_IN, FILE_OUT)
883 CHARACTER(LEN=*),
INTENT(IN) :: FILE_IN
884 CHARACTER(LEN=*),
INTENT(OUT) :: FILE_OUT
887 CHARACTER(LEN=255),
SAVE :: MRFSDIR =
' ' 888 LOGICAL,
SAVE :: ALREADY_CALLED = .false.
889 LOGICAL,
SAVE :: HAS_MRFSDIR = .false.
892 REAL(KIND=JPRB) :: ZHOOK_HANDLE
893 IF (
lhook)
CALL dr_hook(
'DISTIO_MIX:MRFSFILE',0,zhook_handle)
894 IF (.NOT. already_called)
THEN 896 has_mrfsdir = (mrfsdir /=
' ')
897 already_called = .true.
900 IF (has_mrfsdir)
THEN 902 file_out =
trim(adjustl(mrfsdir))//
'/'//
trim(adjustl(file_in))
908 IF (
lhook)
CALL dr_hook(
'DISTIO_MIX:MRFSFILE',1,zhook_handle)
static const char * trim(const char *name, int *n)
subroutine real_comm_array(I_UNIT, ARRAY, CDFMT, IERR, LL_DIRECT_ACCESS, LL_FORMATTED)
subroutine comm_file(CDFILE, LDSTATUS)
subroutine strip(CDS, CDWHAT)
subroutine, public dist_close(UNIT, FILE, STATUS, IOSTAT)
subroutine make_local_filename(CLFILE, CDFILE)
integer(kind=jpim), parameter jpintbyt
integer(kind=jpim) myproc
subroutine, public get_mrfsdir(KOUT, CDOUT)
character(len=255), save mrfsdir
integer(kind=jpim), save maxfilesize
character(len= *), parameter notdef
integer(kind=jpim) iwords
subroutine, public dist_open(unit, file, iostat, status, form, action, access, recl, fmt, ARRAY, IARRAY, localfile)
subroutine int_comm_array(I_UNIT, IARRAY, CDFMT, IERR, LL_DIRECT_ACCESS, LL_FORMATTED)
subroutine, public mrfsfile(FILE_IN, FILE_OUT)
character(len=12), save dist_maxfilesize
integer(kind=jpim), parameter jpe_integer
integer(kind=jpim), parameter jpreabyt
integer(kind=jpim), parameter jpe_byte
logical, save ll_has_mrfsdir
subroutine, public dist_inquire(FILE, EXIST)
integer(kind=jpim), parameter jp_maxunit
integer(kind=jpim), parameter jpe_real
integer(kind=jpim), parameter jp_minunit
subroutine, public get_next_unit(KUNIT)
subroutine, public get_dist_maxfilesize(KOUT, KMAXSIZE)