63#define OFFSET_TYPE INTEGER(KIND=MPI_OFFSET_KIND)
65#define OFFSET_TYPE INTEGER
68 CLASS(
fosite),
ALLOCATABLE :: sim
69 TYPE(dict_typ),
POINTER :: input
72 CHARACTER(LEN=100) :: filename, filename_tmp
74 INTEGER,
DIMENSION(3) :: decomposition
76 LOGICAL :: file_exists
78 REAL,
DIMENSION(:,:,:),
POINTER :: r, sigma
79 REAL,
DIMENSION(:,:,:,:),
POINTER :: r_faces
80 REAL,
DIMENSION(:,:,:),
POINTER :: bccsound
81 REAL,
DIMENSION(:,:,:,:),
POINTER :: fcsound
82 REAL,
PARAMETER :: mbh1 = 0.4465*1.0
83 REAL,
PARAMETER :: mbh2 = 0.4465*1.0
88 CALL get_command_argument(1, filename)
89 INQUIRE(file=trim(filename), exist=file_exists)
90 IF(.NOT.file_exists)
THEN
91 print *,
"restart, ",
"Input file does not exist!"
101 CALL getattr(input,
"config", sim%config)
104 CALL getattr(input,
'/timedisc/time', time)
106 CALL setattr(sim%config,
"/timedisc/starttime", time)
110 decomposition(2) = -1
112 CALL setattr(sim%config,
"/mesh/decomposition", decomposition)
116 filename_tmp = filename
117 i = scan(filename_tmp,
'_',back=.true.)
119 filename_tmp = filename_tmp(i+1:i+4)
120 IF(filename_tmp(1:1) .EQ.
"0") filename_tmp = filename_tmp(2:)
121 IF(filename_tmp(1:1) .EQ.
"0") filename_tmp = filename_tmp(2:)
122 IF(filename_tmp(1:1) .EQ.
"0") filename_tmp = filename_tmp(2:)
123 READ(filename_tmp,*)
step
124 CALL setattr(sim%config,
"/datafile/step",
step)
126 CALL sim%Error(
"Restart",
"Unable to find starting step in filename_tmp.")
136 SELECT TYPE (phys => sim%Physics)
137 TYPE IS(physics_eulerisotherm)
140 bccsound(sim%Mesh%IGMIN:sim%Mesh%IGMAX,sim%Mesh%JGMIN:sim%Mesh%JGMAX,sim%Mesh%KGMIN:sim%Mesh%KGMAX), &
141 fcsound(sim%Mesh%IGMIN:sim%Mesh%IGMAX,sim%Mesh%JGMIN:sim%Mesh%JGMAX,sim%Mesh%KGMIN:sim%Mesh%KGMAX,6))
143 r => sim%Mesh%RemapBounds(sim%Mesh%radius%bcenter)
144 r_faces => sim%Mesh%RemapBounds(sim%Mesh%radius%faces)
145 bccsound = hratio*sqrt((mbh1+mbh2)*phys%Constants%GN/r(:,:,:))
147 fcsound(:,:,:,i) = hratio*sqrt((mbh1+mbh2)*phys%constants%GN/r_faces(:,:,:,i))
150 CALL phys%SetSoundSpeeds(sim%Mesh,bccsound)
151 CALL phys%SetSoundSpeeds(sim%Mesh,fcsound)
155 SELECT TYPE(bwest => sim%Timedisc%Boundary%boundary(west)%p)
156 CLASS IS (boundary_custom)
157 CALL bwest%SetCustomBoundaries(sim%Mesh,sim%Physics, &
158 (/custom_nograd,custom_outflow,custom_kepler/))
160 SELECT TYPE(beast => sim%Timedisc%Boundary%boundary(east)%p)
161 CLASS IS (boundary_custom)
162 CALL beast%SetCustomBoundaries(sim%Mesh,sim%Physics, &
163 (/custom_nograd,custom_outflow,custom_kepler/))
169 CALL sim%Info(
" DATA-----> initial condition: restarted from data file - " // &
172 CALL sim%Physics%Convert2Conservative(sim%Timedisc%pvar,sim%Timedisc%cvar)
189 CHARACTER(LEN=*) :: filename
190 TYPE(dict_typ),
POINTER :: res
192 INTEGER :: file, ierror, keylen, intsize, realsize, &
193 type, bytes, l, dims(5)
194 CHARACTER(LEN=6) :: magic
195 CHARACTER(LEN=2) :: endian
196 CHARACTER(LEN=13) :: header
197 CHARACTER(LEN=4) :: sizestr
198 CHARACTER(LEN=1),
DIMENSION(128) :: buffer
201 CHARACTER(LEN=1) :: version
203 INTEGER(KIND=MPI_OFFSET_KIND) :: offset, offset_0, filesize
206 CHARACTER(LEN=1),
DIMENSION(:),
POINTER :: keybuf
207 CHARACTER(LEN=MAX_CHAR_LEN) :: key,kf
208 REAL,
DIMENSION(:,:,:),
POINTER :: ptr3 => null()
209 CHARACTER(LEN=1),
DIMENSION(:),
POINTER :: val
214 INTEGER,
DIMENSION(2) :: gsizes,lsizes,indices,memsizes
215 INTEGER,
DIMENSION(MPI_STATUS_SIZE) :: status
218 INTENT(IN) :: filename
225 file = trim(filename), &
229 position =
'REWIND', &
233 CALL mpi_file_open(mpi_comm_world,trim(filename),mpi_mode_rdonly, &
234 mpi_info_null,handle,ierror)
236 CALL mpi_file_set_view(handle,offset_0,mpi_byte,mpi_byte,
'native',mpi_info_null,ierror)
237 CALL mpi_file_seek(handle,offset-1,mpi_seek_set,ierror)
241 READ(file,pos=offset) magic, endian, version, sizestr
243 CALL mpi_file_read_all(handle, header, len(header), mpi_byte, &
245 WRITE (magic,
'(A6)') header(1:6)
246 WRITE (endian,
'(A2)') header(7:8)
247 version = iachar(header(9:9))
248 WRITE (sizestr,
'(A4)') header(10:13)
251 READ(sizestr,
'(I2,I2)') realsize, intsize
254 READ(file, iostat=ierror, pos=offset) keylen
258 CALL mpi_file_seek(handle,offset-1,mpi_seek_set,ierror)
259 CALL mpi_file_read_all(handle, buffer, intsize, mpi_byte, status,ierror)
260 keylen = transfer(buffer(1:intsize),keylen)
262 offset = offset + intsize
264 DO WHILE(ierror.EQ.0)
267 ALLOCATE(keybuf(keylen))
269 READ(file, pos=offset) keybuf,
type,bytes
271 CALL mpi_file_seek(handle,offset-1,mpi_seek_set,ierror)
272 CALL mpi_file_read_all(handle, buffer, keylen+2*intsize, mpi_byte, &
274 keybuf = transfer(buffer(1:keylen), keybuf)
275 type = transfer(buffer(keylen+1:keylen+intsize), type)
276 bytes = transfer(buffer(keylen+intsize+1:keylen+2*intsize), bytes)
278 WRITE(kf,
'(A, I4, A)')
'(',keylen,
'(A))'
282 offset = offset + keylen + 2*intsize
287 CASE(dict_real_threed)
289 CASE(dict_real_fourd)
291 CASE(dict_real_fived)
298 READ(file, pos=offset) dims(1:l)
301 CALL mpi_file_seek(handle,offset-1,mpi_seek_set,ierror)
302 CALL mpi_file_read_all(handle,buffer(1:l*intsize),l*intsize,mpi_byte,status,ierror)
303 dims(1:l) = transfer(buffer(1:l*intsize),dims(1:l))
305 bytes = bytes - l*intsize
306 offset = offset + l*intsize
326 READ(file, pos=offset) val
329 CALL mpi_file_seek(handle,offset-1,mpi_seek_set,ierror)
330 CALL mpi_file_read_all(handle,buffer(1:bytes),bytes,mpi_byte,status,ierror)
331 val = transfer(buffer(1:bytes),val)
333 IF(key.EQ.
'/config/mesh/decomposition')
THEN
336 CALL setattr(res,key,val,type)
342 offset = offset + bytes
345 READ(file, pos=offset, iostat=ierror) keylen
348 CALL mpi_file_seek(handle,offset-1,mpi_seek_set,ierror)
349 CALL mpi_file_read_all(handle,buffer(1:intsize),intsize,mpi_byte,status,ierror)
350 keylen = transfer(buffer(1:intsize),keylen)
353 CALL mpi_file_get_position(handle,offset_0,ierror)
354 CALL mpi_file_get_size(handle,filesize,ierror)
355 IF (filesize.LE.offset_0)
THEN
360 offset = offset + intsize
379 CHARACTER(LEN=*) :: filename
381 INTEGER :: unit, ierror, keylen, &
382 intsize, realsize,
type, bytes, &
385 CHARACTER(LEN=13) :: header
386 CHARACTER(LEN=6) :: magic
387 CHARACTER(LEN=2) :: endian
388 CHARACTER(LEN=1),
DIMENSION(128) :: buffer
391 CHARACTER(LEN=1) :: version
393 INTEGER(KIND=MPI_OFFSET_KIND) :: offset, offset_0, filesize
396 CHARACTER(LEN=4) :: sizestr
397 CHARACTER(LEN=1),
DIMENSION(:),
POINTER :: keybuf
398 CHARACTER(LEN=MAX_CHAR_LEN) :: key,kf
399 REAL,
DIMENSION(:,:),
POINTER :: ptr2 => null()
400 REAL,
DIMENSION(:,:,:),
POINTER :: ptr3 => null()
401 REAL,
DIMENSION(:,:,:,:),
POINTER :: ptr4 => null()
402 REAL,
DIMENSION(:,:,:,:,:),
POINTER :: ptr5 => null()
403 CHARACTER(LEN=1),
DIMENSION(:),
POINTER :: val
409 INTEGER,
DIMENSION(2) :: gsizes,lsizes,indices,memsizes
410 INTEGER,
DIMENSION(MPI_STATUS_SIZE) :: status
413 CLASS(gravity_base),
POINTER :: gravptr
415 INTENT(IN) :: filename
416 INTENT(INOUT) :: this
423 file = trim(filename), &
427 position =
'REWIND', &
431 gsizes(1) = sim%Mesh%INUM
432 gsizes(2) = sim%Mesh%JNUM
433 lsizes(1) = sim%Mesh%IMAX-sim%Mesh%IMIN+1
434 lsizes(2) = sim%Mesh%JMAX-sim%Mesh%JMIN+1
435 indices(1)= sim%Mesh%IMIN-1
436 indices(2)= sim%Mesh%JMIN-1
437 bufsize = product(lsizes)
438 CALL mpi_type_create_subarray(2, gsizes, lsizes, indices, mpi_order_fortran,&
439 default_mpi_real,filetype,ierror)
440 CALL mpi_type_commit(filetype,ierror)
443 CALL mpi_file_open(mpi_comm_world,trim(filename),mpi_mode_rdonly, &
444 mpi_info_null,handle,ierror)
449 READ(unit) magic, endian, version, sizestr
451 CALL mpi_file_read_all(handle, header, len(header), mpi_byte, &
453 WRITE (magic,
'(A6)') header(1:6)
454 WRITE (endian,
'(A2)') header(7:8)
455 version = iachar(header(9:9))
456 WRITE (sizestr,
'(A4)') header(10:13)
459 READ(sizestr,
'(I2,I2)') realsize, intsize
461 READ(unit, iostat=ierror) keylen
465 CALL mpi_file_read_all(handle, buffer, intsize, mpi_byte, status,ierror)
466 keylen = transfer(buffer(1:intsize),keylen)
468 offset = offset + intsize
471 DO WHILE(ierror.EQ.0)
475 ALLOCATE(keybuf(keylen))
477 READ(unit) keybuf,
type,bytes
479 CALL mpi_file_read_all(handle, buffer, keylen+2*intsize, mpi_byte, &
481 keybuf = transfer(buffer(1:keylen), keybuf)
482 type = transfer(buffer(keylen+1:keylen+intsize), type)
483 bytes = transfer(buffer(keylen+intsize+1:keylen+2*intsize), bytes)
485 WRITE(kf,
'(A, I4, A)')
'(',keylen,
'(A))'
488 offset = offset + keylen + 2*intsize
493 CASE(dict_real_threed)
495 CASE(dict_real_fourd)
497 CASE(dict_real_fived)
507 CALL mpi_file_read_all(handle,buffer(1:l*intsize),l*intsize,mpi_byte,status,ierror)
508 dims(1:l) = transfer(buffer(1:l*intsize),dims(1:l))
510 bytes = bytes - l*intsize
511 offset = offset + l*intsize
514 SELECT CASE(trim(key))
515 CASE(
'/timedisc/density')
516 sim%Timedisc%pvar%data4d(sim%Mesh%IGMIN:sim%Mesh%IGMAX,sim%Mesh%JGMIN:sim%Mesh%JGMAX, &
517 sim%Mesh%KGMIN:sim%Mesh%KGMAX,sim%Physics%DENSITY) = 0.0
519 READ(unit) sim%Timedisc%pvar%data4d(sim%Mesh%IMIN:sim%Mesh%IMAX,sim%Mesh%JMIN:sim%Mesh%JMAX, &
520 sim%Mesh%KMIN:sim%Mesh%KMAX,sim%Physics%DENSITY)
522 CALL mpi_file_set_view(handle, offset-1,default_mpi_real,filetype,
'native', mpi_info_null, ierror)
523 CALL mpi_file_read_all(handle, &
524 sim%Timedisc%pvar%data4d(sim%Mesh%IMIN:sim%Mesh%IMAX,sim%Mesh%JMIN:sim%Mesh%JMAX, &
525 sim%Mesh%KMIN:sim%Mesh%KMAX,sim%Physics%DENSITY), &
526 bufsize, default_mpi_real, status, ierror)
528 CALL mpi_file_set_view(handle,offset_0,mpi_byte,mpi_byte,
'native',mpi_info_null,ierror)
530 CASE(
'/timedisc/xvelocity')
531 sim%Timedisc%pvar%data4d(sim%Mesh%IGMIN:sim%Mesh%IGMAX,sim%Mesh%JGMIN:sim%Mesh%JGMAX, &
532 sim%Mesh%KGMIN:sim%Mesh%KGMAX,sim%Physics%XVELOCITY) = 0.0
534 READ(unit) sim%Timedisc%pvar%data4d(sim%Mesh%IMIN:sim%Mesh%IMAX,sim%Mesh%JMIN:sim%Mesh%JMAX, &
535 sim%Mesh%KMIN:sim%Mesh%KMAX,sim%Physics%XVELOCITY)
537 CALL mpi_file_set_view(handle, offset-1,default_mpi_real,filetype,
'native', mpi_info_null, ierror)
538 CALL mpi_file_read_all(handle, &
539 sim%Timedisc%pvar%data4d(sim%Mesh%IMIN:sim%Mesh%IMAX,sim%Mesh%JMIN:sim%Mesh%JMAX, &
540 sim%Mesh%KMIN:sim%Mesh%KMAX,sim%Physics%XVELOCITY),&
541 bufsize, default_mpi_real, status, ierror)
543 CALL mpi_file_set_view(handle,offset_0,mpi_byte,mpi_byte,
'native',mpi_info_null,ierror)
545 CASE(
'/timedisc/yvelocity')
546 sim%Timedisc%pvar%data4d(sim%Mesh%IGMIN:sim%Mesh%IGMAX,sim%Mesh%JGMIN:sim%Mesh%JGMAX, &
547 sim%Mesh%KGMIN:sim%Mesh%KGMAX,sim%Physics%YVELOCITY) = 0.0
549 READ(unit) sim%Timedisc%pvar%data4d(sim%Mesh%IMIN:sim%Mesh%IMAX,sim%Mesh%JMIN:sim%Mesh%JMAX, &
550 sim%Mesh%KMIN:sim%Mesh%KMAX,sim%Physics%YVELOCITY)
552 CALL mpi_file_set_view(handle, offset-1,default_mpi_real,filetype,
'native', mpi_info_null, ierror)
553 CALL mpi_file_read_all(handle, &
554 sim%Timedisc%pvar%data4d(sim%Mesh%IMIN:sim%Mesh%IMAX,sim%Mesh%JMIN:sim%Mesh%JMAX, &
555 sim%Mesh%KMIN:sim%Mesh%KMAX,sim%Physics%YVELOCITY),&
556 bufsize, default_mpi_real, status, ierror)
558 CALL mpi_file_set_view(handle,offset_0,mpi_byte,mpi_byte,
'native',mpi_info_null,ierror)
560 CASE(
'/timedisc/zvelocity')
561 sim%Timedisc%pvar%data4d(sim%Mesh%IGMIN:sim%Mesh%IGMAX,sim%Mesh%JGMIN:sim%Mesh%JGMAX, &
562 sim%Mesh%KGMIN:sim%Mesh%KGMAX,sim%Physics%ZVELOCITY) = 0.0
564 READ(unit) sim%Timedisc%pvar%data4d(sim%Mesh%IMIN:sim%Mesh%IMAX,sim%Mesh%JMIN:sim%Mesh%JMAX, &
565 sim%Mesh%KMIN:sim%Mesh%KMAX,sim%Physics%ZVELOCITY)
567 CALL mpi_file_set_view(handle, offset-1,default_mpi_real,filetype,
'native', mpi_info_null, ierror)
568 CALL mpi_file_read_all(handle, &
569 sim%Timedisc%pvar%data4d(sim%Mesh%IMIN:sim%Mesh%IMAX,sim%Mesh%JMIN:sim%Mesh%JMAX, &
570 sim%Mesh%KMIN:sim%Mesh%KMAX,sim%Physics%ZVELOCITY),&
571 bufsize, default_mpi_real, status, ierror)
573 CALL mpi_file_set_view(handle,offset_0,mpi_byte,mpi_byte,
'native',mpi_info_null,ierror)
575 CASE(
'/timedisc/pressure')
576 SELECT TYPE (phys => sim%Physics)
577 TYPE IS(physics_euler)
578 sim%Timedisc%pvar%data4d(sim%Mesh%IGMIN:sim%Mesh%IGMAX,sim%Mesh%JGMIN:sim%Mesh%JGMAX, &
579 sim%Mesh%KGMIN:sim%Mesh%KGMAX,phys%PRESSURE) = 0.0
581 READ(unit) sim%Timedisc%pvar%data4d(sim%Mesh%IMIN:sim%Mesh%IMAX,sim%Mesh%JMIN:sim%Mesh%JMAX, &
582 sim%Mesh%KMIN:sim%Mesh%KMAX,phys%PRESSURE)
584 CALL mpi_file_set_view(handle, offset-1,default_mpi_real,filetype,
'native', mpi_info_null, ierror)
585 CALL mpi_file_read_all(handle, &
586 sim%Timedisc%pvar%data4d(sim%Mesh%IMIN:sim%Mesh%IMAX,sim%Mesh%JMIN:sim%Mesh%JMAX, &
587 sim%Mesh%KMIN:sim%Mesh%KMAX,phys%PRESSURE),&
588 bufsize, default_mpi_real, status, ierror)
590 CALL mpi_file_set_view(handle,offset_0,mpi_byte,mpi_byte,
'native',mpi_info_null,ierror)
593 CASE(
'/physics/bccsound')
594 SELECT TYPE (phys => sim%Physics)
595 TYPE IS(physics_eulerisotherm)
596 phys%bccsound%data3d(sim%Mesh%IGMIN:sim%Mesh%IGMAX,sim%Mesh%JGMIN:sim%Mesh%JGMAX, &
597 sim%Mesh%KGMIN:sim%Mesh%KGMAX) = 0.0
599 READ(unit) phys%bccsound%data3d(sim%Mesh%IMIN:sim%Mesh%IMAX,sim%Mesh%JMIN:sim%Mesh%JMAX, &
600 sim%Mesh%KMIN:sim%Mesh%KMAX)
602 CALL mpi_file_set_view(handle, offset-1,default_mpi_real,filetype,
'native', mpi_info_null, ierror)
603 CALL mpi_file_read_all(handle, &
604 phys%bccsound%data3d(sim%Mesh%IMIN:sim%Mesh%IMAX,sim%Mesh%JMIN:sim%Mesh%JMAX, &
605 sim%Mesh%KMIN:sim%Mesh%KMAX),&
606 bufsize, default_mpi_real, status, ierror)
608 CALL mpi_file_set_view(handle,offset_0,mpi_byte,mpi_byte,
'native',mpi_info_null,ierror)
611 CASE(
'/physics/fcsound')
612 SELECT TYPE (phys => sim%Physics)
613 TYPE IS(physics_eulerisotherm)
614 phys%fcsound%data4d(sim%Mesh%IGMIN:sim%Mesh%IGMAX,sim%Mesh%JGMIN:sim%Mesh%JGMAX, &
615 sim%Mesh%KGMIN:sim%Mesh%KGMAX,1:sim%Mesh%NFACES) = 0.0
617 READ(unit) phys%fcsound%data4d(sim%Mesh%IMIN:sim%Mesh%IMAX,sim%Mesh%JMIN:sim%Mesh%JMAX, &
618 sim%Mesh%KMIN:sim%Mesh%KMAX,1:sim%Mesh%NFACES)
620 CALL mpi_file_set_view(handle, offset-1,default_mpi_real,filetype,
'native', mpi_info_null, ierror)
621 CALL mpi_file_read_all(handle, &
622 phys%fcsound%data4d(sim%Mesh%IMIN:sim%Mesh%IMAX,sim%Mesh%JMIN:sim%Mesh%JMAX, &
623 sim%Mesh%KMIN:sim%Mesh%KMAX,1:sim%Mesh%NFACES),&
624 bufsize, default_mpi_real, status, ierror)
626 CALL mpi_file_set_view(handle,offset_0,mpi_byte,mpi_byte,
'native',mpi_info_null,ierror)
629 CASE(
'/sources/grav/binary/binpos')
630 srcptr => this%Sources%GetSourcesPointer(gravity)
631 IF (
ASSOCIATED(srcptr))
THEN
632 SELECT TYPE (gravity => srcptr)
634 gravptr => gravity%glist
635 DO WHILE (
ASSOCIATED(gravptr))
636 SELECT TYPE (binary => gravptr)
637 TYPE IS (gravity_binary)
638 READ(unit) binary%pos(1:3,1:2)
642 gravptr => gravptr%next
646 CASE(
'/sources/grav/binary/mass')
647 srcptr => this%Sources%GetSourcesPointer(gravity)
648 IF (
ASSOCIATED(srcptr))
THEN
649 SELECT TYPE (gravity => srcptr)
651 gravptr => gravity%glist
652 DO WHILE (
ASSOCIATED(gravptr))
653 SELECT TYPE (binary => gravptr)
654 TYPE IS (gravity_binary)
655 READ(unit) binary%mass
659 gravptr => gravptr%next
663 CASE(
'/sources/grav/binary/mass2')
664 srcptr => this%Sources%GetSourcesPointer(gravity)
665 IF (
ASSOCIATED(srcptr))
THEN
666 SELECT TYPE (gravity => srcptr)
668 gravptr => gravity%glist
669 DO WHILE (
ASSOCIATED(gravptr))
670 SELECT TYPE (binary => gravptr)
671 TYPE IS (gravity_binary)
672 READ(unit) binary%mass2
676 gravptr => gravptr%next
684 ALLOCATE(ptr2(dims(1),dims(2)))
690 ALLOCATE(ptr3(dims(1),dims(2),dims(3)))
696 ALLOCATE(ptr4(dims(1),dims(2),dims(3),dims(4)))
702 ALLOCATE(ptr5(dims(1),dims(2),dims(3),dims(4),dims(5)))
716 offset = offset + bytes
719 READ(unit, iostat=ierror) keylen
722 CALL mpi_file_seek(handle,offset-1,mpi_seek_set,ierror)
723 CALL mpi_file_read_all(handle,buffer(1:intsize),intsize,mpi_byte,status,ierror)
724 keylen = transfer(buffer(1:intsize),keylen)
726 CALL mpi_file_get_position(handle,offset_0,ierror)
727 CALL mpi_file_get_size(handle,filesize,ierror)
728 IF (filesize.LE.offset_0)
THEN
732 offset = offset + intsize
737 CALL mpi_file_close(handle,ierror)
logical function, private step(this)
generic source terms module providing functionaly common to all source terms
generic gravity terms module providing functionaly common to all gravity terms
subroutine loaddata(this, filename)
Loads the datafields from binary input that are necessary for initialization.
type(dict_typ) function, pointer loadconfig(filename)
Loads the whole dictionary from binary input AND scalar data.