23 real(kind=double),
allocatable :: tdval(:, :, :)
27 real(kind=double),
allocatable :: tdtime(:)
29 integer :: nnonzeros = 0
33 real(kind=double),
allocatable :: tdactual(:, :)
36 real(kind=double),
allocatable :: val(:)
38 real(kind=double) :: time
44 logical :: steadytd_written = .false.
47 procedure,
public, pass :: init =>
init_td
49 procedure,
public, pass :: kill =>
kill_td
51 procedure,
public, pass :: info =>
info_td
53 procedure,
public, pass :: set =>
set_td
112 subroutine init_td(this, stderr, InputFdescr, dimdata, ndata, default_data)
114 class(
timedata),
intent(out) :: this
115 integer,
intent(in) :: stderr
116 type(
file),
intent(in) :: InputFdescr
117 integer,
intent(in),
optional :: dimdata
118 integer,
intent(in),
optional :: Ndata
119 real(kind=double),
intent(in),
optional :: default_data(:)
122 integer :: NInput, ival
123 integer :: res, i, j, k
125 character(len=15) :: scratch
126 character(len=256) :: fname, msg
130 if (inputfdescr%exist)
then
132 u_number = inputfdescr%lun
133 fname = inputfdescr%fn
137 read (u_number, *, iostat=res) this%dimdata, this%Ndata
140 trim(fname)//
' type TimeData member dimdata, Ndata ', res)
143 if (
present(dimdata))
then
144 if (dimdata .ne. this%dimdata)
then
146 trim(fname)//
' mismatch between read and given dimdata')
150 if (
present(ndata))
then
151 if (ndata .ne. this%Ndata)
then
153 trim(fname)//
' mismatch between read and given Ndata')
158 allocate (this%TDactual(this%dimdata, this%Ndata), stat=res)
160 ' type TimeData member TDactual (array)', res)
163 allocate (this%TDval(this%dimdata, this%Ndata, 2), stat=res)
165 ' type TimeData member TDval (array)', res)
168 allocate (this%TDtime(2), stat=res)
170 ' type TimeData member TDtime (array)', res)
173 allocate (this%val(this%dimdata), stat=res)
175 ' type TimeData member val (array)', res)
178 this%steadyTD = .false.
181 read (u_number, *, iostat=res)
scratch, this%TDtime(1)
184 trim(fname)//
' type TimeData member TDtime(1) ', res)
187 read (u_number, *, iostat=res) ninput
190 trim(fname)//
' type TimeData member NInput ', res)
191 this%nnonzeros = ninput
195 read (u_number, *, iostat=res) ival, (this%val(k), k=1, this%dimdata)
200 trim(fname)//
' type TimeDara member ival '//
etb(msg), res)
202 this%TDval(:, ival, 1) = this%val(:)
206 read (u_number, *, iostat=res)
scratch, this%TDtime(2)
209 if (res .eq. -1)
then
210 this%TDtime(2) = huge
211 this%TDactual(:, :) = this%TDval(:, :, 1)
212 this%TDval(:, :, 2) = this%TDval(:, :, 1)
213 this%steadyTD = .true.
216 etb(trim(inputfdescr%fn)// &
217 ' type TimeData member timein(2) '), res)
221 if (this%TDtime(2) .ge. huge)
then
223 this%TDactual(:, :) = this%TDval(:, :, 1)
224 this%TDval(:, :, 2) = this%TDval(:, :, 1)
225 this%steadyTD = .true.
229 read (u_number, *, iostat=res) ninput
232 trim(inputfdescr%fn)//
' type TimeData member NInput ', res)
233 this%nnonzeros = ninput
237 read (u_number, *, iostat=res) ival, (this%val(k), k=1, this%dimdata)
240 trim(inputfdescr%fn)//
' type TimeDara member ival,val ', res)
241 this%TDval(:, ival, 2) = this%val(:)
245 if (
present(dimdata) .and.
present(ndata) .and.
present(default_data))
then
249 this%dimdata = dimdata
251 this%steadyTD = .true.
254 allocate (this%TDactual(this%dimdata, this%Ndata), stat=res)
256 ' type TimeData member TDactual (array)', res)
258 allocate (this%TDval(this%dimdata, this%Ndata, 2), stat=res)
260 ' type TimeData member TDval (array)', res)
262 allocate (this%val(this%dimdata), stat=res)
264 ' type TimeData member val (array)', res)
271 this%TDactual(i, j) = default_data(k)
272 this%TDVal(i, j, 1) = default_data(k)
273 this%TDVal(i, j, 2) = default_data(k)
277 allocate (this%TDtime(2), stat=res)
279 ' type TimeData member TDtime (array)', res)
280 this%TDtime(1) = -huge
281 this%TDtime(2) = huge
284 ' file '//
etb(inputfdescr%fn)//
' does not esxits'// &
285 ' and default not assigned ')
298 class(
timedata),
intent(inout) :: this
299 integer,
intent(in) :: lun
312 'dealloc fail for TimeData var TDvar,TDtime,TDactual, val')
328 integer,
intent(in) :: lun
329 integer,
intent(in) :: nsample
332 real(kind=double) :: dnrm2
335 write (lun, *)
' Info: TimeData structure definition:'
337 write (lun, *)
'ndata', this%ndata
338 if (this%steadyTD)
write (lun, *)
' Steady state'
340 write (lun, *)
' t1 = ', this%TDtime(1)
341 write (lun, *)
' actual time = ', this%time
342 write (lun, *)
' t2 = ', this%TDtime(2)
344 if (nsample .gt. 0)
then
345 write (lun, *)
' First Data'
348 do while ((i .lt. this%ndata) .and. (j .lt. nsample))
350 if (dnrm2(this%dimdata, this%TDval(:, i, 1), 1) .ne. zero)
then
352 write (lun,
'(5(i5,e11.3))') i, (this%TDval(k, i, 1), k=1, this%dimdata)
356 write (lun, *)
' Actual Data'
359 do while ((i .lt. this%ndata) .and. (j .lt. nsample))
361 if (dnrm2(this%dimdata, this%TDactual(:, i), 1) .ne. zero)
then
363 write (lun,
'(5(i5,e11.3))') i, (this%TDactual(k, i), k=1, this%dimdata)
367 write (lun, *)
' Second time Data'
370 do while ((i .lt. this%ndata) .and. (j .lt. nsample))
372 if (dnrm2(this%dimdata, this%TDval(:, i, 2), 1) .ne. zero)
then
374 write (lun,
'(5(i5,e11.3))') i, (this%TDval(k, i, 2), k=1, this%dimdata)
393 subroutine set_td(this, stderr, InputFdescr, time, endfile, info)
395 class(
timedata),
intent(inout) :: this
396 integer,
intent(in) :: stderr
397 type(
file),
intent(in) :: InputFdescr
398 real(kind=double),
intent(in) :: time
399 logical,
intent(inout) :: endfile
400 integer,
intent(inout),
optional :: info
402 integer :: res, u_number
404 integer :: i, k, ival
405 real(kind=double) :: tdt1, tdt2, tperc, next_time
406 logical :: rc, read_next
407 character(len=15) :: scratch
408 character(len=256) :: fname
413 u_number = inputfdescr%lun
414 fname = inputfdescr%fn
417 if (.not. this%steadyTD)
then
418 if (time .lt. this%TDtime(1))
then
420 ' time required is smaller TDtime(1)')
421 if (
present(info)) info = 1
424 if (time .ge. this%TDtime(2))
then
428 read (u_number, *, iostat=res)
scratch, next_time
430 if (res .eq. -1)
then
431 this%TDval(:, :, 1) = this%TDval(:, :, 2)
432 this%TDactual(:, :) = this%TDval(:, :, 2)
438 //
' type TimeData member TDtime(2)', res)
441 this%TDtime(1) = this%TDtime(2)
442 this%TDtime(2) = next_time
445 this%TDval(:, :, 1) = this%TDval(:, :, 2)
448 if (this%TDtime(2) .ge. huge)
then
449 this%steadyTD = .true.
450 this%TDval(:, :, 2) = this%TDval(:, :, 1)
451 this%TDactual(:, :) = this%TDval(:, :, 1)
456 read (u_number, *, iostat=res) ninput
458 if (res .eq. -1)
then
459 this%TDval(:, :, 1) = this%TDval(:, :, 2)
460 this%TDactual(:, :) = this%TDval(:, :, 2)
465 trim(fname)//
' type TimeData member NInput ', res)
471 this%nnonzeros = ninput
474 this%TDval(:, :, 2) = zero
476 read (u_number, *, iostat=res) ival, (this%val(k), k=1, this%dimdata)
480 //
' type TimeData aux varibles i,val', res)
481 this%TDval(:, ival, 2) = this%val(:)
484 read_next = (time .ge. this%TDtime(2))
489 tdt1 = this%TDtime(1)
490 tdt2 = this%TDtime(2)
491 tperc = (time - tdt1)/(tdt2 - tdt1)
494 this%TDactual(:, i) = (one - tperc)*this%TDval(:, i, 1) + &
495 tperc*this%TDval(:, i, 2)
512 real(kind=double) :: dnrm2
517 if (dnrm2(this%dimdata, this%TDactual(:, i), 1) > zero)
then
547 integer,
intent(in) :: stderr
548 integer,
intent(in) :: lun
549 integer,
intent(in) :: ndata
550 real(kind=double),
intent(in) ::
data(ndata)
551 character(len=*),
intent(in),
optional :: fname
556 character(len=15) :: filename
558 if (
present(fname))
then
559 filename =
etb(fname)
561 filename =
'File name not passed'
564 write (lun, *, iostat=res) 1, ndata
569 write (lun, *, iostat=res)
'time 1.0e-30'
570 write (lun, *, iostat=res) ndata
572 write (lun, *) i,
data(i)
574 write (lun, *, iostat=res)
'time 1.0e+30'
588 integer,
intent(in) :: stderr
589 integer,
intent(in) :: ndata
590 real(kind=double),
intent(inout) ::
data(ndata)
591 type(
file),
intent(in) :: open_file
593 logical :: end_of_file
596 call tdata%init(stderr, open_file, 1, ndata)
597 call tdata%set(stderr, open_file, &
598 onehalf*(tdata%TDtime(1) + tdata%TDtime(2)), &
600 data(:) = tdata%TDactual(1, :)
601 call tdata%kill(stderr)
621 dimdata, ndata, data, time, fileout)
623 integer,
intent(in) :: lun_err
624 character(len=*),
intent(in) :: head_body_tail_whole
625 real(kind=double),
intent(in) :: time
626 integer,
intent(in) :: dimdata
627 integer,
intent(in) :: ndata
628 real(kind=double),
intent(in) ::
data(dimdata, ndata)
629 type(
file),
intent(in) :: fileout
632 integer :: i, j, k, lun, nnz
633 integer,
allocatable :: indeces_nonzeros(:)
636 character(len=256) :: str, rdwr
641 select case (head_body_tail_whole)
644 write (lun, *, iostat=res) dimdata, ndata,
' ! dimensions'
650 write (lun, *, iostat=res)
'time ', time
656 write (lun, *, iostat=res) ndata,
' ! non zeros'
663 write (lun, *, iostat=res) i, (
data(j, i), j=1, dimdata)
665 write (rdwr,
'(i5)') i
666 str = trim(adjustl(rdwr))//
'/'
669 ' at line '//trim(str), res)
673 write (lun, *, iostat=res)
'time ', time + huge
682 write (lun, *, iostat=res) dimdata, ndata,
' ! dimensions'
690 write (lun, *, iostat=res)
'time ', time
700 allocate (indeces_nonzeros(ndata), stat=res)
703 ' work array indeces_nonzeros', res)
704 call find_nonzeros(dimdata, ndata,
data, nnz, indeces_nonzeros)
705 write (lun, *, iostat=res) nnz,
' ! non zeros'
715 i = indeces_nonzeros(j)
716 write (lun, *, iostat=res) i, (
data(k, i), k=1, dimdata)
718 write (rdwr,
'(i5)') i
719 str = trim(adjustl(rdwr))//
'/'
722 ' at line '//trim(str), res)
729 deallocate (indeces_nonzeros, stat=res)
732 ' work array indeces_nonzeros', res)
735 write (lun, *, iostat=res)
'time ', time + huge
761 time, ndata, data, lun, fn)
763 integer,
intent(in) :: lun_err
764 character(len=*),
intent(in) :: head_body_tail_whole
765 real(kind=double),
intent(in) :: time
766 integer,
intent(in) :: ndata
767 real(kind=double),
intent(in) ::
data(ndata)
768 integer,
intent(in) :: lun
769 character(len=*),
intent(in) :: fn
773 integer,
allocatable :: indeces_nonzeros(:)
776 character(len=256) :: str, rdwr
779 select case (head_body_tail_whole)
782 write (lun, *, iostat=res) 1, ndata,
' ! dimensions'
790 write (lun, *, iostat=res)
'time ', time
798 write (lun, *, iostat=res) ndata,
' ! nonzeros'
806 write (lun, *, iostat=res) i,
data(i)
808 write (rdwr,
'(i5)') i
809 str = trim(adjustl(rdwr))//
'/'
812 ' at line '//trim(str), res)
816 write (lun, *, iostat=res)
'time ', time + huge
825 write (lun, *, iostat=res) 1, ndata,
' ! dimensions'
833 write (lun, *, iostat=res)
'time ', time
843 allocate (indeces_nonzeros(ndata), stat=res)
846 ' work array indeces_nonzeros', res)
848 write (lun, *, iostat=res) nnz,
' ! non zeros'
858 i = indeces_nonzeros(j)
859 write (lun, *, iostat=res) i,
data(i)
861 write (rdwr,
'(i5)') i
862 str = trim(adjustl(rdwr))//
'/'
865 ' at line '//trim(str), res)
872 deallocate (indeces_nonzeros, stat=res)
875 ' work array indeces_nonzeros', res)
878 write (lun, *, iostat=res)
'time ', time + small
900 integer,
intent(in) :: dimdata
901 integer,
intent(in) :: ndata
902 real(kind=double),
intent(in) ::
data(dimdata, ndata)
906 real(kind=double) :: dnrm2
910 if (dnrm2(dimdata,
data(1:dimdata, i), 1) > zero)
then
931 integer,
intent(in) :: dimdata
932 integer,
intent(in) :: ndata
933 real(kind=double),
intent(in) ::
data(dimdata, ndata)
934 integer,
intent(out) :: nnz
935 integer,
intent(inout) :: indeces_nonzeros(ndata)
938 real(kind=double) :: dnrm2
942 if (dnrm2(dimdata,
data(1:dimdata, i), 1) > zero)
then
944 indeces_nonzeros(nnz) = i
integer, parameter err_alloc
Error allocation failed.
character(len=len_trim(adjustl(strin))) function etb(strin)
Return string strin with no preceding and trailing spaces.
integer, parameter wrn_inp
Error in input parameter.
integer, parameter err_inp
Error in input parameter.
integer, parameter err_dealloc
Error deallocation failed.
integer, parameter err_out
Error in outour parameter.
logical function ioerr(lun, errno, call_proc, add_msg, add_int)
Handle and write alert I/O warnings and errors.
Auxiliary module to store an integer and real array used (typically as optional argument) as scratch ...