28 subroutine openfile(iu, iout, fname, ftype, fmtarg_opt, accarg_opt, &
29 filstat_opt, mode_opt)
34 integer(I4B),
intent(inout) :: iu
35 integer(I4B),
intent(in) :: iout
36 character(len=*),
intent(in) :: fname
37 character(len=*),
intent(in) :: ftype
38 character(len=*),
intent(in),
optional :: fmtarg_opt
39 character(len=*),
intent(in),
optional :: accarg_opt
40 character(len=*),
intent(in),
optional :: filstat_opt
41 integer(I4B),
intent(in),
optional :: mode_opt
43 character(len=20) :: fmtarg
44 character(len=20) :: accarg
45 character(len=20) :: filstat
46 character(len=20) :: filact
52 character(len=*),
parameter :: fmtmsg = &
53 "(1x,/1x,'OPENED ',a,/1x,'FILE TYPE:',a,' UNIT ',I4,3x,'STATUS:',a,/ &
54 & 1x,'FORMAT:',a,3x,'ACCESS:',a/1x,'ACTION:',a/)"
55 character(len=*),
parameter :: fmtmsg2 = &
56 "(1x,/1x,'DID NOT OPEN ',a,/)"
59 if (
present(mode_opt))
then
68 write (iout, fmtmsg2) trim(fname)
78 if (
present(fmtarg_opt))
then
82 if (
present(accarg_opt))
then
86 if (
present(filstat_opt))
then
90 if (filstat ==
'OLD')
then
97 iflen = len_trim(fname)
105 inquire (file=fname(1:iflen), number=iuop)
109 open (unit=iu, file=fname(1:iflen), form=fmtarg, access=accarg, &
110 status=filstat,
action=filact, iostat=ivar)
115 write (
errmsg,
'(3a,1x,i0,a)') &
116 'Could not open "', fname(1:iflen),
'" on unit', iu,
'.'
118 write (
errmsg,
'(a,1x,a,1x,i0,a)') &
119 trim(
errmsg),
'File already open on unit', iuop,
'.'
121 write (
errmsg,
'(a,1x,a,1x,a,a)') &
122 trim(
errmsg),
'Specified file status', trim(filstat),
'.'
123 write (
errmsg,
'(a,1x,a,1x,a,a)') &
124 trim(
errmsg),
'Specified file format', trim(fmtarg),
'.'
125 write (
errmsg,
'(a,1x,a,1x,a,a)') &
126 trim(
errmsg),
'Specified file access', trim(accarg),
'.'
127 write (
errmsg,
'(a,1x,a,1x,a,a)') &
128 trim(
errmsg),
'Specified file action', trim(filact),
'.'
129 write (
errmsg,
'(a,1x,a,1x,i0,a)') &
130 trim(
errmsg),
'IOSTAT error number', ivar,
'.'
131 write (
errmsg,
'(a,1x,a)') &
132 trim(
errmsg),
'STOP EXECUTION in subroutine openfile().'
138 write (iout, fmtmsg) fname(1:iflen), ftype, iu, filstat, fmtarg, &
155 integer(I4B),
intent(inout) :: iu
161 inquire (unit=i, opened=opened)
162 if (.not. opened)
exit
181 integer(I4B) :: iunit
198 character(len=*),
intent(inout) :: word
201 integer(I4B) :: idiff
206 idiff = ichar(
'a') - ichar(
'A')
210 IF (word(k:k) >=
'a' .and. word(k:k) <=
'z') &
211 word(k:k) = char(ichar(word(k:k)) - idiff)
225 character(len=*) :: word
227 integer(I4B) :: idiff, k, l
231 idiff = ichar(
'a') - ichar(
'A')
235 if (word(k:k) >=
'A' .and. word(k:k) <=
'Z')
then
236 word(k:k) = char(ichar(word(k:k)) + idiff)
252 character(len=LINELENGTH),
intent(inout) :: name
253 integer(I4B),
intent(in) :: proc_id
255 character(len=LINELENGTH) :: name_local
256 character(len=LINELENGTH) :: name_processor
257 character(len=LINELENGTH) :: extension_local
258 integer(I4B) :: ipos0
259 integer(I4B) :: ipos1
263 ipos0 = index(name_local,
".", back=.true.)
264 ipos1 = len_trim(name)
266 write (extension_local,
'(a)') name(ipos0:ipos1)
271 write (name_processor,
'(a,a,i0,a)') &
272 name(1:ipos0 - 1),
'.p', proc_id, trim(adjustl(extension_local))
273 name = name_processor
285 subroutine uwword(line, icol, ilen, ncode, c, n, r, fmt, alignment, sep)
288 character(len=*),
intent(inout) :: line
289 integer(I4B),
intent(inout) :: icol
290 integer(I4B),
intent(in) :: ilen
291 integer(I4B),
intent(in) :: ncode
292 character(len=*),
intent(in) :: c
293 integer(I4B),
intent(in) :: n
294 real(dp),
intent(in) :: r
295 character(len=*),
optional,
intent(in) :: fmt
296 integer(I4B),
optional,
intent(in) :: alignment
297 character(len=*),
optional,
intent(in) :: sep
299 character(len=16) :: cfmt
300 character(len=16) :: cffmt
301 character(len=ILEN) :: cval
302 integer(I4B) :: ialign
304 integer(I4B) :: ispace
305 integer(I4B) :: istop
307 integer(I4B) :: ireal
314 if (
present(fmt))
then
319 write (cfmt,
'(a,I0,a)')
'(a', ilen,
')'
321 write (cfmt,
'(a,I0,a)')
'(I', ilen,
')'
325 write (cfmt,
'(a,I0,a,I0,a)')
'(1PG', ilen,
'.', i,
')'
331 write (cffmt,
'(a,I0,a)')
'(a', ilen,
')'
333 if (
present(alignment))
then
346 else if (ncode ==
tabreal)
then
351 if (len_trim(adjustl(cval)) > ilen)
then
354 cval = trim(adjustl(cval))
358 ispace = (ilen - i) / 2
361 cval =
' '//trim(adjustl(cval))
363 cval = trim(adjustl(cval))
366 cval = repeat(
' ', ispace)//trim(cval)
368 else if (ialign ==
tableft)
then
369 cval = trim(adjustl(cval))
371 cval =
' '//trim(adjustl(cval))
381 istop = icol + ilen - 1
384 write (line(icol:istop), cffmt) cval
388 if (
present(sep))
then
391 write (line(icol:istop),
'(a)') sep
426 subroutine urword(line, icol, istart, istop, ncode, n, r, iout, in)
428 character(len=*) :: line
429 integer(I4B),
intent(inout) :: icol
430 integer(I4B),
intent(inout) :: istart
431 integer(I4B),
intent(inout) :: istop
432 integer(I4B),
intent(in) :: ncode
433 integer(I4B),
intent(inout) :: n
434 real(dp),
intent(inout) :: r
435 integer(I4B),
intent(in) :: iout
436 integer(I4B),
intent(in) :: in
438 character(len=20) string
441 character(len=1) charend
442 character(len=200) :: msg
443 character(len=linelength) :: msg_line
445 character(len=*),
parameter :: fmtmsgout1 = &
446 "(1X,'FILE UNIT ',I4,' : ERROR CONVERTING ""',A, &
447 & '"" TO ',A,' IN LINE:')"
448 character(len=*),
parameter :: fmtmsgout2 =
"(1x, &
449 & 'KEYBOARD INPUT : ERROR CONVERTING ""',a,'"" TO ',a,' IN LINE:')"
450 character(len=*),
parameter :: fmtmsgout3 =
"('File unit ', &
451 & I0,': Error converting ""',a,'"" to ',A,' in following line:')"
452 character(len=*),
parameter :: fmtmsgout4 = &
453 "('Keyboard input: Error converting ""',a, &
454 & '"" to ',A,' in following line:')"
462 line(linlen:linlen) =
' '
466 if (icol < 1 .or. icol > linlen)
go to 100
471 if (line(i:i) /=
' ' .and. line(i:i) /=
',' .and. &
472 line(i:i) /= tab)
go to 20
480 20
if (line(i:i) == char(34) .or. line(i:i) == char(39))
then
481 if (line(i:i) == char(34))
then
487 if (i <= linlen)
then
489 if (line(j:j) == charend)
go to 40
496 if (line(j:j) ==
' ' .or. line(j:j) ==
',' .or. &
497 line(j:j) == tab)
go to 40
515 idiff = ichar(
'a') - ichar(
'A')
517 if (line(k:k) >=
'a' .and. line(k:k) <=
'z') &
518 line(k:k) = char(ichar(line(k:k)) - idiff)
524 100
if (ncode == 2 .or. ncode == 3)
then
526 l = 30 - istop + istart
528 rw(l:30) = line(istart:istop)
529 if (ncode == 2)
read (rw,
'(i30)', err=200) n
530 if (ncode == 3)
read (rw,
'(f30.0)', err=200) r
535 200
if (ncode == 3)
then
536 string =
'a real number'
539 string =
'an integer'
547 line(linlen + 1:linlen + 1) =
'E'
551 else if (iout > 0)
then
553 write (msg_line, fmtmsgout1) in, line(istart:istop), string(1:l)
555 write (msg_line, fmtmsgout2) line(istart:istop), string(1:l)
563 write (msg_line, fmtmsgout1) in, line(istart:istop), string(1:l)
565 write (msg_line, fmtmsgout2) line(istart:istop), string(1:l)
574 write (msg, fmtmsgout3) in, line(istart:istop), trim(string)
576 write (msg, fmtmsgout4) line(istart:istop), trim(string)
589 subroutine ulstlb(iout, label, caux, ncaux, naux)
591 character(len=*) :: label
592 character(len=16) :: caux(ncaux)
594 character(len=400) buf
596 character(len=1) dash(400)
599 character(len=*),
parameter :: fmtmsgout1 =
"(1x, a)"
600 character(len=*),
parameter :: fmtmsgout2 =
"(1x, 400a)"
606 nbuf = len(label) + 9
611 buf(n1:nbuf) = caux(i)
616 write (iout, fmtmsgout1) buf(1:nbuf)
619 write (iout, fmtmsgout2) (dash(j), j=1, nbuf)
630 subroutine ubdsv4(kstp, kper, text, naux, auxtxt, ibdchn, &
631 & ncol, nrow, nlay, nlist, iout, delt, pertim, totim)
633 character(len=16) :: text
634 character(len=16),
dimension(:) :: auxtxt
635 real(dp),
intent(in) :: delt, pertim, totim
637 character(len=*),
parameter :: fmt = &
638 &
"(1X,'UBDSV4 SAVING ',A16,' ON UNIT',I7,' AT TIME STEP',I7,"// &
639 &
"', STRESS PERIOD',I7)"
642 if (iout > 0)
write (iout, fmt) text, ibdchn, kstp, kper
643 write (ibdchn) kstp, kper, text, ncol, nrow, -nlay
644 write (ibdchn) 5, delt, pertim, totim
645 write (ibdchn) naux + 1
646 if (naux > 0)
write (ibdchn) (auxtxt(n), n=1, naux)
656 subroutine ubdsvb(ibdchn, icrl, q, val, nvl, naux, laux)
658 real(dp),
dimension(nvl) :: val
664 write (ibdchn) icrl, q, (val(n), n=laux, n2)
666 write (ibdchn) icrl, q
682 subroutine ucolno(nlbl1, nlbl2, nspace, ncpl, ndig, iout)
684 character(len=1) :: dot, space, dg, bf
685 dimension :: bf(1000), dg(10)
687 data dg(1), dg(2), dg(3), dg(4), dg(5), dg(6), dg(7), dg(8), dg(9), dg(10)/ &
688 &
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9'/
689 data dot, space/
'.',
' '/
691 character(len=*),
parameter :: fmtmsgout1 =
"(1x)"
692 character(len=*),
parameter :: fmtmsgout2 =
"(1x, 1000a1)"
696 if (iout <= 0)
return
697 write (iout, fmtmsgout1)
699 nlbl = nlbl2 - nlbl1 + 1
702 if (nlbl < ncpl) n = ncpl
703 ntot = nspace + n * ndig
705 if (ntot > 1000)
go to 50
706 nwrap = (nlbl - 1) / ncpl + 1
722 if (j2 > nlbl2) j2 = nlbl2
730 if (i2 == 0)
go to 30
732 i2 = i2 - i3 * 10 + 1
734 if (i3 == 0)
go to 30
736 i3 = i3 - i4 * 10 + 1
738 if (i4 == 0)
go to 30
743 bf(nbf - 3) = dg(i4 + 1)
748 write (iout, fmtmsgout2) (bf(i), i=1, nbf)
754 if (ntot > 1000) ntot = 1000
755 write (iout, fmtmsgout2) (dot, i=1, ntot)
763 subroutine ulaprw(buf, text, kstp, kper, ncol, nrow, ilay, iprn, iout)
765 character(len=16) :: text
766 real(dp),
dimension(ncol, nrow) :: buf
768 character(len=*),
parameter :: fmtmsgout1 = &
769 &
"('1', /2x, a, ' IN LAYER ',I3,' AT END OF TIME STEP ',I3, &
770 & ' IN STRESS PERIOD ',I4/2x,75('-'))"
771 character(len=*),
parameter :: fmtmsgout2 = &
772 &
"('1',/1x,A,' FOR CROSS SECTION AT END OF TIME STEP',I3, &
773 & ' IN STRESS PERIOD ',I4/1x,79('-'))"
774 character(len=*),
parameter :: fmtg10 = &
775 &
"(1X,I3,2X,1PG10.3,10(1X,G10.3):/(5X,11(1X,G10.3)))"
776 character(len=*),
parameter :: fmtg13 = &
777 &
"(1x,I3,2x,1PG13.6,8(1x,G13.6):/(5x,9(1x,G13.6)))"
778 character(len=*),
parameter :: fmtf7pt1 = &
779 &
"(1x,I3,1x,15(1x,F7.1):/(5x,15(1x,F7.1)))"
780 character(len=*),
parameter :: fmtf7pt2 = &
781 &
"(1x,I3,1x,15(1x,F7.2):/(5x,15(1x,F7.2)))"
782 character(len=*),
parameter :: fmtf7pt3 = &
783 &
"(1x,I3,1x,15(1x,F7.3):/(5x,15(1x,F7.3)))"
784 character(len=*),
parameter :: fmtf7pt4 = &
785 &
"(1x,I3,1x,15(1x,F7.4):/(5x,15(1x,F7.4)))"
786 character(len=*),
parameter :: fmtf5pt0 = &
787 &
"(1x,I3,1x,20(1x,F5.0):/(5x,20(1x,F5.0)))"
788 character(len=*),
parameter :: fmtf5pt1 = &
789 &
"(1x,I3,1x,20(1x,F5.1):/(5x,20(1x,F5.1)))"
790 character(len=*),
parameter :: fmtf5pt2 = &
791 &
"(1x,I3,1x,20(1x,F5.2):/(5x,20(1x,F5.2)))"
792 character(len=*),
parameter :: fmtf5pt3 = &
793 &
"(1x,I3,1x,20(1x,F5.3):/(5x,20(1x,F5.3)))"
794 character(len=*),
parameter :: fmtf5pt4 = &
795 &
"(1x,I3,1x,20(1x,F5.4):/(5x,20(1x,F5.4)))"
796 character(len=*),
parameter :: fmtg11 = &
797 &
"(1x,I3,2x,1PG11.4,9(1x,G11.4):/(5x,10(1x,G11.4)))"
798 character(len=*),
parameter :: fmtf6pt0 = &
799 &
"(1x,I3,1x,10(1x,F6.0):/(5X,10(1x,F6.0)))"
800 character(len=*),
parameter :: fmtf6pt1 = &
801 &
"(1x,I3,1x,10(1x,F6.1):/(5x,10(1x,F6.1)))"
802 character(len=*),
parameter :: fmtf6pt2 = &
803 &
"(1x,I3,1x,10(1x,F6.2):/(5x,10(1x,F6.2)))"
804 character(len=*),
parameter :: fmtf6pt3 = &
805 &
"(1x,I3,1x,10(1x,F6.3):/(5x,10(1x,F6.3)))"
806 character(len=*),
parameter :: fmtf6pt4 = &
807 &
"(1x,I3,1x,10(1x,F6.4):/(5x,10(1x,F6.4)))"
808 character(len=*),
parameter :: fmtf6pt5 = &
809 &
"(1x,I3,1x,10(1x,F6.5):/(5x,10(1x,F6.5)))"
810 character(len=*),
parameter :: fmtg12 = &
811 &
"(1x,I3,2x,1PG12.5,4(1x,G12.5):/(5x,5(1x,G12.5)))"
812 character(len=*),
parameter :: fmtg11pt4 = &
813 &
"(1x,I3,2x,1PG11.4,5(1x,G11.4):/(5x,6(1x,G11.4)))"
814 character(len=*),
parameter :: fmtg9pt2 = &
815 &
"(1x,I3,2x,1PG9.2,6(1x,G9.2):/(5x,7(1x,G9.2)))"
817 if (iout <= 0)
return
820 write (iout, fmtmsgout1) text, ilay, kstp, kper
821 else if (ilay < 0)
then
822 write (iout, fmtmsgout2) text, kstp, kper
827 if (ip < 1 .or. ip > 21) ip = 12
830 if (ip == 1)
call ucolno(1, ncol, 0, 11, 11, iout)
831 if (ip == 2)
call ucolno(1, ncol, 0, 9, 14, iout)
832 if (ip >= 3 .and. ip <= 6)
call ucolno(1, ncol, 3, 15, 8, iout)
833 if (ip >= 7 .and. ip <= 11)
call ucolno(1, ncol, 3, 20, 6, iout)
834 if (ip == 12)
call ucolno(1, ncol, 0, 10, 12, iout)
835 if (ip >= 13 .and. ip <= 18)
call ucolno(1, ncol, 3, 10, 7, iout)
836 if (ip == 19)
call ucolno(1, ncol, 0, 5, 13, iout)
837 if (ip == 20)
call ucolno(1, ncol, 0, 6, 12, iout)
838 if (ip == 21)
call ucolno(1, ncol, 0, 7, 10, iout)
846 write (iout, fmtg10) i, (buf(j, i), j=1, ncol)
850 write (iout, fmtg13) i, (buf(j, i), j=1, ncol)
854 write (iout, fmtf7pt1) i, (buf(j, i), j=1, ncol)
858 write (iout, fmtf7pt2) i, (buf(j, i), j=1, ncol)
862 write (iout, fmtf7pt3) i, (buf(j, i), j=1, ncol)
866 write (iout, fmtf7pt4) i, (buf(j, i), j=1, ncol)
870 write (iout, fmtf5pt0) i, (buf(j, i), j=1, ncol)
874 write (iout, fmtf5pt1) i, (buf(j, i), j=1, ncol)
878 write (iout, fmtf5pt2) i, (buf(j, i), j=1, ncol)
882 write (iout, fmtf5pt3) i, (buf(j, i), j=1, ncol)
886 write (iout, fmtf5pt4) i, (buf(j, i), j=1, ncol)
890 write (iout, fmtg11) i, (buf(j, i), j=1, ncol)
894 write (iout, fmtf6pt0) i, (buf(j, i), j=1, ncol)
898 write (iout, fmtf6pt1) i, (buf(j, i), j=1, ncol)
902 write (iout, fmtf6pt2) i, (buf(j, i), j=1, ncol)
906 write (iout, fmtf6pt3) i, (buf(j, i), j=1, ncol)
910 write (iout, fmtf6pt4) i, (buf(j, i), j=1, ncol)
914 write (iout, fmtf6pt5) i, (buf(j, i), j=1, ncol)
918 write (iout, fmtg12) i, (buf(j, i), j=1, ncol)
922 write (iout, fmtg11pt4) i, (buf(j, i), j=1, ncol)
926 write (iout, fmtg9pt2) i, (buf(j, i), j=1, ncol)
940 subroutine ulasav(buf, text, kstp, kper, pertim, totim, ncol, nrow, &
943 character(len=16) :: text
944 real(dp),
dimension(ncol, nrow) :: buf
945 real(dp) :: pertim, totim
948 write (ichn) kstp, kper, pertim, totim, text, ncol, nrow, ilay
952 write (ichn) ((buf(ic, ir), ic=1, ncol), ir=1, nrow)
964 subroutine ubdsv1(kstp, kper, text, ibdchn, buff, ncol, nrow, nlay, iout, &
968 integer(I4B),
intent(in) :: kstp
969 integer(I4B),
intent(in) :: kper
970 character(len=*),
intent(in) :: text
971 integer(I4B),
intent(in) :: ibdchn
972 real(dp),
dimension(:),
intent(in) :: buff
973 integer(I4B),
intent(in) :: ncol
974 integer(I4B),
intent(in) :: nrow
975 integer(I4B),
intent(in) :: nlay
976 integer(I4B),
intent(in) :: iout
977 real(dp),
intent(in) :: delt
978 real(dp),
intent(in) :: pertim
979 real(dp),
intent(in) :: totim
981 character(len=*),
parameter :: fmt = &
982 &
"(1X,'UBDSV1 SAVING ',A16,' ON UNIT',I7,' AT TIME STEP',I7,"// &
983 &
"', STRESS PERIOD',I7)"
986 if (iout > 0)
write (iout, fmt) text, ibdchn, kstp, kper
987 write (ibdchn) kstp, kper, text, ncol, nrow, -nlay
988 write (ibdchn) 1, delt, pertim, totim
1003 subroutine ubdsv06(kstp, kper, text, modelnam1, paknam1, modelnam2, paknam2, &
1004 ibdchn, naux, auxtxt, ncol, nrow, nlay, nlist, iout, &
1005 delt, pertim, totim)
1008 integer(I4B),
intent(in) :: kstp
1009 integer(I4B),
intent(in) :: kper
1010 character(len=*),
intent(in) :: text
1011 character(len=*),
intent(in) :: modelnam1
1012 character(len=*),
intent(in) :: paknam1
1013 character(len=*),
intent(in) :: modelnam2
1014 character(len=*),
intent(in) :: paknam2
1015 integer(I4B),
intent(in) :: naux
1016 character(len=16),
dimension(:),
intent(in) :: auxtxt
1017 integer(I4B),
intent(in) :: ibdchn
1018 integer(I4B),
intent(in) :: ncol
1019 integer(I4B),
intent(in) :: nrow
1020 integer(I4B),
intent(in) :: nlay
1021 integer(I4B),
intent(in) :: nlist
1022 integer(I4B),
intent(in) :: iout
1023 real(dp),
intent(in) :: delt
1024 real(dp),
intent(in) :: pertim
1025 real(dp),
intent(in) :: totim
1029 character(len=*),
parameter :: fmt = &
1030 &
"(1X,'UBDSV06 SAVING ',A16,' IN MODEL ',A16,' PACKAGE ',A16,"// &
1031 &
"'CONNECTED TO MODEL ',A16,' PACKAGE ',A16,"// &
1032 &
"' ON UNIT',I7,' AT TIME STEP',I7,', STRESS PERIOD',I7)"
1035 if (iout > 0)
write (iout, fmt) text, modelnam1, paknam1, modelnam2, &
1036 paknam2, ibdchn, kstp, kper
1037 write (ibdchn) kstp, kper, text, ncol, nrow, -nlay
1038 write (ibdchn) 6, delt, pertim, totim
1039 write (ibdchn) modelnam1
1040 write (ibdchn) paknam1
1041 write (ibdchn) modelnam2
1042 write (ibdchn) paknam2
1043 write (ibdchn) naux + 1
1044 if (naux > 0)
write (ibdchn) (auxtxt(n), n=1, naux)
1045 write (ibdchn) nlist
1058 integer(I4B),
intent(in) :: ibdchn
1059 integer(I4B),
intent(in) :: n
1060 real(dp),
intent(in) :: q
1061 integer(I4B),
intent(in) :: naux
1062 real(dp),
dimension(naux),
intent(in) :: aux
1068 write (ibdchn) n, q, (aux(nn), nn=1, naux)
1081 subroutine ubdsvd(ibdchn, n, n2, q, naux, aux)
1084 integer(I4B),
intent(in) :: ibdchn
1085 integer(I4B),
intent(in) :: n
1086 integer(I4B),
intent(in) :: n2
1087 real(dp),
intent(in) :: q
1088 integer(I4B),
intent(in) :: naux
1089 real(dp),
dimension(naux),
intent(in) :: aux
1095 write (ibdchn) n, n2, q, (aux(nn), nn=1, naux)
1097 write (ibdchn) n, n2, q
1109 character(len=*),
intent(in) :: word1, word2
1111 character(len=200) :: upword1, upword2
1127 character(len=*),
intent(in) :: str
1128 integer,
intent(in) :: width
1130 character(len=max(len_trim(str), width)) :: res
1143 character(len=LINELENGTH) :: line
1144 character(len=100) :: fname, ac, act, fm, frm, seq, unf
1146 character(len=*),
parameter :: fmta = &
1147 &
"('unit:',i4,' name:',a,' access:',a,' action:',a)"
1148 character(len=*),
parameter :: fmtb = &
1149 &
"(' formatted:',a,' sequential:',a,' unformatted:',a,' form:',a)"
1152 inquire (unit=iu, name=fname, access=ac, action=act, formatted=fm, &
1153 sequential=seq, unformatted=unf, form=frm)
1156 write (line, fmta) iu, trim(fname), trim(ac), trim(act)
1158 write (line, fmtb) trim(fm), trim(seq), trim(unf), trim(frm)
1176 character(len=*),
intent(in) :: line
1177 integer(I4B),
intent(inout) :: nwords
1178 character(len=*),
allocatable,
dimension(:),
intent(inout) :: words
1179 integer(I4B),
intent(in),
optional :: inunit
1180 character(len=*),
intent(in),
optional :: filename
1182 integer(I4B) :: i, idum, istart, istop, linelen, lloc
1186 if (
allocated(words))
then
1193 allocate (words(nwords))
1198 call urword(line, lloc, istart, istop, 0, idum, rdum, 0, 0)
1199 words(i) = line(istart:istop)
1208 subroutine ulaprufw(ncol, nrow, kstp, kper, ilay, iout, buf, text, userfmt, &
1209 nvalues, nwidth, editdesc)
1212 integer(I4B),
intent(in) :: ncol, nrow, kstp, kper, ilay, iout
1213 real(dp),
dimension(ncol, nrow),
intent(in) :: buf
1214 character(len=*),
intent(in) :: text
1215 character(len=*),
intent(in) :: userfmt
1216 integer(I4B),
intent(in) :: nvalues, nwidth
1217 character(len=1),
intent(in) :: editdesc
1219 integer(I4B) :: i, j, nspaces
1221 character(len=*),
parameter :: fmtmsgout1 = &
1222 "('1',/2X,A,' IN LAYER ',I3,' AT END OF TIME STEP ',I3, &
1223 & ' IN STRESS PERIOD ',I4/2X,75('-'))"
1224 character(len=*),
parameter :: fmtmsgout2 = &
1225 "('1',/1X,A,' FOR CROSS SECTION AT END OF TIME STEP',I3, &
1226 & ' IN STRESS PERIOD ',I4/1X,79('-'))"
1228 if (iout <= 0)
return
1231 write (iout, fmtmsgout1) trim(text), ilay, kstp, kper
1232 else if (ilay < 0)
then
1233 write (iout, fmtmsgout2) trim(text), kstp, kper
1238 if (editdesc ==
'F') nspaces = 3
1239 call ucolno(1, ncol, nspaces, nvalues, nwidth + 1, iout)
1243 write (iout, userfmt) i, (buf(j, i), j=1, ncol)
1269 integer(I4B),
intent(in) :: iu
1270 logical,
intent(out) :: eof
1271 character(len=:),
allocatable :: astring
1273 integer(I4B) :: isize, istat
1274 character(len=256) :: buffer
1275 character(len=1000) :: ermsg, fname
1276 character(len=7) :: fmtd
1279 character(len=*),
parameter :: fmterrmsg1 = &
1280 &
"('Error in read_line: File ',i0,' is not open.')"
1281 character(len=*),
parameter :: fmterrmsg2 = &
1282 &
"('Error in read_line: Attempting to read text ' // &
1283 & 'from unformatted file: ""',a,'""')"
1284 character(len=*),
parameter :: fmterrmsg3 = &
1285 &
"('Error reading from file ""',a,'"" opened on unit ',i0, &
1286 & ' in read_line.')"
1291 read (iu,
'(a)', advance=
'NO', iostat=istat, size=isize,
end=99) buffer
1295 ermsg =
'Programming error in call to read_line: '// &
1296 'Attempt to read from unit number <= 0'
1298 inquire (unit=iu, opened=lop, name=fname, formatted=fmtd)
1300 write (ermsg, fmterrmsg1) iu
1301 elseif (fmtd ==
'NO' .or. fmtd ==
'UNKNOWN')
then
1302 write (ermsg, fmterrmsg2) trim(fname)
1304 write (ermsg, fmterrmsg3) trim(fname), iu
1310 astring = astring//buffer(:isize)
1330 character(len=*),
intent(in) :: pathname
1331 character(len=*),
intent(out) :: filename
1333 integer(I4B) :: i, istart, istop, lenpath
1334 character(len=1) :: fs =
'/'
1335 character(len=1) :: bs =
'\'
1338 lenpath = len_trim(pathname)
1341 loop:
do i = lenpath, 1, -1
1342 if (pathname(i:i) == fs .or. pathname(i:i) == bs)
then
1343 if (i == istop)
then
1351 if (istop >= istart)
then
1352 filename = pathname(istart:istop)
1369 character(len=*),
intent(inout) :: line
1370 integer(I4B),
intent(inout) :: icol, istart, istop
1371 integer(I4B),
intent(out) :: idnum
1372 character(len=LENBOUNDNAME),
intent(out) :: bndname
1374 integer(I4B) :: istat, ndum, ncode = 0
1377 call urword(line, icol, istart, istop, ncode, ndum, rdum, 0, 0)
1378 read (line(istart:istop), *, iostat=istat) ndum
1379 if (istat == 0)
then
1383 idnum = namedboundflag
1384 bndname = line(istart:istop)
1394 subroutine urdaux(naux, inunit, iout, lloc, istart, istop, auxname, line, text)
1401 integer(I4B),
intent(inout) :: naux
1402 integer(I4B),
intent(in) :: inunit
1403 integer(I4B),
intent(in) :: iout
1404 integer(I4B),
intent(inout) :: lloc
1405 integer(I4B),
intent(inout) :: istart
1406 integer(I4B),
intent(inout) :: istop
1407 character(len=LENAUXNAME),
allocatable,
dimension(:),
intent(inout) :: auxname
1408 character(len=*),
intent(inout) :: line
1409 character(len=*),
intent(in) :: text
1411 integer(I4B) :: n, linelen
1412 integer(I4B) :: iauxlen
1417 write (errmsg,
'(a)')
'Auxiliary variables already specified. '// &
1418 &
'Auxiliary variables must be specified on one line in the '// &
1420 call store_error(errmsg)
1421 call store_error_unit(inunit)
1424 call urword(line, lloc, istart, istop, 1, n, rval, iout, inunit)
1425 if (istart >= linelen)
exit auxloop
1426 iauxlen = istop - istart + 1
1428 write (errmsg,
'(a, a, a, i0, a, i0, a)') &
1429 'Found auxiliary variable (', line(istart:istop), &
1430 ') with a name of size ', iauxlen, &
1431 '. Auxiliary variable names must be len than or equal&
1433 call store_error(errmsg)
1434 call store_error_unit(inunit)
1438 auxname(naux) = line(istart:istop)
1440 write (iout,
"(4X,'AUXILIARY ',a,' VARIABLE: ',A)") &
1441 trim(adjustl(text)), auxname(naux)
1467 subroutine print_format(linein, cdatafmp, editdesc, nvaluesp, nwidthp, inunit)
1469 character(len=*),
intent(in) :: linein
1470 character(len=*),
intent(inout) :: cdatafmp
1471 character(len=*),
intent(inout) :: editdesc
1472 integer(I4B),
intent(inout) :: nvaluesp
1473 integer(I4B),
intent(inout) :: nwidthp
1474 integer(I4B),
intent(in) :: inunit
1476 character(len=len(linein)) :: line
1477 character(len=20),
dimension(:),
allocatable :: words
1478 character(len=100) :: ermsg
1479 integer(I4B) :: ndigits = 0, nwords = 0
1480 integer(I4B) :: i, ierr
1485 call parseline(line, nwords, words, inunit)
1489 if (editdesc ==
'I') isint = .true.
1492 if (nwords < 1)
then
1493 ermsg =
'Could not build PRINT_FORMAT from line'//trim(line)
1494 call store_error(trim(ermsg))
1495 ermsg =
'Syntax is: COLUMNS <columns> WIDTH <width> DIGITS &
1497 call store_error(trim(ermsg))
1498 call store_error_unit(inunit)
1501 ermsg =
'Error setting PRINT_FORMAT. Syntax is incorrect in line:'
1502 if (nwords >= 4)
then
1503 if (.not.
same_word(words(1),
'COLUMNS')) ierr = 1
1504 if (.not.
same_word(words(3),
'WIDTH')) ierr = 1
1507 read (words(2), *, iostat=ierr) nvaluesp
1510 read (words(4), *, iostat=ierr) nwidthp
1516 call store_error(ermsg)
1517 call store_error(line)
1518 ermsg =
'Syntax is: COLUMNS <columns> WIDTH <width> &
1519 &DIGITS <digits> <format>'
1520 call store_error(trim(ermsg))
1521 call store_error_unit(inunit)
1525 if (.not. isint)
then
1527 if (nwords >= 5)
then
1528 if (.not.
same_word(words(5),
'DIGITS')) ierr = 1
1530 read (words(6), *, iostat=ierr) ndigits
1541 if (i <= nwords)
then
1543 select case (words(i))
1544 case (
'EXPONENTIAL')
1557 ermsg =
'Error in format specification. Unrecognized option: '//words(i)
1558 call store_error(ermsg)
1559 ermsg =
'Valid values are EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC.'
1560 call store_error(ermsg)
1561 call store_error_unit(inunit)
1568 call store_error(ermsg)
1569 call store_error(line)
1570 call store_error_unit(inunit)
1574 select case (editdesc)
1579 case (
'E',
'G',
'S')
1592 integer(I4B),
intent(in) :: nvalsp, nwidp, ndig
1593 character(len=*),
intent(inout) :: outfmt
1594 logical,
intent(in),
optional :: prowcolnum
1596 character(len=8) :: cvalues, cwidth, cdigits
1597 character(len=60) :: ufmt
1598 logical :: prowcolnumlocal
1600 character(len=*),
parameter :: fmtndig =
"(i8)"
1602 if (
present(prowcolnum))
then
1603 prowcolnumlocal = prowcolnum
1605 prowcolnumlocal = .true.
1609 write (cdigits, fmtndig) ndig
1610 cdigits = adjustl(cdigits)
1613 write (cvalues, fmtndig) nvalsp
1614 cvalues = adjustl(cvalues)
1615 write (cwidth, fmtndig) nwidp
1616 cwidth = adjustl(cwidth)
1617 if (prowcolnumlocal)
then
1623 ufmt = trim(ufmt)//cvalues
1624 ufmt = trim(ufmt)//
'(1x,f'
1625 ufmt = trim(ufmt)//cwidth
1626 ufmt = trim(ufmt)//
'.'
1627 ufmt = trim(ufmt)//cdigits
1628 ufmt = trim(ufmt)//
'):/(5x,'
1629 ufmt = trim(ufmt)//cvalues
1630 ufmt = trim(ufmt)//
'(1x,f'
1631 ufmt = trim(ufmt)//cwidth
1632 ufmt = trim(ufmt)//
'.'
1633 ufmt = trim(ufmt)//cdigits
1634 ufmt = trim(ufmt)//
')))'
1646 integer(I4B),
intent(in) :: nvalsp, nwidp, ndig
1647 character(len=*),
intent(in) :: editdesc
1648 character(len=*),
intent(inout) :: outfmt
1649 logical,
intent(in),
optional :: prowcolnum
1651 character(len=8) :: cvalues, cwidth, cdigits
1652 character(len=60) :: ufmt
1653 logical :: prowcolnumlocal
1655 character(len=*),
parameter :: fmtndig =
"(i8)"
1657 if (
present(prowcolnum))
then
1658 prowcolnumlocal = prowcolnum
1660 prowcolnumlocal = .true.
1664 write (cdigits, fmtndig) ndig
1665 cdigits = adjustl(cdigits)
1667 write (cwidth, fmtndig) nwidp
1668 cwidth = adjustl(cwidth)
1670 write (cvalues, fmtndig) (nvalsp - 1)
1671 cvalues = adjustl(cvalues)
1672 if (prowcolnumlocal)
then
1673 ufmt =
'(1x,i3,2x,1p,'//editdesc
1675 ufmt =
'(6x,1p,'//editdesc
1677 ufmt = trim(ufmt)//cwidth
1678 ufmt = trim(ufmt)//
'.'
1679 ufmt = trim(ufmt)//cdigits
1680 if (nvalsp > 1)
then
1681 ufmt = trim(ufmt)//
','
1682 ufmt = trim(ufmt)//cvalues
1683 ufmt = trim(ufmt)//
'(1x,'
1684 ufmt = trim(ufmt)//editdesc
1685 ufmt = trim(ufmt)//cwidth
1686 ufmt = trim(ufmt)//
'.'
1687 ufmt = trim(ufmt)//cdigits
1688 ufmt = trim(ufmt)//
')'
1691 ufmt = trim(ufmt)//
':/(5x,'
1692 write (cvalues, fmtndig) nvalsp
1693 cvalues = adjustl(cvalues)
1694 ufmt = trim(ufmt)//cvalues
1695 ufmt = trim(ufmt)//
'(1x,'
1696 ufmt = trim(ufmt)//editdesc
1697 ufmt = trim(ufmt)//cwidth
1698 ufmt = trim(ufmt)//
'.'
1699 ufmt = trim(ufmt)//cdigits
1700 ufmt = trim(ufmt)//
')))'
1712 integer(I4B),
intent(in) :: nvalsp, nwidp
1713 character(len=*),
intent(inout) :: outfmt
1714 logical,
intent(in),
optional :: prowcolnum
1716 character(len=8) :: cvalues, cwidth
1717 character(len=60) :: ufmt
1718 logical :: prowcolnumlocal
1720 character(len=*),
parameter :: fmtndig =
"(i8)"
1722 if (
present(prowcolnum))
then
1723 prowcolnumlocal = prowcolnum
1725 prowcolnumlocal = .true.
1729 write (cvalues, fmtndig) nvalsp
1730 cvalues = adjustl(cvalues)
1731 write (cwidth, fmtndig) nwidp
1732 cwidth = adjustl(cwidth)
1733 if (prowcolnumlocal)
then
1738 ufmt = trim(ufmt)//cvalues
1739 ufmt = trim(ufmt)//
'(1x,i'
1740 ufmt = trim(ufmt)//cwidth
1741 ufmt = trim(ufmt)//
'):/(5x,'
1742 ufmt = trim(ufmt)//cvalues
1743 ufmt = trim(ufmt)//
'(1x,i'
1744 ufmt = trim(ufmt)//cwidth
1745 ufmt = trim(ufmt)//
')))'
1758 character(len=*),
intent(in) :: line
1760 integer(I4B) :: linelen
1761 integer(I4B) :: lloc
1762 integer(I4B) :: istart
1763 integer(I4B) :: istop
1764 integer(I4B) :: idum
1774 call urword(line, lloc, istart, istop, 0, idum, rdum, 0, 0)
1775 if (istart == linelen)
exit
1791 integer(I4B),
intent(in) :: iu
1792 integer(I4B),
intent(in) :: offset
1793 integer(I4B),
intent(in) :: whence
1794 integer(I4B),
intent(inout) :: status
1796 integer(I8B) :: ipos
1798 inquire (unit=iu, size=ipos)
1800 select case (whence)
1808 inquire (unit=iu, pos=ipos)
1809 ipos = ipos + offset
1813 inquire (unit=iu, size=ipos)
1814 ipos = ipos + offset
1818 write (iu, pos=ipos, iostat=status)
1819 inquire (unit=iu, pos=ipos)
1832 use,
intrinsic :: iso_fortran_env, only: iostat_end
1835 integer(I4B),
intent(in) :: iin
1836 integer(I4B),
intent(in) :: iout
1837 character(len=:),
allocatable,
intent(inout) :: line
1838 integer(I4B),
intent(out) :: ierr
1840 character(len=:),
allocatable :: linetemp
1841 character(len=2),
parameter :: comment =
'//'
1842 character(len=1),
parameter :: tab = char(9)
1843 logical :: iscomment
1844 integer(I4B) :: i, j, l, istart, lsize
1850 if (ierr == iostat_end)
then
1855 elseif (ierr /= 0)
then
1858 write (errmsg, *)
'u9rdcom: Could not read from unit: ', iin
1859 call store_error(errmsg, terminate=.true.)
1861 if (len_trim(line) < 1)
then
1872 allocate (
character(len=lsize) :: linetemp)
1874 if (line(j:j) /=
' ' .and. line(j:j) /=
',' .and. &
1875 line(j:j) /= char(9))
then
1881 linetemp(:) = line(istart:)
1882 line(:) = linetemp(:)
1883 deallocate (linetemp)
1887 select case (line(1:1))
1898 if (line(1:2) == comment) iscomment = .true.
1899 if (len_trim(line) < 1) iscomment = .true.
1904 if (.not. iscomment)
then
1911 if (line(i:i) /=
' ')
then
1916 write (iout,
'(1x,a)') line(1:i)
1933 integer(I4B),
intent(in) :: lun
1934 character(len=:),
intent(out),
allocatable :: line
1935 integer(I4B),
intent(out) :: iostat
1937 integer(I4B),
parameter :: buffer_len = maxcharlen
1938 character(len=buffer_len) :: buffer
1939 character(len=:),
allocatable :: linetemp
1940 integer(I4B) :: size_read, linesize
1948 read (lun,
'(A)', iostat=iostat, advance=
'no', size=size_read) buffer
1949 if (is_iostat_eor(iostat))
then
1950 linesize = len(line)
1951 deallocate (linetemp)
1952 allocate (
character(len=linesize) :: linetemp)
1953 linetemp(:) = line(:)
1955 allocate (
character(len=linesize + size_read + 1) :: line)
1956 line(:) = linetemp(:)
1957 line(linesize + 1:) = buffer(:size_read)
1958 linesize = len(line)
1959 line(linesize:linesize) =
' '
1962 else if (iostat == 0)
then
1963 linesize = len(line)
1964 deallocate (linetemp)
1965 allocate (
character(len=linesize) :: linetemp)
1966 linetemp(:) = line(:)
1968 allocate (
character(len=linesize + size_read) :: line)
1969 line(:) = linetemp(:)
1970 line(linesize + 1:) = buffer(:size_read)
This module contains simulation constants.
integer(i4b), parameter linelength
maximum length of a standard line
@ tabcenter
centered table column
@ tabright
right justified table column
@ tableft
left justified table column
@ tabucstring
upper case string table data
@ tabstring
string table data
@ tabinteger
integer table data
integer(i4b), parameter iulast
maximum file unit number (this allows for 9000 open files)
integer(i4b), parameter namedboundflag
named bound flag
integer(i4b), parameter iustart
starting file unit number
integer(i4b), parameter lenbigline
maximum length of a big line
integer(i4b), parameter lenauxname
maximum length of a aux variable
integer(i4b), parameter lenboundname
maximum length of a bound name
real(dp), parameter dzero
real constant zero
integer(i4b), parameter maxcharlen
maximum length of char string
This module defines variable data types.
Store and issue logging messages to output units.
subroutine, public write_message(text, iunit, fmt, skipbefore, skipafter, advance)
Write a message to an output unit.
character(len=20), dimension(2) action
This module contains simulation methods.
subroutine, public store_error(msg, terminate)
Store an error message.
subroutine, public store_error_unit(iunit, terminate)
Store the file unit number.
This module contains simulation variables.
character(len=maxcharlen) errmsg
error message string
integer(i4b) iunext
next file unit number to assign
integer(i4b) isim_mode
simulation mode