9 un, un_m1, pn, pn_m1, incpn, incpn_m1, filename, it, freq_restart, &
10 opt_level_set, opt_level_set_m1, opt_max_vel, opt_mono)
16 TYPE(mesh_type),
TARGET :: vv_mesh,pp_mesh
17 REAL(KIND=8),
INTENT(IN) :: time
18 INTEGER,
DIMENSION(:),
INTENT(IN) :: communicator
19 INTEGER,
DIMENSION(:),
INTENT(IN) :: list_mode
20 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: un, un_m1
21 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: pn, pn_m1, incpn, incpn_m1
22 REAL(KIND=8),
DIMENSION(:,:,:,:),
OPTIONAL,
INTENT(IN) :: opt_level_set, opt_level_set_m1
23 REAL(KIND=8),
OPTIONAL,
INTENT(IN) :: opt_max_vel
24 LOGICAL,
OPTIONAL,
INTENT(IN) :: opt_mono
25 CHARACTER(len=200),
INTENT(IN) :: filename
26 INTEGER,
INTENT(IN) :: it, freq_restart
27 INTEGER :: code, n, i, rang_s, rang_f, nb_procs_s, nb_procs_f
29 CHARACTER(len=3) :: tit, tit_s
30 LOGICAL :: mono=.false.
32 CHARACTER(len=250) :: out_name
34 CALL mpi_comm_size(communicator(1),nb_procs_s,code)
35 CALL mpi_comm_size(communicator(2),nb_procs_f,code)
36 CALL mpi_comm_rank(communicator(1),rang_s,code)
37 CALL mpi_comm_rank(communicator(2),rang_f,code)
39 WRITE(tit,
'(i3)') it/freq_restart
44 WRITE(tit_s,
'(i3)') rang_s
50 IF (present(opt_mono))
THEN
55 out_name =
'suite_ns_I'//tit//
'.'//filename
57 out_name =
'suite_ns_S'//tit_s//
'_I'//tit//
'.'//filename
60 skip = (mono .AND. rang_s /= 0)
63 IF ( (rang_f == n-1) .AND. (.NOT. skip) )
THEN
65 OPEN(unit = 10, file = out_name, position=
'append', &
66 form =
'unformatted', status =
'replace')
68 WRITE(10) time, vv_mesh%np , pp_mesh%np , nb_procs_f,
SIZE(list_mode)
70 WRITE(10) time, nb_procs_s, nb_procs_f,
SIZE(list_mode)
73 OPEN(unit = 10, file = out_name, position=
'append', &
74 form =
'unformatted', status =
'unknown')
77 DO i= 1,
SIZE(list_mode)
78 WRITE(10) list_mode(i)
80 WRITE(10) un_m1(:,:,i)
82 WRITE(10) pn_m1(:,:,i)
83 WRITE(10) incpn(:,:,i)
84 WRITE(10) incpn_m1(:,:,i)
85 IF (present(opt_level_set) .AND. present(opt_level_set_m1))
THEN
86 WRITE(10) opt_level_set(:,:,:,i)
87 WRITE(10) opt_level_set_m1(:,:,:,i)
93 CALL mpi_barrier(communicator(2),code)
100 un, un_m1, pn, pn_m1, incpn, incpn_m1, filename, val_init, interpol, &
101 opt_level_set, opt_level_set_m1, opt_max_vel, opt_mono)
108 REAL(KIND=8),
INTENT(OUT):: time
109 INTEGER,
DIMENSION(:),
INTENT(IN) :: communicator
110 INTEGER,
DIMENSION(:) :: list_mode
111 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(OUT):: un, un_m1
112 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(OUT):: pn, pn_m1, incpn, incpn_m1
113 REAL(KIND=8),
DIMENSION(:,:,:,:),
OPTIONAL,
INTENT(OUT):: opt_level_set, opt_level_set_m1
114 REAL(KIND=8),
OPTIONAL,
INTENT(OUT):: opt_max_vel
115 CHARACTER(len=200),
INTENT(IN) :: filename
116 REAL(KIND=8),
OPTIONAL,
INTENT(IN) :: val_init
117 LOGICAL ,
OPTIONAL,
INTENT(IN) :: interpol
118 LOGICAL ,
OPTIONAL,
INTENT(IN) :: opt_mono
119 REAL(KIND=8) :: max_vel_loc
120 INTEGER :: code, n, i, mode, j, rang_s, nb_procs_s, rang_f, nb_procs_f, nlignes, rank
121 INTEGER :: m_max_cr, nb_procs_r, nb_procs_sr
122 INTEGER :: m_max_c, nb_mode_r, mode_cherche
123 LOGICAL :: trouve, okay
126 CHARACTER(len=3) :: tit_s
127 LOGICAL :: mono=.false.
128 CHARACTER(len=250):: in_name
129 CALL mpi_comm_rank(communicator(2),rang_f,code)
130 CALL mpi_comm_size(communicator(2),nb_procs_f,code)
131 CALL mpi_comm_rank(communicator(1),rang_s,code)
132 CALL mpi_comm_size(communicator(1),nb_procs_s,code)
133 CALL mpi_comm_rank(mpi_comm_world,rank,code)
138 IF (present(opt_level_set) .AND. present(opt_level_set_m1))
THEN
139 nlignes = nlignes + 3
142 WRITE(tit_s,
'(i3)') rang_s
148 IF (present(opt_mono))
THEN
153 in_name =
'suite_ns.'//filename
155 in_name =
'suite_ns_S'//tit_s//
'.'//filename
158 WRITE(*,*)
'restart Navier-Stokes'
159 OPEN(unit = 10, file = in_name,
form =
'unformatted', status =
'unknown')
162 READ(10) time, npv, npp, nb_procs_r, m_max_cr
165 READ(10) time, nb_procs_sr, nb_procs_r, m_max_cr
169 IF ((nb_procs_sr /= nb_procs_s) .AND. (.NOT. mono))
THEN
170 CALL
error_petsc(
'BUG in read_restart: nb_procs_Sr /= nb_procs_S')
174 IF (rang_f == 0)
THEN
175 WRITE(*,*)
'File name', trim(adjustl(in_name))
176 WRITE(*,*)
'Time = ', time
177 WRITE(*,*)
'Number of processors from restart file = ',nb_procs_r
178 WRITE(*,*)
'Number of modes per processor from restart file = ',m_max_cr
181 m_max_c =
SIZE(list_mode)
182 nb_mode_r = nb_procs_r*m_max_cr
185 IF (nb_procs_f*m_max_c /= nb_mode_r)
THEN
187 WRITE(*,*)
'Warning in read_restart_ns: nb_procs_F*m_max_c /= nb_mode_r'
192 IF (present(interpol))
THEN
200 WRITE(*,*)
'Reading Navier-Stokes modes ...'
204 OPEN(unit = 10, file = in_name,
form =
'unformatted', status =
'unknown')
207 mode_cherche = list_mode(i)
215 IF (j/=rang_f*m_max_c+i)
THEN
226 IF (mode == mode_cherche)
THEN
228 READ(10) un_m1(:,:,i)
230 READ(10) pn_m1(:,:,i)
231 READ(10) incpn(:,:,i)
232 READ(10) incpn_m1(:,:,i)
233 IF (present(opt_level_set) .AND. present(opt_level_set_m1))
THEN
234 READ(10) opt_level_set(:,:,:,i)
235 READ(10) opt_level_set_m1(:,:,:,i)
238 WRITE(*,
'(A,i4,A)')
'mode ns ', mode_cherche,
' found '
248 IF (.NOT.trouve)
THEN
249 IF (present(val_init))
THEN
250 un(:,:,i) = val_init ; un_m1(:,:,i) = val_init
251 pn(:,:,i) = val_init ; pn_m1(:,:,i) = val_init
252 incpn(:,:,i) = val_init ; incpn_m1(:,:,i) = val_init
253 IF (present(opt_level_set) .AND. present(opt_level_set_m1))
THEN
254 opt_level_set(:,:,:,i) = val_init
255 opt_level_set_m1(:,:,:,i) = val_init
256 max_vel_loc = val_init
258 WRITE(*,
'(A,i4,A)')
'mode ns', mode_cherche,
' not found'
260 un(:,:,i) = 0.d0 ; un_m1(:,:,i) = 0.d0
261 pn(:,:,i) = 0.d0 ; pn_m1(:,:,i) = 0.d0
262 incpn(:,:,i) = 0.d0 ; incpn_m1(:,:,i) = 0.d0
263 IF (present(opt_level_set) .AND. present(opt_level_set_m1))
THEN
264 opt_level_set(:,:,:,i)=0.d0
265 opt_level_set_m1(:,:,:,i)=0.d0
267 WRITE(*,*)
'mode ns', mode_cherche,
' not found'
273 IF (present(opt_max_vel))
THEN
274 CALL mpi_allreduce(max_vel_loc, opt_max_vel, 1, mpi_double_precision, &
275 mpi_max, communicator(2), code)
280 SUBROUTINE write_restart_maxwell(communicator, H_mesh, phi_mesh, time, list_mode, Hn, Hn1, Bn, Bn1, phin, phin1, &
281 filename, it, freq_restart, opt_mono)
287 TYPE(mesh_type),
TARGET :: h_mesh,phi_mesh
288 INTEGER,
DIMENSION(:),
INTENT(IN) :: communicator
289 REAL(KIND=8),
INTENT(IN) :: time
290 INTEGER,
DIMENSION(:),
INTENT(IN) :: list_mode
291 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: hn, hn1, bn, bn1
292 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: phin, phin1
293 CHARACTER(len=200),
INTENT(IN) :: filename
294 INTEGER,
INTENT(IN) :: it, freq_restart
295 LOGICAL,
OPTIONAL,
INTENT(IN) :: opt_mono
297 INTEGER :: rang_s, rang_f, code, nb_procs_s, nb_procs_f, n, i
299 CHARACTER(len=3) :: tit, tit_s
300 CHARACTER(len=250) :: out_name
301 LOGICAL :: mono=.false.
304 CALL mpi_comm_size(communicator(1),nb_procs_s,code)
305 CALL mpi_comm_size(communicator(2),nb_procs_f,code)
306 CALL mpi_comm_rank(communicator(1),rang_s,code)
307 CALL mpi_comm_rank(communicator(2),rang_f,code)
309 WRITE(tit,
'(i3)') it/freq_restart
314 WRITE(tit_s,
'(i3)') rang_s
320 IF (present(opt_mono))
THEN
325 out_name =
'suite_maxwell_I'//tit//
'.'//filename
327 out_name =
'suite_maxwell_S'//tit_s//
'_I'//tit//
'.'//filename
329 skip = (mono .AND. rang_s /= 0)
332 IF ( (rang_f == n-1) .AND. (.NOT. skip) )
THEN
333 IF (rang_f == 0)
THEN
334 OPEN(unit = 10, file = out_name, position=
'append', &
335 form =
'unformatted', status =
'replace')
337 WRITE(10) time, h_mesh%np , phi_mesh%np , nb_procs_f,
SIZE(list_mode)
339 WRITE(10) time, nb_procs_s, nb_procs_f,
SIZE(list_mode)
342 OPEN(unit = 10, file = out_name, position=
'append', &
343 form =
'unformatted', status =
'unknown')
345 DO i= 1,
SIZE(list_mode)
346 WRITE(10) list_mode(i)
347 IF (h_mesh%me /=0)
THEN
358 IF (phi_mesh%me /=0)
THEN
359 WRITE(10) phin(:,:,i)
360 WRITE(10) phin1(:,:,i)
368 CALL mpi_barrier(communicator(2),code)
374 SUBROUTINE read_restart_maxwell(communicator, H_mesh, phi_mesh, time, list_mode, Hn, Hn1, Bn, Bn1, phin, phin1, &
375 filename, val_init, interpol, opt_mono)
384 TYPE(mesh_type),
TARGET :: h_mesh,phi_mesh
385 INTEGER,
DIMENSION(:),
INTENT(IN) :: communicator
386 REAL(KIND=8),
INTENT(OUT):: time
387 INTEGER,
DIMENSION(:) :: list_mode
388 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(OUT):: hn, hn1, bn, bn1
389 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(OUT):: phin, phin1
390 CHARACTER(len=200),
INTENT(IN) :: filename
391 REAL(KIND=8),
OPTIONAL,
INTENT(IN) :: val_init
392 LOGICAL ,
OPTIONAL,
INTENT(IN) :: interpol
393 LOGICAL ,
OPTIONAL,
INTENT(IN) :: opt_mono
395 INTEGER :: code, n, i, mode, j, rang_s, rang_f, nb_procs_f, nb_procs_s
396 INTEGER :: m_max_cr, nb_procs_r, nb_procs_sr
397 INTEGER :: m_max_c, nb_mode_r, mode_cherche
398 LOGICAL :: trouve, okay
401 CHARACTER(len=3) :: tit_s
402 CHARACTER(len=250):: in_name
403 LOGICAL :: mono=.false.
405 CALL mpi_comm_rank(communicator(2),rang_f,code)
406 CALL mpi_comm_size(communicator(2),nb_procs_f,code)
407 CALL mpi_comm_rank(communicator(1),rang_s,code)
408 CALL mpi_comm_size(communicator(1),nb_procs_s,code)
410 WRITE(tit_s,
'(i3)') rang_s
415 IF (present(opt_mono))
THEN
420 in_name =
'suite_maxwell.'//filename
422 in_name =
'suite_maxwell_S'//tit_s//
'.'//filename
425 WRITE(*,*)
'restart Maxwell'
426 OPEN(unit = 10, file = in_name,
form =
'unformatted', status =
'unknown')
428 READ(10) time, nph, npp, nb_procs_r, m_max_cr
430 READ(10) time, nb_procs_sr, nb_procs_r, m_max_cr
433 IF ((nb_procs_sr /= nb_procs_s) .AND. (.NOT. mono))
THEN
434 CALL
error_petsc(
'BUG in read_restart: nb_procs_Sr /= nb_procs_S')
440 IF (rang_f == 0)
THEN
441 WRITE(*,*)
'proprietes fichier ', in_name
442 WRITE(*,*)
'time =',time
443 WRITE(*,*)
'nombre de processeurs = ',nb_procs_r
444 WRITE(*,*)
'nombre de modes par processeur = ',m_max_cr
447 m_max_c =
SIZE(list_mode)
448 nb_mode_r = nb_procs_r*m_max_cr
451 IF (nb_procs_f*m_max_c /= nb_mode_r)
THEN
457 IF (present(interpol))
THEN
464 WRITE(*,*)
'Reading Maxwell modes ...'
467 OPEN(unit = 10, file = in_name,
form =
'unformatted', status =
'unknown')
470 mode_cherche = list_mode(i)
478 IF (j/=rang_f*m_max_c+i)
THEN
489 IF (mode == mode_cherche)
THEN
490 IF (h_mesh%me /=0)
THEN
501 IF (phi_mesh%me /=0)
THEN
503 READ(10) phin1(:,:,i)
508 WRITE(*,*)
'mode maxwell',mode_cherche,
' trouve '
517 IF (.NOT.trouve)
THEN
518 IF (present(val_init))
THEN
519 hn(:,:,i) = val_init ; hn1(:,:,i) = val_init
520 phin(:,:,i) = val_init ; phin1(:,:,i) = val_init
521 WRITE(*,*)
'mode maxwell',mode_cherche,
' non trouve'
523 hn(:,:,i) = 0.d0 ; hn1(:,:,i) = 0.d0
524 phin(:,:,i) = 0.d0 ; phin1(:,:,i) = 0.d0
525 WRITE(*,*)
'mode maxwell',mode_cherche,
' non trouve'
535 tempn, tempn_m1, filename, it, freq_restart, opt_mono)
542 REAL(KIND=8),
INTENT(IN) :: time
543 INTEGER,
DIMENSION(:),
INTENT(IN) :: communicator
544 INTEGER,
DIMENSION(:),
INTENT(IN) :: list_mode
545 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: tempn, tempn_m1
546 LOGICAL,
OPTIONAL,
INTENT(IN) :: opt_mono
547 CHARACTER(len=200),
INTENT(IN) :: filename
548 INTEGER,
INTENT(IN) :: it, freq_restart
549 INTEGER :: code, n, i, rang_s, rang_f, nb_procs_s, nb_procs_f
551 CHARACTER(len=3) :: tit, tit_s
552 LOGICAL :: mono=.false.
554 CHARACTER(len=250) :: out_name
556 CALL mpi_comm_size(communicator(1),nb_procs_s,code)
557 CALL mpi_comm_size(communicator(2),nb_procs_f,code)
558 CALL mpi_comm_rank(communicator(1),rang_s,code)
559 CALL mpi_comm_rank(communicator(2),rang_f,code)
561 WRITE(tit,
'(i3)') it/freq_restart
566 WRITE(tit_s,
'(i3)') rang_s
572 IF (present(opt_mono))
THEN
577 out_name =
'suite_temp_I'//tit//
'.'//filename
579 out_name =
'suite_temp_S'//tit_s//
'_I'//tit//
'.'//filename
582 skip = (mono .AND. rang_s /= 0)
585 IF ( (rang_f == n-1) .AND. (.NOT. skip) )
THEN
586 IF (rang_f == 0)
THEN
587 OPEN(unit = 10, file = out_name, position=
'append', &
588 form =
'unformatted', status =
'replace')
590 WRITE(10) time, temp_mesh%np , nb_procs_f,
SIZE(list_mode)
592 WRITE(10) time, nb_procs_s, nb_procs_f,
SIZE(list_mode)
595 OPEN(unit = 10, file = out_name, position=
'append', &
596 form =
'unformatted', status =
'unknown')
599 DO i= 1,
SIZE(list_mode)
600 WRITE(10) list_mode(i)
601 WRITE(10) tempn(:,:,i)
602 WRITE(10) tempn_m1(:,:,i)
606 CALL mpi_barrier(communicator(2),code)
612 tempn, tempn_m1, filename, val_init, interpol, opt_mono)
619 REAL(KIND=8),
INTENT(OUT):: time
620 INTEGER,
DIMENSION(:),
INTENT(IN) :: communicator
621 INTEGER,
DIMENSION(:) :: list_mode
622 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(OUT):: tempn, tempn_m1
623 CHARACTER(len=200),
INTENT(IN) :: filename
624 REAL(KIND=8),
OPTIONAL,
INTENT(IN) :: val_init
625 LOGICAL ,
OPTIONAL,
INTENT(IN) :: interpol
626 LOGICAL ,
OPTIONAL,
INTENT(IN) :: opt_mono
627 INTEGER :: code, n, i, mode, j, rang_s, nb_procs_s, rang_f, nb_procs_f, nlignes, rank
628 INTEGER :: m_max_cr, nb_procs_r, nb_procs_sr
629 INTEGER :: m_max_c, nb_mode_r, mode_cherche
630 LOGICAL :: trouve, okay
633 CHARACTER(len=3) :: tit_s
634 LOGICAL :: mono=.false.
635 CHARACTER(len=250):: in_name
636 CALL mpi_comm_rank(communicator(2),rang_f,code)
637 CALL mpi_comm_size(communicator(2),nb_procs_f,code)
638 CALL mpi_comm_rank(communicator(1),rang_s,code)
639 CALL mpi_comm_size(communicator(1),nb_procs_s,code)
640 CALL mpi_comm_rank(mpi_comm_world,rank,code)
644 WRITE(tit_s,
'(i3)') rang_s
650 IF (present(opt_mono))
THEN
655 in_name =
'suite_temp.'//filename
657 in_name =
'suite_temp_S'//tit_s//
'.'//filename
660 WRITE(*,*)
'restart temperature'
661 OPEN(unit = 10, file = in_name,
form =
'unformatted', status =
'unknown')
664 READ(10) time, np, nb_procs_r, m_max_cr
667 READ(10) time, nb_procs_sr, nb_procs_r, m_max_cr
671 IF ((nb_procs_sr /= nb_procs_s) .AND. (.NOT. mono))
THEN
672 CALL
error_petsc(
'BUG in read_restart: nb_procs_Sr /= nb_procs_S')
676 IF (rang_f == 0)
THEN
677 WRITE(*,*)
'File name', trim(adjustl(in_name))
678 WRITE(*,*)
'Time = ', time
679 WRITE(*,*)
'Number of processors from restart file = ',nb_procs_r
680 WRITE(*,*)
'Number of modes per processor from restart file = ',m_max_cr
683 m_max_c =
SIZE(list_mode)
684 nb_mode_r = nb_procs_r*m_max_cr
687 IF (nb_procs_f*m_max_c /= nb_mode_r)
THEN
689 WRITE(*,*)
'Warning in read_restart_temp: nb_procs_F*m_max_c /= nb_mode_r'
694 IF (present(interpol))
THEN
702 WRITE(*,*)
'Reading temperature modes ...'
706 OPEN(unit = 10, file = in_name,
form =
'unformatted', status =
'unknown')
709 mode_cherche = list_mode(i)
717 IF (j/=rang_f*m_max_c+i)
THEN
728 IF (mode == mode_cherche)
THEN
729 READ(10) tempn(:,:,i)
730 READ(10) tempn_m1(:,:,i)
731 WRITE(*,
'(A,i4,A)')
'mode temp ', mode_cherche,
' found '
741 IF (.NOT.trouve)
THEN
742 IF (present(val_init))
THEN
743 tempn(:,:,i) = val_init ; tempn_m1(:,:,i) = val_init
744 WRITE(*,
'(A,i4,A)')
'mode temp', mode_cherche,
' not found'
746 tempn(:,:,i) = 0.d0 ; tempn_m1(:,:,i) = 0.d0
747 WRITE(*,*)
'mode ns', mode_cherche,
' not found'
integer function eval_blank(len_str, string)
subroutine write_restart_maxwell(communicator, H_mesh, phi_mesh, time, list_mode, Hn, Hn1, Bn, Bn1, phin, phin1, filename, it, freq_restart, opt_mono)
subroutine write_restart_ns(communicator, vv_mesh, pp_mesh, time, list_mode, un, un_m1, pn, pn_m1, incpn, incpn_m1, filename, it, freq_restart, opt_level_set, opt_level_set_m1, opt_max_vel, opt_mono)
subroutine write_restart_temp(communicator, temp_mesh, time, list_mode, tempn, tempn_m1, filename, it, freq_restart, opt_mono)
subroutine read_restart_temp(communicator, time, list_mode, tempn, tempn_m1, filename, val_init, interpol, opt_mono)
subroutine read_restart_ns(communicator, time, list_mode, un, un_m1, pn, pn_m1, incpn, incpn_m1, filename, val_init, interpol, opt_level_set, opt_level_set_m1, opt_max_vel, opt_mono)
subroutine error_petsc(string)
subroutine read_restart_maxwell(communicator, H_mesh, phi_mesh, time, list_mode, Hn, Hn1, Bn, Bn1, phin, phin1, filename, val_init, interpol, opt_mono)
section doc_intro_frame_work_num_app Numerical approximation subsection doc_intro_fram_work_num_app_Fourier_FEM Fourier Finite element representation The SFEMaNS code uses a hybrid Fourier Finite element formulation The Fourier decomposition allows to approximate the problem’s solutions for each Fourier mode modulo nonlinear terms that are made explicit The variables are then approximated on a meridian section of the domain with a finite element method The numerical approximation of a function f $f f is written in the following generic form