restart.f90

Restart fosite using a binary output file.

Restart fosite using a binary output file

Author
Manuel Jung
Jannes Klee

The file uses the binary input and copies its config to the config of fosite (corresponds to Makeconfig in other intializations). The data of the file is afterwards used for initialization of the fields (corresponds to Initdata).

Warning
restart module does not work with farfield boundaries (tested on gresho)
Todo:
At the moment this file inhibits all the source code in order to read in a file properly. However, this code should later be moved to the ReadHeader and ReadData routines in fileio_binary.f90.

Usage: ./restart filename

1!#############################################################################
2!# #
3!# fosite - 3D hydrodynamical simulation program #
4!# module: restart.f90 #
5!# #
6!# Copyright (C) 2015-2019 #
7!# Manuel Jung <mjung@astrophysik.uni-kiel.de> #
8!# Jannes Klee <jklee@astrophysik.uni-kiel.de> #
9!# #
10!# This program is free software; you can redistribute it and/or modify #
11!# it under the terms of the GNU General Public License as published by #
12!# the Free Software Foundation; either version 2 of the License, or (at #
13!# your option) any later version. #
14!# #
15!# This program is distributed in the hope that it will be useful, but #
16!# WITHOUT ANY WARRANTY; without even the implied warranty of #
17!# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or #
18!# NON INFRINGEMENT. See the GNU General Public License for more #
19!# details. #
20!# #
21!# You should have received a copy of the GNU General Public License #
22!# along with this program; if not, write to the Free Software #
23!# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #
24!# #
25!#############################################################################
26
27!----------------------------------------------------------------------------!
48!----------------------------------------------------------------------------!
49PROGRAM restart
50 USE fosite_mod
51#ifdef PARALLEL
52#ifdef HAVE_MPI_MOD
53 USE mpi
54#endif
55#endif
56 IMPLICIT NONE
57#ifdef PARALLEL
58#ifdef HAVE_MPIF_H
59 include 'mpif.h'
60#endif
61#endif
62#ifdef PARALLEL
63#define OFFSET_TYPE INTEGER(KIND=MPI_OFFSET_KIND)
64#else
65#define OFFSET_TYPE INTEGER
66#endif
67 !--------------------------------------------------------------------------!
68 CLASS(fosite), ALLOCATABLE :: Sim
69 TYPE(Dict_TYP), POINTER :: input
70 REAL :: time,stoptime
71 INTEGER :: i, step
72 CHARACTER(LEN=100) :: filename, filename_tmp
73#ifdef PARALLEL
74 INTEGER, DIMENSION(3) :: decomposition
75#endif
76 LOGICAL :: file_exists
77 REAL :: HRATIO = 0.05
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
84 INTEGER :: count
85 !--------------------------------------------------------------------------!
86
87 ! load file
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!"
92 stop
93 END IF
94
95 ALLOCATE(sim)
96
97 CALL sim%InitFosite()
98
99 !-------------------- load configuration-----------------------------------!
100 input => loadconfig(trim(filename))
101 CALL getattr(input, "config", sim%config)
102
103 ! set starting time in fosite
104 CALL getattr(input, '/timedisc/time', time)
105!time = 0.0
106 CALL setattr(sim%config,"/timedisc/starttime", time)
107
108#ifdef PARALLEL
109 decomposition(1) = 1
110 decomposition(2) = -1
111 decomposition(3) = 1
112 CALL setattr(sim%config, "/mesh/decomposition", decomposition)
113#endif
114
115 ! get step number by stripping from filename
116 filename_tmp = filename
117 i = scan(filename_tmp,'_',back=.true.)
118 IF(i.GT.0) THEN
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)
125 ELSE
126 CALL sim%Error("Restart", "Unable to find starting step in filename_tmp.")
127 END IF
128
129
130 !-------------------- setup & data initialization -------------------------!
131 CALL sim%Setup()
132
133 CALL loaddata(sim,trim(filename))
134
135 !--------------------------------------------------------------------------!
136 SELECT TYPE (phys => sim%Physics)
137 TYPE IS(physics_eulerisotherm)
138 ! Set sound speed
139 ALLOCATE( &
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))
142
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(:,:,:))
146 DO i =1,6
147 fcsound(:,:,:,i) = hratio*sqrt((mbh1+mbh2)*phys%constants%GN/r_faces(:,:,:,i))
148 END DO
149 ! set isothermal sound speeds
150 CALL phys%SetSoundSpeeds(sim%Mesh,bccsound)
151 CALL phys%SetSoundSpeeds(sim%Mesh,fcsound)
152
153 ! boundary conditions
154 ! custom boundary conditions at western boundary if requested
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/))
159 END SELECT
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/))
164 END SELECT
165 END SELECT
166 !--------------------------------------------------------------------------!
167
168
169 CALL sim%Info(" DATA-----> initial condition: restarted from data file - " // &
170 trim(filename))
171
172 CALL sim%Physics%Convert2Conservative(sim%Timedisc%pvar,sim%Timedisc%cvar)
173! CALL Sim%FirstStep()
174
175 CALL sim%Run()
176 CALL sim%Finalize()
177 DEALLOCATE(sim)
178
179CONTAINS
180
181
186FUNCTION loadconfig(filename) RESULT(res)
187 IMPLICIT NONE
188 !--------------------------------------------------------------------------!
189 CHARACTER(LEN=*) :: filename
190 TYPE(Dict_TYP),POINTER :: res
191 !--------------------------------------------------------------------------!
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
199#ifndef PARALLEL
200 INTEGER :: offset
201 CHARACTER(LEN=1) :: version
202#else
203 INTEGER(KIND=MPI_OFFSET_KIND) :: offset, offset_0, filesize
204 INTEGER :: version
205#endif
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
210#ifdef PARALLEL
211 INTEGER :: handle
212 INTEGER :: bufsize
213 INTEGER :: position
214 INTEGER, DIMENSION(2) :: gsizes,lsizes,indices,memsizes
215 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: status
216#endif
217 !--------------------------------------------------------------------------!
218 INTENT(IN) :: filename
219 !--------------------------------------------------------------------------!
220 NULLIFY(res)
221 offset = 1
222#ifndef PARALLEL
223 file = 5555
224 OPEN(file, &
225 file = trim(filename), &
226 status = 'OLD', &
227 access = 'STREAM', &
228 action = 'READ', &
229 position = 'REWIND', &
230 iostat = ierror)
231#else
232 ! Open File
233 CALL mpi_file_open(mpi_comm_world,trim(filename),mpi_mode_rdonly, &
234 mpi_info_null,handle,ierror)
235 offset_0 = 0
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)
238#endif
239
240#ifndef PARALLEL
241 READ(file,pos=offset) magic, endian, version, sizestr
242#else
243 CALL mpi_file_read_all(handle, header, len(header), mpi_byte, &
244 status,ierror)
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)
249#endif
250 offset = offset + 13
251 READ(sizestr, '(I2,I2)') realsize, intsize
252
253#ifndef PARALLEL
254 READ(file, iostat=ierror, pos=offset) keylen
255#else
256! TODO: keylen from data does not need to have the same intsize like from the actual run with Fosite
257 buffer = ''
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)
261#endif
262 offset = offset + intsize
263
264 DO WHILE(ierror.EQ.0)
265 key = ''
266 buffer = ''
267 ALLOCATE(keybuf(keylen))
268#ifndef PARALLEL
269 READ(file, pos=offset) keybuf,type,bytes
270#else
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, &
273 status,ierror)
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)
277#endif
278 WRITE(kf,'(A, I4, A)') '(',keylen,'(A))'
279 WRITE(key,kf) keybuf
280 DEALLOCATE(keybuf)
281 key = trim(key)
282 offset = offset + keylen + 2*intsize
283 dims(:) = 1
284 SELECT CASE(type)
285 CASE(dict_real_twod)
286 l = 3
287 CASE(dict_real_threed)
288 l = 3
289 CASE(dict_real_fourd)
290 l = 4
291 CASE(dict_real_fived)
292 l = 5
293 CASE DEFAULT
294 l = 0
295 END SELECT
296 IF(l.GE.2) THEN
297#ifndef PARALLEL
298 READ(file, pos=offset) dims(1:l)
299#else
300 buffer = ''
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))
304#endif
305 bytes = bytes - l*intsize
306 offset = offset + l*intsize
307 END IF
308
309
310 ! Here, the data fields are skipped (only single values are set, e.g.
311 ! configs, central mass, etc.)
312 ! TODO: The allocation of the field is not good here and just a workaround
313 ! - Problem: The data parts in the file need to be skipped somewhow,
314 ! but the POS argument is not available in F95, which can be used
315 ! on NEC/SX-Ace. At the field decomposition by MPI is done after
316 ! reading in the dictionary in SetupFosite.
317 SELECT CASE(l)
318 CASE(2)
319 CASE(3)
320 CASE(4)
321 CASE(5)
322 CASE DEFAULT
323 IF(bytes.GT.0) THEN
324 ALLOCATE(val(bytes))
325#ifndef PARALLEL
326 READ(file, pos=offset) val
327#else
328 buffer = ''
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)
332#endif
333 IF(key.EQ.'/config/mesh/decomposition')THEN
334 ! Do not set the key for composition. Use new one.
335 ELSE
336 CALL setattr(res,key,val,type)
337 END IF
338 DEALLOCATE(val)
339 END IF
340 END SELECT
341
342 offset = offset + bytes
343
344#ifndef PARALLEL
345 READ(file, pos=offset, iostat=ierror) keylen
346#else
347 buffer = ''
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)
351
352
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
356 ierror=1
357 END IF
358
359#endif
360 offset = offset + intsize
361
362 END DO
363
364 CLOSE(file)
365END FUNCTION loadconfig
366
373SUBROUTINE loaddata(this,filename)
376 IMPLICIT NONE
377 !--------------------------------------------------------------------------!
378 CLASS(fosite) :: this
379 CHARACTER(LEN=*) :: filename
380 !--------------------------------------------------------------------------!
381 INTEGER :: unit, ierror, keylen, &
382 intsize, realsize, type, bytes, &
383 l, dims(5)
384! CHARACTER(LEN=64) :: keybufsize
385 CHARACTER(LEN=13) :: header
386 CHARACTER(LEN=6) :: magic
387 CHARACTER(LEN=2) :: endian
388 CHARACTER(LEN=1),DIMENSION(128) :: buffer
389#ifndef PARALLEL
390 INTEGER :: offset
391 CHARACTER(LEN=1) :: version
392#else
393 INTEGER(KIND=MPI_OFFSET_KIND) :: offset, offset_0, filesize
394 INTEGER :: version
395#endif
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
404#ifdef PARALLEL
405 INTEGER :: handle
406 INTEGER :: filetype
407 INTEGER :: bufsize
408 INTEGER :: position
409 INTEGER, DIMENSION(2) :: gsizes,lsizes,indices,memsizes
410 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: status
411#endif
412 CLASS(sources_base), POINTER :: srcptr
413 CLASS(gravity_base), POINTER :: gravptr
414 !--------------------------------------------------------------------------!
415 INTENT(IN) :: filename
416 INTENT(INOUT) :: this
417 !--------------------------------------------------------------------------!
418 offset = 1
419
420#ifndef PARALLEL
421 unit = 5555
422 OPEN(unit, &
423 file = trim(filename), &
424 status = 'OLD', &
425 access = 'STREAM', &
426 action = 'READ', &
427 position = 'REWIND', &
428 iostat = ierror)
429#else
430 ! First create Datatype that will be read in
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)
441
442 ! Open File
443 CALL mpi_file_open(mpi_comm_world,trim(filename),mpi_mode_rdonly, &
444 mpi_info_null,handle,ierror)
445! CALL MPI_File_seek(handle,offset-1,MPI_SEEK_SET,ierror)
446#endif
447
448#ifndef PARALLEL
449 READ(unit) magic, endian, version, sizestr
450#else
451 CALL mpi_file_read_all(handle, header, len(header), mpi_byte, &
452 status,ierror)
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)
457#endif
458 offset = offset + 13
459 READ(sizestr, '(I2,I2)') realsize, intsize
460#ifndef PARALLEL
461 READ(unit, iostat=ierror) keylen
462#else
463! TODO: keylen from data does not need to have the same intsize like from the actual run with Fosite
464 buffer = ''
465 CALL mpi_file_read_all(handle, buffer, intsize, mpi_byte, status,ierror)
466 keylen = transfer(buffer(1:intsize),keylen)
467#endif
468 offset = offset + intsize
469
470!------------------- loop over data ------------------------------------------!
471 DO WHILE(ierror.EQ.0)
472 NULLIFY(ptr2)
473 key = ''
474 buffer = ''
475 ALLOCATE(keybuf(keylen))
476#ifndef PARALLEL
477 READ(unit) keybuf,type,bytes
478#else
479 CALL mpi_file_read_all(handle, buffer, keylen+2*intsize, mpi_byte, &
480 status,ierror)
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)
484#endif
485 WRITE(kf,'(A, I4, A)') '(',keylen,'(A))'
486 WRITE(key,kf) keybuf
487 DEALLOCATE(keybuf)
488 offset = offset + keylen + 2*intsize
489 dims(:) = 1
490 SELECT CASE(type)
491 CASE(dict_real_twod)
492 l = 3
493 CASE(dict_real_threed)
494 l = 3
495 CASE(dict_real_fourd)
496 l = 4
497 CASE(dict_real_fived)
498 l = 5
499 CASE DEFAULT
500 l = 0
501 END SELECT
502 IF(l.GE.2) THEN
503#ifndef PARALLEL
504 READ(unit) dims(1:l)
505#else
506 buffer = ''
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))
509#endif
510 bytes = bytes - l*intsize
511 offset = offset + l*intsize
512 END IF
513
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
518#ifndef PARALLEL
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)
521#else
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)
527 offset_0 = 0
528 CALL mpi_file_set_view(handle,offset_0,mpi_byte,mpi_byte,'native',mpi_info_null,ierror)
529#endif
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
533#ifndef PARALLEL
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)
536#else
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)
542 offset_0 = 0
543 CALL mpi_file_set_view(handle,offset_0,mpi_byte,mpi_byte,'native',mpi_info_null,ierror)
544#endif
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
548#ifndef PARALLEL
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)
551#else
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)
557 offset_0 = 0
558 CALL mpi_file_set_view(handle,offset_0,mpi_byte,mpi_byte,'native',mpi_info_null,ierror)
559#endif
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
563#ifndef PARALLEL
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)
566#else
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)
572 offset_0 = 0
573 CALL mpi_file_set_view(handle,offset_0,mpi_byte,mpi_byte,'native',mpi_info_null,ierror)
574#endif
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
580#ifndef PARALLEL
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)
583#else
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)
589 offset_0 = 0
590 CALL mpi_file_set_view(handle,offset_0,mpi_byte,mpi_byte,'native',mpi_info_null,ierror)
591#endif
592 END SELECT
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
598#ifndef PARALLEL
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)
601#else
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)
607 offset_0 = 0
608 CALL mpi_file_set_view(handle,offset_0,mpi_byte,mpi_byte,'native',mpi_info_null,ierror)
609#endif
610 END SELECT
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
616#ifndef PARALLEL
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)
619#else
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)
625 offset_0 = 0
626 CALL mpi_file_set_view(handle,offset_0,mpi_byte,mpi_byte,'native',mpi_info_null,ierror)
627#endif
628 END SELECT
629 CASE('/sources/grav/binary/binpos')
630 srcptr => this%Sources%GetSourcesPointer(gravity)
631 IF (ASSOCIATED(srcptr)) THEN
632 SELECT TYPE (gravity => srcptr)
633 CLASS IS(sources_gravity)
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)
639 CLASS DEFAULT
640 ! do nothing or add fields/values in gravities
641 END SELECT
642 gravptr => gravptr%next
643 END DO
644 END SELECT
645 END IF
646 CASE('/sources/grav/binary/mass')
647 srcptr => this%Sources%GetSourcesPointer(gravity)
648 IF (ASSOCIATED(srcptr)) THEN
649 SELECT TYPE (gravity => srcptr)
650 CLASS IS(sources_gravity)
651 gravptr => gravity%glist
652 DO WHILE (ASSOCIATED(gravptr))
653 SELECT TYPE (binary => gravptr)
654 TYPE IS (gravity_binary)
655 READ(unit) binary%mass
656 CLASS DEFAULT
657 ! do nothing or add fields/values in gravities
658 END SELECT
659 gravptr => gravptr%next
660 END DO
661 END SELECT
662 END IF
663 CASE('/sources/grav/binary/mass2')
664 srcptr => this%Sources%GetSourcesPointer(gravity)
665 IF (ASSOCIATED(srcptr)) THEN
666 SELECT TYPE (gravity => srcptr)
667 CLASS IS(sources_gravity)
668 gravptr => gravity%glist
669 DO WHILE (ASSOCIATED(gravptr))
670 SELECT TYPE (binary => gravptr)
671 TYPE IS (gravity_binary)
672 READ(unit) binary%mass2
673 CLASS DEFAULT
674 ! do nothing or add fields/values in gravities
675 END SELECT
676 gravptr => gravptr%next
677 END DO
678 END SELECT
679 END IF
680 CASE DEFAULT
681 SELECT CASE(l)
682 CASE(2)
683#ifndef PARALLEL
684 ALLOCATE(ptr2(dims(1),dims(2)))
685 READ(unit) ptr2
686 DEALLOCATE(ptr2)
687#endif
688 CASE(3)
689#ifndef PARALLEL
690 ALLOCATE(ptr3(dims(1),dims(2),dims(3)))
691 READ(unit) ptr3
692 DEALLOCATE(ptr3)
693#endif
694 CASE(4)
695#ifndef PARALLEL
696 ALLOCATE(ptr4(dims(1),dims(2),dims(3),dims(4)))
697 READ(unit) ptr4
698 DEALLOCATE(ptr4)
699#endif
700 CASE(5)
701#ifndef PARALLEL
702 ALLOCATE(ptr5(dims(1),dims(2),dims(3),dims(4),dims(5)))
703 READ(unit) ptr5
704 DEALLOCATE(ptr5)
705#endif
706 CASE DEFAULT
707 IF(bytes.GT.0) THEN
708#ifndef PARALLEL
709 ALLOCATE(val(bytes))
710 READ(unit) val
711 DEALLOCATE(val)
712#endif
713 END IF
714 END SELECT
715 END SELECT
716 offset = offset + bytes
717
718#ifndef PARALLEL
719 READ(unit, iostat=ierror) keylen
720#else
721 buffer = ''
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)
725
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
729 ierror=1
730 END IF
731#endif
732 offset = offset + intsize
733 END DO
734#ifndef PARALLEL
735 CLOSE(unit)
736#else
737 CALL mpi_file_close(handle,ierror)
738#endif
739END SUBROUTINE loaddata
740
741END PROGRAM restart
generic source terms module providing functionaly common to all source terms
generic gravity terms module providing functionaly common to all gravity terms
program restart
Definition: restart.f90:49
subroutine loaddata(this, filename)
Loads the datafields from binary input that are necessary for initialization.
Definition: restart.f90:374
type(dict_typ) function, pointer loadconfig(filename)
Loads the whole dictionary from binary input AND scalar data.
Definition: restart.f90:187