8 SUBROUTINE write_restart_ns(communicator, vv_mesh, pp_mesh, time, list_mode, &
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, opt_dt)
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, opt_dt
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')
67 IF (
PRESENT(opt_dt))
THEN 69 WRITE(10) time, vv_mesh%np , pp_mesh%np , nb_procs_f,
SIZE(list_mode), opt_dt
71 WRITE(10) time, nb_procs_s, nb_procs_f,
SIZE(list_mode), opt_dt
75 WRITE(10) time, vv_mesh%np , pp_mesh%np , nb_procs_f,
SIZE(list_mode)
77 WRITE(10) time, nb_procs_s, nb_procs_f,
SIZE(list_mode)
81 OPEN(unit = 10, file = out_name, position=
'append', &
82 form =
'unformatted', status =
'unknown')
85 DO i= 1,
SIZE(list_mode)
86 WRITE(10) list_mode(i)
88 WRITE(10) un_m1(:,:,i)
90 WRITE(10) pn_m1(:,:,i)
91 WRITE(10) incpn(:,:,i)
92 WRITE(10) incpn_m1(:,:,i)
93 IF (
PRESENT(opt_level_set) .AND.
PRESENT(opt_level_set_m1))
THEN 94 WRITE(10) opt_level_set(:,:,:,i)
95 WRITE(10) opt_level_set_m1(:,:,:,i)
101 CALL mpi_barrier(communicator(2),code)
107 un, un_m1, pn, pn_m1, incpn, incpn_m1, filename, val_init, interpol, &
108 opt_level_set, opt_level_set_m1, opt_max_vel, opt_mono &
119 REAL(KIND=8),
INTENT(OUT):: time
120 INTEGER,
DIMENSION(:),
INTENT(IN) :: communicator
121 INTEGER,
DIMENSION(:) :: list_mode
122 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(OUT):: un, un_m1
123 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(OUT):: pn, pn_m1, incpn, incpn_m1
124 REAL(KIND=8),
DIMENSION(:,:,:,:),
OPTIONAL,
INTENT(OUT):: opt_level_set, opt_level_set_m1
125 REAL(KIND=8),
OPTIONAL,
INTENT(OUT):: opt_max_vel
126 CHARACTER(len=200),
INTENT(IN) :: filename
127 REAL(KIND=8),
OPTIONAL,
INTENT(IN) :: val_init
128 LOGICAL ,
OPTIONAL,
INTENT(IN) :: interpol
129 LOGICAL ,
OPTIONAL,
INTENT(IN) :: opt_mono
130 INTEGER ,
OPTIONAL,
INTENT(IN) :: opt_it
131 REAL(KIND=8),
OPTIONAL,
INTENT(IN) :: opt_dt
132 REAL(KIND=8) :: max_vel_loc, dt_read, dt_ratio
133 INTEGER :: code, n, i, mode, j, rang_S, nb_procs_S, rang_F, nb_procs_F, nlignes, rank
134 INTEGER :: m_max_cr, nb_procs_r, nb_procs_Sr
135 INTEGER :: m_max_c, nb_mode_r, mode_cherche
136 LOGICAL :: trouve, okay
139 CHARACTER(len=3) :: tit_S
141 CHARACTER(len=3) :: tit
143 LOGICAL :: mono=.false.
144 CHARACTER(len=250):: in_name
145 CALL mpi_comm_rank(communicator(2),rang_f,code)
146 CALL mpi_comm_size(communicator(2),nb_procs_f,code)
147 CALL mpi_comm_rank(communicator(1),rang_s,code)
148 CALL mpi_comm_size(communicator(1),nb_procs_s,code)
149 CALL mpi_comm_rank(mpi_comm_world,rank,code)
154 IF (
PRESENT(opt_level_set) .AND.
PRESENT(opt_level_set_m1))
THEN 155 nlignes = nlignes + 3
159 IF (
PRESENT(opt_it))
THEN 160 WRITE(tit,
'(i3)') opt_it
168 WRITE(tit_s,
'(i3)') rang_s
174 IF (
PRESENT(opt_mono))
THEN 180 IF (
PRESENT(opt_it))
THEN 181 in_name =
'suite_ns_I'//tit//
'.'//filename
183 in_name =
'suite_ns.'//filename
186 IF (
PRESENT(opt_it))
THEN 187 in_name =
'suite_ns_S'//tit_s//
'_I'//tit//
'.'//filename
189 in_name =
'suite_ns_S'//tit_s//
'.'//filename
195 IF (
PRESENT(opt_it))
THEN 196 WRITE(*,*)
'restart Navier-Stokes for it', opt_it
198 WRITE(*,*)
'restart Navier-Stokes' 201 OPEN(unit = 10, file = in_name,
form =
'unformatted', status =
'unknown')
203 IF (
PRESENT(opt_dt))
THEN 205 READ(10) time, npv, npp, nb_procs_r, m_max_cr, dt_read
208 READ(10) time, nb_procs_sr, nb_procs_r, m_max_cr, dt_read
212 READ(10) time, npv, npp, nb_procs_r, m_max_cr
215 READ(10) time, nb_procs_sr, nb_procs_r, m_max_cr
221 IF ((nb_procs_sr /= nb_procs_s) .AND. (.NOT. mono))
THEN 222 CALL error_petsc(
'BUG in read_restart: nb_procs_Sr /= nb_procs_S')
226 IF (rang_f == 0)
THEN 227 WRITE(*,*)
'File name', trim(adjustl(in_name))
228 WRITE(*,*)
'Time = ', time
229 WRITE(*,*)
'Number of processors from restart file = ',nb_procs_r
230 WRITE(*,*)
'Number of modes per processor from restart file = ',m_max_cr
233 m_max_c =
SIZE(list_mode)
234 nb_mode_r = nb_procs_r*m_max_cr
237 IF (nb_procs_f*m_max_c /= nb_mode_r)
THEN 239 WRITE(*,*)
'Warning in read_restart_ns: nb_procs_F*m_max_c /= nb_mode_r' 244 IF (
PRESENT(interpol))
THEN 252 WRITE(*,*)
'Reading Navier-Stokes modes ...' 256 OPEN(unit = 10, file = in_name,
form =
'unformatted', status =
'unknown')
259 mode_cherche = list_mode(i)
267 IF (j/=rang_f*m_max_c+i)
THEN 278 IF (mode == mode_cherche)
THEN 280 READ(10) un_m1(:,:,i)
282 READ(10) pn_m1(:,:,i)
283 READ(10) incpn(:,:,i)
284 READ(10) incpn_m1(:,:,i)
285 IF (
PRESENT(opt_level_set) .AND.
PRESENT(opt_level_set_m1))
THEN 286 READ(10) opt_level_set(:,:,:,i)
287 READ(10) opt_level_set_m1(:,:,:,i)
290 WRITE(*,
'(A,i4,A)')
'mode ns ', mode_cherche,
' found ' 300 IF (.NOT.trouve)
THEN 301 IF (
PRESENT(val_init))
THEN 302 un(:,:,i) = val_init ; un_m1(:,:,i) = val_init
303 pn(:,:,i) = val_init ; pn_m1(:,:,i) = val_init
304 incpn(:,:,i) = val_init ; incpn_m1(:,:,i) = val_init
305 IF (
PRESENT(opt_level_set) .AND.
PRESENT(opt_level_set_m1))
THEN 306 opt_level_set(:,:,:,i) = val_init
307 opt_level_set_m1(:,:,:,i) = val_init
308 max_vel_loc = val_init
310 WRITE(*,
'(A,i4,A)')
'mode ns', mode_cherche,
' not found' 312 un(:,:,i) = 0.d0 ; un_m1(:,:,i) = 0.d0
313 pn(:,:,i) = 0.d0 ; pn_m1(:,:,i) = 0.d0
314 incpn(:,:,i) = 0.d0 ; incpn_m1(:,:,i) = 0.d0
315 IF (
PRESENT(opt_level_set) .AND.
PRESENT(opt_level_set_m1))
THEN 316 opt_level_set(:,:,:,i)=0.d0
317 opt_level_set_m1(:,:,:,i)=0.d0
319 WRITE(*,*)
'mode ns', mode_cherche,
' not found' 325 IF (
PRESENT(opt_max_vel))
THEN 326 CALL mpi_allreduce(max_vel_loc, opt_max_vel, 1, mpi_double_precision, &
327 mpi_max, communicator(2), code)
331 IF (
PRESENT(opt_dt))
THEN 332 IF (abs((opt_dt - dt_read)/opt_dt).GT.1d-4)
THEN 333 dt_ratio = opt_dt/dt_read
335 WRITE(*,*)
'In Navier-Stokes restart, suite_time_step different from inputs%dt ...' 336 WRITE(*,*)
' opt_dt, dt_read =', opt_dt, dt_read
338 un_m1 = dt_ratio * un_m1 +(1.d0 - dt_ratio)* un
339 pn_m1 = dt_ratio * pn_m1 +(1.d0 - dt_ratio)* pn
340 incpn_m1 = dt_ratio * incpn_m1 +(1.d0 - dt_ratio)* incpn
341 IF (
PRESENT(opt_level_set) .AND.
PRESENT(opt_level_set_m1))
THEN 342 opt_level_set_m1 = dt_ratio * opt_level_set_m1 +(1.d0 - dt_ratio)* opt_level_set
350 un, der_un, pn, der_pn, filename, it, freq_restart, &
351 opt_level_set, opt_level_set_m1, opt_max_vel, opt_mono)
357 TYPE(
mesh_type),
TARGET :: vv_mesh,pp_mesh
358 REAL(KIND=8),
INTENT(IN) :: time
359 INTEGER,
DIMENSION(:),
INTENT(IN) :: communicator
360 INTEGER,
DIMENSION(:),
INTENT(IN) :: list_mode
363 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: un
364 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: pn
365 REAL(KIND=8),
DIMENSION(:,:,:,:),
OPTIONAL,
INTENT(IN) :: opt_level_set, opt_level_set_m1
366 REAL(KIND=8),
OPTIONAL,
INTENT(IN) :: opt_max_vel
367 LOGICAL,
OPTIONAL,
INTENT(IN) :: opt_mono
368 CHARACTER(len=200),
INTENT(IN) :: filename
369 INTEGER,
INTENT(IN) :: it, freq_restart
370 INTEGER :: code, n, i, rang_S, rang_F, nb_procs_S, nb_procs_F
371 INTEGER :: l, lblank, kp
372 CHARACTER(len=3) :: tit, tit_S
373 LOGICAL :: mono=.false.
375 CHARACTER(len=250) :: out_name
377 CALL mpi_comm_size(communicator(1),nb_procs_s,code)
378 CALL mpi_comm_size(communicator(2),nb_procs_f,code)
379 CALL mpi_comm_rank(communicator(1),rang_s,code)
380 CALL mpi_comm_rank(communicator(2),rang_f,code)
382 WRITE(tit,
'(i3)') it/freq_restart
387 WRITE(tit_s,
'(i3)') rang_s
393 IF (
PRESENT(opt_mono))
THEN 398 out_name =
'suite_ns_I'//tit//
'.'//filename
400 out_name =
'suite_ns_S'//tit_s//
'_I'//tit//
'.'//filename
403 skip = (mono .AND. rang_s /= 0)
406 IF ( (rang_f == n-1) .AND. (.NOT. skip) )
THEN 407 IF (rang_f == 0)
THEN 408 OPEN(unit = 10, file = out_name, position=
'append', &
409 form =
'unformatted', status =
'replace')
411 WRITE(10) time, vv_mesh%np , pp_mesh%np , nb_procs_f,
SIZE(list_mode),
inputs%taylor_order
413 WRITE(10) time, nb_procs_s, nb_procs_f,
SIZE(list_mode),
inputs%taylor_order
416 OPEN(unit = 10, file = out_name, position=
'append', &
417 form =
'unformatted', status =
'unknown')
419 DO i= 1,
SIZE(list_mode)
420 WRITE(10) list_mode(i)
422 DO kp = 1,
inputs%taylor_order-1
423 WRITE(10) der_un(kp)%DRT(:,:,i)
426 DO kp = 1,
inputs%taylor_order-1
427 WRITE(10) der_pn(kp)%DRT(:,:,i)
429 IF (
PRESENT(opt_level_set) .AND.
PRESENT(opt_level_set_m1))
THEN 430 WRITE(10) opt_level_set(:,:,:,i)
431 WRITE(10) opt_level_set_m1(:,:,:,i)
432 WRITE(10) opt_max_vel
437 CALL mpi_barrier(communicator(2),code)
443 un, der_un, pn, der_pn, filename, val_init, interpol, &
444 opt_level_set, opt_level_set_m1, opt_max_vel, opt_mono, &
455 REAL(KIND=8),
INTENT(OUT):: time
456 INTEGER,
DIMENSION(:),
INTENT(IN) :: communicator
457 INTEGER,
DIMENSION(:) :: list_mode
458 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(OUT):: un
459 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(OUT):: pn
462 REAL(KIND=8),
DIMENSION(:,:,:,:),
OPTIONAL,
INTENT(OUT):: opt_level_set, opt_level_set_m1
463 REAL(KIND=8),
OPTIONAL,
INTENT(OUT):: opt_max_vel
464 CHARACTER(len=200),
INTENT(IN) :: filename
465 REAL(KIND=8),
OPTIONAL,
INTENT(IN) :: val_init
466 LOGICAL ,
OPTIONAL,
INTENT(IN) :: interpol
467 LOGICAL ,
OPTIONAL,
INTENT(IN) :: opt_mono
468 INTEGER ,
OPTIONAL,
INTENT(IN) :: opt_it
469 REAL(KIND=8) :: max_vel_loc
470 INTEGER :: code, n, i, mode, j, rang_S, nb_procs_S, rang_F, nb_procs_F, nlignes, rank
471 INTEGER :: m_max_cr, nb_procs_r, nb_procs_Sr
472 INTEGER :: m_max_c, nb_mode_r, mode_cherche, taylor_order, taylor_order_min
473 LOGICAL :: trouve, okay
474 INTEGER :: npv, npp, kp
476 CHARACTER(len=3) :: tit_S
478 CHARACTER(len=3) :: tit
480 LOGICAL :: mono=.false.
481 CHARACTER(len=250):: in_name
482 CALL mpi_comm_rank(communicator(2),rang_f,code)
483 CALL mpi_comm_size(communicator(2),nb_procs_f,code)
484 CALL mpi_comm_rank(communicator(1),rang_s,code)
485 CALL mpi_comm_size(communicator(1),nb_procs_s,code)
486 CALL mpi_comm_rank(mpi_comm_world,rank,code)
490 WRITE(tit_s,
'(i3)') rang_s
497 IF (
PRESENT(opt_it))
THEN 498 WRITE(tit,
'(i3)') opt_it
506 IF (
PRESENT(opt_mono))
THEN 512 IF (
PRESENT(opt_it))
THEN 513 in_name =
'suite_ns_I'//tit//
'.'//filename
515 in_name =
'suite_ns.'//filename
518 IF (
PRESENT(opt_it))
THEN 519 in_name =
'suite_ns_S'//tit_s//
'_I'//tit//
'.'//filename
521 in_name =
'suite_ns_S'//tit_s//
'.'//filename
527 IF (
PRESENT(opt_it))
THEN 528 WRITE(*,*)
'restart Navier-Stokes for it', opt_it
530 WRITE(*,*)
'restart Navier-Stokes' 534 OPEN(unit = 10, file = in_name,
form =
'unformatted', status =
'unknown')
537 READ(10) time, npv, npp, nb_procs_r, m_max_cr, taylor_order
540 READ(10) time, nb_procs_sr, nb_procs_r, m_max_cr, taylor_order
543 taylor_order_min = min(
inputs%taylor_order,taylor_order)
545 nlignes = 2*taylor_order
546 IF (
PRESENT(opt_level_set) .AND.
PRESENT(opt_level_set_m1))
THEN 547 nlignes = nlignes + 3
550 IF ((nb_procs_sr /= nb_procs_s) .AND. (.NOT. mono))
THEN 551 CALL error_petsc(
'BUG in read_restart: nb_procs_Sr /= nb_procs_S')
555 IF (rang_f == 0)
THEN 556 WRITE(*,*)
'File name', trim(adjustl(in_name))
557 WRITE(*,*)
'Time = ', time
558 WRITE(*,*)
'Number of processors from restart file = ',nb_procs_r
559 WRITE(*,*)
'Number of modes per processor from restart file = ',m_max_cr
562 m_max_c =
SIZE(list_mode)
563 nb_mode_r = nb_procs_r*m_max_cr
566 IF (nb_procs_f*m_max_c /= nb_mode_r)
THEN 568 WRITE(*,*)
'Warning in read_restart_ns: nb_procs_F*m_max_c /= nb_mode_r' 573 IF (
PRESENT(interpol))
THEN 581 WRITE(*,*)
'Reading Navier-Stokes modes ...' 585 OPEN(unit = 10, file = in_name,
form =
'unformatted', status =
'unknown')
588 mode_cherche = list_mode(i)
596 IF (j/=rang_f*m_max_c+i)
THEN 607 IF (mode == mode_cherche)
THEN 609 DO kp = 1, taylor_order_min-1
610 READ(10) der_un(kp)%DRT(:,:,i)
612 DO kp = taylor_order_min, taylor_order-1
616 DO kp = 1, taylor_order_min-1
617 READ(10) der_pn(kp)%DRT(:,:,i)
619 DO kp = taylor_order_min, taylor_order-1
622 DO kp = taylor_order_min ,
inputs%taylor_order-1
623 der_un(kp)%DRT(:,:,i) = 0.d0
624 der_pn(kp)%DRT(:,:,i) = 0.d0
626 IF (
PRESENT(opt_level_set) .AND.
PRESENT(opt_level_set_m1))
THEN 627 READ(10) opt_level_set(:,:,:,i)
628 READ(10) opt_level_set_m1(:,:,:,i)
631 WRITE(*,
'(A,i4,A)')
'mode ns ', mode_cherche,
' found ' 641 IF (.NOT.trouve)
THEN 642 DO kp = 1,
inputs%taylor_order-1
643 der_un(kp)%DRT(:,:,i) = 0.d0
644 der_pn(kp)%DRT(:,:,i) = 0.d0
646 IF (
PRESENT(val_init))
THEN 649 IF (
PRESENT(opt_level_set) .AND.
PRESENT(opt_level_set_m1))
THEN 650 opt_level_set(:,:,:,i) = val_init
651 opt_level_set_m1(:,:,:,i) = val_init
652 max_vel_loc = val_init
654 WRITE(*,
'(A,i4,A)')
'mode ns', mode_cherche,
' not found' 658 IF (
PRESENT(opt_level_set) .AND.
PRESENT(opt_level_set_m1))
THEN 659 opt_level_set(:,:,:,i)=0.d0
660 opt_level_set_m1(:,:,:,i)=0.d0
662 WRITE(*,*)
'mode ns', mode_cherche,
' not found' 668 IF (
PRESENT(opt_max_vel))
THEN 669 CALL mpi_allreduce(max_vel_loc, opt_max_vel, 1, mpi_double_precision, &
670 mpi_max, communicator(2), code)
675 SUBROUTINE write_restart_maxwell(communicator, H_mesh, phi_mesh, time, list_mode, Hn, Hn1, Bn, Bn1, phin, phin1, &
676 filename, it, freq_restart, opt_mono, opt_dt)
682 TYPE(
mesh_type),
TARGET :: H_mesh,phi_mesh
683 INTEGER,
DIMENSION(:),
INTENT(IN) :: communicator
684 REAL(KIND=8),
INTENT(IN) :: time
685 INTEGER,
DIMENSION(:),
INTENT(IN) :: list_mode
686 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: Hn, Hn1, Bn, Bn1
687 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: phin, phin1
688 CHARACTER(len=200),
INTENT(IN) :: filename
689 INTEGER,
INTENT(IN) :: it, freq_restart
690 LOGICAL,
OPTIONAL,
INTENT(IN) :: opt_mono
691 REAL(KIND=8),
OPTIONAL,
INTENT(IN) :: opt_dt
693 INTEGER :: rang_S, rang_F, code, nb_procs_S, nb_procs_F, n, i
695 CHARACTER(len=3) :: tit, tit_S
696 CHARACTER(len=250) :: out_name
697 LOGICAL :: mono=.false.
700 CALL mpi_comm_size(communicator(1),nb_procs_s,code)
701 CALL mpi_comm_size(communicator(2),nb_procs_f,code)
702 CALL mpi_comm_rank(communicator(1),rang_s,code)
703 CALL mpi_comm_rank(communicator(2),rang_f,code)
705 WRITE(tit,
'(i3)') it/freq_restart
710 WRITE(tit_s,
'(i3)') rang_s
716 IF (
PRESENT(opt_mono))
THEN 721 out_name =
'suite_maxwell_I'//tit//
'.'//filename
723 out_name =
'suite_maxwell_S'//tit_s//
'_I'//tit//
'.'//filename
725 skip = (mono .AND. rang_s /= 0)
728 IF ( (rang_f == n-1) .AND. (.NOT. skip) )
THEN 729 IF (rang_f == 0)
THEN 730 OPEN(unit = 10, file = out_name, position=
'append', &
731 form =
'unformatted', status =
'replace')
732 IF (
PRESENT(opt_dt))
THEN 734 WRITE(10) time, h_mesh%np , phi_mesh%np , nb_procs_f,
SIZE(list_mode), opt_dt
736 WRITE(10) time, nb_procs_s, nb_procs_f,
SIZE(list_mode), opt_dt
740 WRITE(10) time, h_mesh%np , phi_mesh%np , nb_procs_f,
SIZE(list_mode)
742 WRITE(10) time, nb_procs_s, nb_procs_f,
SIZE(list_mode)
746 OPEN(unit = 10, file = out_name, position=
'append', &
747 form =
'unformatted', status =
'unknown')
749 DO i= 1,
SIZE(list_mode)
750 WRITE(10) list_mode(i)
751 IF (h_mesh%me /=0)
THEN 762 IF (phi_mesh%me /=0)
THEN 763 WRITE(10) phin(:,:,i)
764 WRITE(10) phin1(:,:,i)
772 CALL mpi_barrier(communicator(2),code)
778 SUBROUTINE read_restart_maxwell(communicator, H_mesh, phi_mesh, time, list_mode, Hn, Hn1, Bn, Bn1, phin, phin1, &
779 filename, val_init, interpol, opt_mono &
792 TYPE(
mesh_type),
TARGET :: H_mesh,phi_mesh
793 INTEGER,
DIMENSION(:),
INTENT(IN) :: communicator
794 REAL(KIND=8),
INTENT(OUT):: time
795 INTEGER,
DIMENSION(:) :: list_mode
796 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(OUT):: Hn, Hn1, Bn, Bn1
797 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(OUT):: phin, phin1
798 CHARACTER(len=200),
INTENT(IN):: filename
799 REAL(KIND=8),
OPTIONAL,
INTENT(IN) :: val_init
800 LOGICAL ,
OPTIONAL,
INTENT(IN) :: interpol
801 LOGICAL ,
OPTIONAL,
INTENT(IN) :: opt_mono
803 INTEGER ,
OPTIONAL,
INTENT(IN) :: opt_it
805 REAL(KIND=8),
OPTIONAL,
INTENT(IN) :: opt_dt
806 REAL(KIND=8) :: dt_read, dt_ratio
808 INTEGER :: code, n, i, mode, j, rang_S, rang_F, nb_procs_F, nb_procs_S, rank
809 INTEGER :: m_max_cr, nb_procs_r, nb_procs_Sr
810 INTEGER :: m_max_c, nb_mode_r, mode_cherche
811 LOGICAL :: trouve, okay
814 CHARACTER(len=3) :: tit_S
816 CHARACTER(len=3) :: tit
818 CHARACTER(len=250):: in_name
819 LOGICAL :: mono=.false.
821 CALL mpi_comm_rank(communicator(2),rang_f,code)
822 CALL mpi_comm_size(communicator(2),nb_procs_f,code)
823 CALL mpi_comm_rank(communicator(1),rang_s,code)
824 CALL mpi_comm_size(communicator(1),nb_procs_s,code)
825 CALL mpi_comm_rank(mpi_comm_world,rank,code)
828 IF (
PRESENT(opt_it))
THEN 829 WRITE(tit,
'(i3)') opt_it
837 WRITE(tit_s,
'(i3)') rang_s
842 IF (
PRESENT(opt_mono))
THEN 848 IF (
PRESENT(opt_it))
THEN 849 in_name =
'suite_maxwell_I'//tit//
'.'//filename
851 in_name =
'suite_maxwell.'//filename
854 IF (
PRESENT(opt_it))
THEN 855 in_name =
'suite_maxwell_S'//tit_s//
'_I'//tit//
'.'//filename
857 in_name =
'suite_maxwell_S'//tit_s//
'.'//filename
863 IF (
PRESENT(opt_it))
THEN 864 WRITE(*,*)
'restart Maxwell for it', opt_it
866 WRITE(*,*)
'restart Maxwell' 870 OPEN(unit = 10, file = in_name,
form =
'unformatted', status =
'unknown')
871 IF (
PRESENT(opt_dt))
THEN 873 READ(10) time, nph, npp, nb_procs_r, m_max_cr, dt_read
875 READ(10) time, nb_procs_sr, nb_procs_r, m_max_cr, dt_read
879 READ(10) time, nph, npp, nb_procs_r, m_max_cr
881 READ(10) time, nb_procs_sr, nb_procs_r, m_max_cr
885 IF ((nb_procs_sr /= nb_procs_s) .AND. (.NOT. mono))
THEN 886 CALL error_petsc(
'BUG in read_restart: nb_procs_Sr /= nb_procs_S')
892 IF (rang_f == 0)
THEN 893 WRITE(*,*)
'proprietes fichier ', in_name
894 WRITE(*,*)
'time =',time
895 WRITE(*,*)
'nombre de processeurs = ',nb_procs_r
896 WRITE(*,*)
'nombre de modes par processeur = ',m_max_cr
899 m_max_c =
SIZE(list_mode)
900 nb_mode_r = nb_procs_r*m_max_cr
903 IF (nb_procs_f*m_max_c /= nb_mode_r)
THEN 904 WRITE(*,*)
'Warning in read_restart_maxwell: nb_procs_F*m_max_c /= nb_mode_r' 909 IF (
PRESENT(interpol))
THEN 917 WRITE(*,*)
'Reading Maxwell modes ...' 921 OPEN(unit = 10, file = in_name,
form =
'unformatted', status =
'unknown')
924 mode_cherche = list_mode(i)
932 IF (j/=rang_f*m_max_c+i)
THEN 943 IF (mode == mode_cherche)
THEN 944 IF (h_mesh%me /=0)
THEN 955 IF (phi_mesh%me /=0)
THEN 957 READ(10) phin1(:,:,i)
962 WRITE(*,*)
'mode maxwell',mode_cherche,
' trouve ' 971 IF (.NOT.trouve)
THEN 972 IF (
PRESENT(val_init))
THEN 973 hn(:,:,i) = val_init ; hn1(:,:,i) = val_init
974 bn(:,:,i) = val_init ; bn1(:,:,i) = val_init
975 phin(:,:,i) = val_init ; phin1(:,:,i) = val_init
976 WRITE(*,*)
'mode maxwell',mode_cherche,
' non trouve' 978 hn(:,:,i) = 0.d0 ; hn1(:,:,i) = 0.d0
979 bn(:,:,i) = 0.d0 ; bn1(:,:,i) = 0.d0
980 phin(:,:,i) = 0.d0 ; phin1(:,:,i) = 0.d0
981 WRITE(*,*)
'mode maxwell',mode_cherche,
' non trouve' 987 IF (
PRESENT(opt_dt))
THEN 988 IF (abs((opt_dt - dt_read)/opt_dt).GT.1d-4)
THEN 989 dt_ratio = opt_dt/dt_read
991 WRITE(*,*)
'In Maxwell restart, suite_time_step different from inputs%dt ...' 992 WRITE(*,*)
' opt_dt, dt_read =', opt_dt, dt_read
994 hn1 = dt_ratio * hn1 +(1.d0 - dt_ratio)* hn
995 bn1 = dt_ratio * bn1 +(1.d0 - dt_ratio)* bn
996 phin1 = dt_ratio * phin1 +(1.d0 - dt_ratio)* phin
1003 tempn, tempn_m1, filename, it, freq_restart, opt_mono)
1010 REAL(KIND=8),
INTENT(IN) :: time
1011 INTEGER,
DIMENSION(:),
INTENT(IN) :: communicator
1012 INTEGER,
DIMENSION(:),
INTENT(IN) :: list_mode
1013 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: tempn, tempn_m1
1014 LOGICAL,
OPTIONAL,
INTENT(IN) :: opt_mono
1015 CHARACTER(len=200),
INTENT(IN) :: filename
1016 INTEGER,
INTENT(IN) :: it, freq_restart
1017 INTEGER :: code, n, i, rang_S, rang_F, nb_procs_S, nb_procs_F
1018 INTEGER :: l, lblank
1019 CHARACTER(len=3) :: tit, tit_S
1020 LOGICAL :: mono=.false.
1022 CHARACTER(len=250) :: out_name
1024 CALL mpi_comm_size(communicator(1),nb_procs_s,code)
1025 CALL mpi_comm_size(communicator(2),nb_procs_f,code)
1026 CALL mpi_comm_rank(communicator(1),rang_s,code)
1027 CALL mpi_comm_rank(communicator(2),rang_f,code)
1029 WRITE(tit,
'(i3)') it/freq_restart
1031 DO l = 1, lblank - 1
1034 WRITE(tit_s,
'(i3)') rang_s
1036 DO l = 1, lblank - 1
1040 IF (
PRESENT(opt_mono))
THEN 1045 out_name =
'suite_temp_I'//tit//
'.'//filename
1047 out_name =
'suite_temp_S'//tit_s//
'_I'//tit//
'.'//filename
1050 skip = (mono .AND. rang_s /= 0)
1052 DO n = 1, nb_procs_f
1053 IF ( (rang_f == n-1) .AND. (.NOT. skip) )
THEN 1054 IF (rang_f == 0)
THEN 1055 OPEN(unit = 10, file = out_name, position=
'append', &
1056 form =
'unformatted', status =
'replace')
1058 WRITE(10) time, temp_mesh%np , nb_procs_f,
SIZE(list_mode)
1060 WRITE(10) time, nb_procs_s, nb_procs_f,
SIZE(list_mode)
1063 OPEN(unit = 10, file = out_name, position=
'append', &
1064 form =
'unformatted', status =
'unknown')
1067 DO i= 1,
SIZE(list_mode)
1068 WRITE(10) list_mode(i)
1069 WRITE(10) tempn(:,:,i)
1070 WRITE(10) tempn_m1(:,:,i)
1074 CALL mpi_barrier(communicator(2),code)
1080 tempn, tempn_m1, filename, val_init, interpol, opt_mono)
1087 REAL(KIND=8),
INTENT(OUT):: time
1088 INTEGER,
DIMENSION(:),
INTENT(IN) :: communicator
1089 INTEGER,
DIMENSION(:) :: list_mode
1090 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(OUT):: tempn, tempn_m1
1091 CHARACTER(len=200),
INTENT(IN) :: filename
1092 REAL(KIND=8),
OPTIONAL,
INTENT(IN) :: val_init
1093 LOGICAL ,
OPTIONAL,
INTENT(IN) :: interpol
1094 LOGICAL ,
OPTIONAL,
INTENT(IN) :: opt_mono
1095 INTEGER :: code, n, i, mode, j, rang_S, nb_procs_S, rang_F, nb_procs_F, nlignes, rank
1096 INTEGER :: m_max_cr, nb_procs_r, nb_procs_Sr
1097 INTEGER :: m_max_c, nb_mode_r, mode_cherche
1098 LOGICAL :: trouve, okay
1100 INTEGER :: l, lblank
1101 CHARACTER(len=3) :: tit_S
1102 LOGICAL :: mono=.false.
1103 CHARACTER(len=250):: in_name
1104 CALL mpi_comm_rank(communicator(2),rang_f,code)
1105 CALL mpi_comm_size(communicator(2),nb_procs_f,code)
1106 CALL mpi_comm_rank(communicator(1),rang_s,code)
1107 CALL mpi_comm_size(communicator(1),nb_procs_s,code)
1108 CALL mpi_comm_rank(mpi_comm_world,rank,code)
1112 WRITE(tit_s,
'(i3)') rang_s
1114 DO l = 1, lblank - 1
1118 IF (
PRESENT(opt_mono))
THEN 1123 in_name =
'suite_temp.'//filename
1125 in_name =
'suite_temp_S'//tit_s//
'.'//filename
1128 WRITE(*,*)
'restart temperature' 1129 OPEN(unit = 10, file = in_name,
form =
'unformatted', status =
'unknown')
1132 READ(10) time, np, nb_procs_r, m_max_cr
1135 READ(10) time, nb_procs_sr, nb_procs_r, m_max_cr
1139 IF ((nb_procs_sr /= nb_procs_s) .AND. (.NOT. mono))
THEN 1140 CALL error_petsc(
'BUG in read_restart: nb_procs_Sr /= nb_procs_S')
1144 IF (rang_f == 0)
THEN 1145 WRITE(*,*)
'File name', trim(adjustl(in_name))
1146 WRITE(*,*)
'Time = ', time
1147 WRITE(*,*)
'Number of processors from restart file = ',nb_procs_r
1148 WRITE(*,*)
'Number of modes per processor from restart file = ',m_max_cr
1151 m_max_c =
SIZE(list_mode)
1152 nb_mode_r = nb_procs_r*m_max_cr
1155 IF (nb_procs_f*m_max_c /= nb_mode_r)
THEN 1157 WRITE(*,*)
'Warning in read_restart_temp: nb_procs_F*m_max_c /= nb_mode_r' 1162 IF (
PRESENT(interpol))
THEN 1170 WRITE(*,*)
'Reading temperature modes ...' 1174 OPEN(unit = 10, file = in_name,
form =
'unformatted', status =
'unknown')
1177 mode_cherche = list_mode(i)
1185 IF (j/=rang_f*m_max_c+i)
THEN 1196 IF (mode == mode_cherche)
THEN 1197 READ(10) tempn(:,:,i)
1198 READ(10) tempn_m1(:,:,i)
1199 WRITE(*,
'(A,i4,A)')
'mode temp ', mode_cherche,
' found ' 1209 IF (.NOT.trouve)
THEN 1210 IF (
PRESENT(val_init))
THEN 1211 tempn(:,:,i) = val_init ; tempn_m1(:,:,i) = val_init
1212 WRITE(*,
'(A,i4,A)')
'mode temp', mode_cherche,
' not found' 1214 tempn(:,:,i) = 0.d0 ; tempn_m1(:,:,i) = 0.d0
1215 WRITE(*,*)
'mode ns', mode_cherche,
' not found' subroutine write_restart_ns_taylor(communicator, vv_mesh, pp_mesh, time, list_mode, un, der_un, pn, der_pn, 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_ns_taylor(communicator, time, list_mode, un, der_un, pn, der_pn, filename, val_init, interpol, opt_level_set, opt_level_set_m1, opt_max_vel, opt_mono, opt_it)
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, opt_it, opt_dt)
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, opt_it, opt_dt)
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, opt_dt)
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, opt_dt)
subroutine read_restart_temp(communicator, time, list_mode, tempn, tempn_m1, 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