9 dt,list_mode,mu_h_field)
15 #include "petsc/finclude/petsc.h" 18 TYPE(
mesh_type),
INTENT(IN) :: H_mesh, phi_mesh
19 REAL(KIND=8),
INTENT(IN) :: dt
20 INTEGER,
POINTER,
DIMENSION(:),
INTENT(IN) :: list_mode
21 REAL(KIND=8),
DIMENSION(:),
INTENT(IN) :: mu_H_field
23 CHARACTER(len=3) :: arpack_type
26 mpi_comm,
DIMENSION(2) :: communicator
34 IF (arpack_type==
'nst')
THEN 36 ELSE IF (arpack_type==
'max')
THEN 38 dt,list_mode,mu_h_field)
41 CALL mpi_comm_rank(mpi_comm_world,rank,code)
42 CALL mpi_barrier(mpi_comm_world,code)
62 #include "petsc/finclude/petsc.h" 66 REAL(KIND=8),
INTENT(IN) :: dt
67 INTEGER,
POINTER,
DIMENSION(:),
INTENT(IN) :: list_mode
68 REAL(KIND=8),
DIMENSION(:),
INTENT(IN):: mu_H_field
69 REAL(KIND=8),
ALLOCATABLE,
DIMENSION(:,:) :: eigen
70 REAL(KIND=8),
ALLOCATABLE,
DIMENSION(:,:) :: eigen_vect
71 REAL(KIND=8) :: rho, theta, rmax, norm, err
73 INTEGER :: i, n, ndim, nconv, nmax, k, code, rank
74 CHARACTER(LEN=3) :: st_mode, st_eigen
75 REAL(KIND=8),
ALLOCATABLE,
DIMENSION(:,:,:):: vect, rot_Hn
76 REAL(KIND=8),
ALLOCATABLE,
DIMENSION(:,:) :: ev_Hn, best_ev
78 REAL(KIND=8),
ALLOCATABLE,
DIMENSION(:,:,:):: ev_Hn_3d
79 CHARACTER(LEN=200) :: header
80 CHARACTER(LEN=3) :: what
81 INTEGER :: nb_procs_F, rank_F
89 mpi_comm,
DIMENSION(2) :: communicator
90 CALL mpi_comm_rank(mpi_comm_world,rank,code)
91 CALL mpi_comm_rank(communicator(2),rank_f, code)
92 CALL mpi_comm_size(communicator(2),nb_procs_f, code)
96 ALLOCATE(eigen(
inputs%nb_eigenvalues,2),eigen_vect(ndim,
inputs%nb_eigenvalues), &
97 ev_hn(h_mesh%np,6), rot_hn(h_mesh%np,6,1), ev_hn_3d(h_mesh%np,6,1),best_ev(h_mesh%np,6))
98 ALLOCATE(vect(6,h_mesh%np,1))
106 inputs%arpack_which, i, list_mode, redo)
108 WRITE(st_mode,
'(I3)') list_mode(i)
111 DO n = 1, min(nconv,
inputs%nb_eigenvalues)
112 rho = sqrt(eigen(n,1)**2+eigen(n,2)**2)
113 theta = atan2(eigen(n,2),eigen(n,1))
114 IF (log(rho).GE.rmax)
THEN 119 IF (
inputs%if_arpack_vtu_2d)
THEN 129 ev_hn(:,k) = eigen_vect((k-1)*h_mesh%np+1:k*h_mesh%np,n)
130 ev_hn_3d(:,k,1) = eigen_vect((k-1)*h_mesh%np+1:k*h_mesh%np,n)
132 WRITE(st_eigen,
'(I3)') n
133 header =
'Hn_Eigen_'//trim(adjustl(st_eigen))//
'_mode_'//trim(adjustl(st_mode))
137 header=
'Hn_mode_'//trim(adjustl(st_mode))//
'_theta_cos' 148 ev_hn_3d(:,:,1) = ev_hn
154 ev_hn(:,k) = mu_h_field(:)*eigen_vect((k-1)*h_mesh%np+1:k*h_mesh%np,n)
156 header =
'Bn_Eigen_'//trim(adjustl(st_eigen))//
'_mode_'//trim(adjustl(st_mode))
160 header=
'Bn_mode_'//trim(adjustl(st_mode))//
'_theta_cos' 180 rho = sqrt(eigen(nmax,1)**2+eigen(nmax,2)**2)
181 theta = atan2(eigen(nmax,2),eigen(nmax,1))
183 vect(k,:,1) = mu_h_field(:)*eigen_vect((k-1)*h_mesh%np+1:k*h_mesh%np,nmax)
187 err =
norme_div_par(communicator(1), h_mesh, list_mode(i:i), vect)
188 WRITE(10+rank,*) log(rho)/dt, theta/dt, list_mode(i)
189 WRITE(10+rank,*) err/norm
191 WRITE(*,
'(A)')
'===================================================' 192 WRITE(*,
'(A,i2,A,i2,A,e12.5,A,e12.5,A)')
'| mode',list_mode(i),
', LR',nmax,&
193 ' = (',log(rho)/dt,
' + I *',theta/dt,
') |' 194 WRITE(*,
'(A,e10.3,A)')
'| |div(Bn)|_L2/|Bn|_H1 =', err/norm,
' |' 195 WRITE(*,
'(A)')
'===================================================' 196 WRITE(10+rank,
'(A)')
'===================================================' 197 WRITE(10+rank,
'(A,i2,A,i2,A,e12.5,A,e12.5,A)')
'| mode',list_mode(i),
', LR',nmax,&
198 ' = (',log(rho)/dt,
' + I *',theta/dt,
') |' 199 WRITE(10+rank,
'(A,e10.3,A)')
'| |div(Bn)|_L2/|Bn|_H1 =', err/norm,
' |' 200 WRITE(10+rank,
'(A)')
'===================================================' 203 DO n = 1, min(nconv,
inputs%nb_eigenvalues)
204 rho = sqrt(eigen(n,1)**2+eigen(n,2)**2)
205 theta = atan2(eigen(n,2),eigen(n,1))
207 vect(k,:,1) = mu_h_field(:)*eigen_vect((k-1)*h_mesh%np+1:k*h_mesh%np,n)
211 err =
norme_div_par(communicator(1), h_mesh, list_mode(i:i), vect)
213 WRITE(*,
'(A)')
'===================================================' 214 WRITE(*,
'(A,i2,A,i2,A,e12.5,A,e12.5,A)')
'| mode',list_mode(i),
', Eg',n,&
215 ' = (',log(rho)/dt,
' + I *',theta/dt,
') |' 216 WRITE(*,
'(A,e10.3,A)')
'| |div(Bn)|_L2/|Bn|_H1 =', err/norm,
' |' 217 WRITE(*,
'(A)')
'===================================================' 219 WRITE(10+rank,
'(A)')
'===================================================' 220 WRITE(10+rank,
'(A,i2,A,i2,A,e12.5,A,e12.5,A)')
'| mode',list_mode(i),
', Eg',n,&
221 ' = (',log(rho)/dt,
' + I *',theta/dt,
') |' 222 WRITE(10+rank,
'(A,e10.3,A)')
'| |div(Bn)|_L2/|Bn|_H1 =', err/norm,
' |' 223 WRITE(10+rank,
'(A)')
'===================================================' 245 CALL post_proc_arpack(communicator, h_mesh, phi_mesh, list_mode, mu_h_field, ev_hn_3d)
248 DEALLOCATE(eigen,eigen_vect,vect)
259 SUBROUTINE arpack_not_sym(communicator, nb_vp, nconv, iter_max, tol_arpack, prodmat, &
260 eigen, eigen_vect, which, imode, list_mode, redo)
262 #include "petsc/finclude/petsc.h" 266 SUBROUTINE prodmat(x,b,m,i)
268 REAL(KIND=8),
DIMENSION(m) :: x
269 REAL(KIND=8),
DIMENSION(m) :: b
270 END SUBROUTINE prodmat
272 INTEGER,
INTENT(IN) :: nb_vp, iter_max, imode
273 REAL(KIND=8),
INTENT(INOUT) :: tol_arpack
274 REAL(KIND=8),
DIMENSION(nb_vp,2),
INTENT(OUT) :: eigen
275 REAL(KIND=8),
DIMENSION(:,:),
INTENT(OUT) :: eigen_vect
276 INTEGER,
POINTER,
DIMENSION(:),
INTENT(IN) :: list_mode
277 LOGICAL,
INTENT(IN) :: redo
280 INTEGER :: IDO, INFO, it=0
281 CHARACTER(len=1) :: BMAT
282 CHARACTER(len=2) :: WHICH
283 INTEGER,
DIMENSION(11) :: IPARAM, IPNTR
284 INTEGER :: NDIM, NEV, NCV, LWORKL, NCONV
285 REAL(KIND=8) :: SIGMAR, sigmai
291 REAL(KIND=8),
ALLOCATABLE,
DIMENSION(:) :: RESID, WORKL
292 REAL(KIND=8),
ALLOCATABLE,
DIMENSION(:) :: WORKD
293 REAL(KIND=8),
ALLOCATABLE,
DIMENSION(:) :: WORKEV
294 REAL(KIND=8),
ALLOCATABLE,
DIMENSION(:,:) :: V, d
295 LOGICAL,
ALLOCATABLE,
DIMENSION(:) :: SEL
297 INTEGER :: NP, NEV2, i, j, unit_save, &
298 ndim_r, nb_vp_r, code, rank, nb_procs, ido_loop
299 REAL(KIND=8) :: rnorm
300 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: tableau_ido
303 mpi_comm,
DIMENSION(2) :: communicator
305 CALL mpi_comm_rank(mpi_comm_world,rank,code)
307 CALL mpi_comm_size(communicator(2),nb_procs,code)
308 ALLOCATE(tableau_ido(nb_procs))
311 ndim =
SIZE(eigen_vect,1)
314 lworkl = 3*ncv**2+6*ncv
315 ALLOCATE(v(ndim,ncv), workl(lworkl), resid(ndim))
316 ALLOCATE(sel(ncv), d(ncv,3), workev(3*ncv))
317 ALLOCATE(workd(3*ndim))
320 unit_save=200+list_mode(imode)
322 READ(unit_save) ido, tol_arpack, iparam, ipntr, info, &
323 np, rnorm, nconv, nev2, ndim_r, bmat, nb_vp_r
324 IF (ndim_r/=ndim .OR. nb_vp_r/=nb_vp)
THEN 327 READ(unit_save) (resid(i), i = 1, ndim)
328 READ(unit_save) (workd(i), i = 1, 3*ndim)
329 READ(unit_save) (workl(i), i = 1, lworkl)
331 READ(unit_save) (v(i,j), i = 1, ndim)
351 CALL prodmat(workd(1:ndim), resid, ndim, imode)
352 workd(ndim/2+1:ndim)=workd(1:ndim/2)
361 DO WHILE(ido_loop.NE.99)
363 IF(rank==0 .AND. mod(it,100)==0)
WRITE(*,
'(a,I5)')
' Arpack iteration', it
365 CALL pdnaupd(communicator(1), ido,bmat,ndim,which,nev, tol_arpack, &
366 resid, ncv, v, ndim, iparam, ipntr,&
367 workd, workl, lworkl, info)
371 CALL mpi_allgather(ido, 1, mpi_integer, tableau_ido, 1, mpi_integer, &
372 communicator(2), code)
374 IF (minval(abs(tableau_ido+2))==0)
THEN 378 IF (maxval(abs(tableau_ido-99))/=0)
THEN 385 IF (.NOT. bidon)
THEN 386 WRITE(*,
'(A,i3,A,i5)')
'ARPACK OK for mode', list_mode(imode), &
387 ' Nb of Arpack iterations', iparam(3)
391 CALL prodmat(workd(ipntr(1):), workd(ipntr(2):), ndim, imode)
392 ELSE IF(ido==-1 .OR. ido==1)
THEN 393 CALL prodmat(workd(ipntr(1):), workd(ipntr(2):), ndim, imode)
425 WRITE(*,*)
' Only ', nconv,
'eigenvalues have been computed instead of', nev
426 WRITE(*,*)
' it_max not large enough' 430 CALL pdneupd (communicator(1), .true.,
'All', sel, d, d(1,2), v, ndim, &
431 sigmar, sigmai, workev, bmat, ndim, which, nev, tol_arpack, &
432 resid, ncv, v, ndim, iparam, ipntr, workd, workl, lworkl, info)
434 nev2=min(nb_vp, nconv)
435 eigen_vect(:,1:nev2) = v(:,1:nev2)
436 eigen(1:nev2,1) = d(1:nev2,1)
437 eigen(1:nev2,2) = d(1:nev2,2)
454 SUBROUTINE post_proc_arpack(communicator, H_mesh, phi_mesh, list_mode, mu_H_field, eigen_vect)
462 #include "petsc/finclude/petsc.h" 465 TYPE(
mesh_type),
INTENT(IN) :: H_mesh, phi_mesh
466 INTEGER,
DIMENSION(:),
INTENT(IN) :: list_mode
467 REAL(KIND=8),
DIMENSION(:),
INTENT(IN) :: mu_H_field
468 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: eigen_vect
470 REAL(KIND=8),
DIMENSION(:,:,:),
ALLOCATABLE :: field_H, field_phi
471 INTEGER :: nb_procs_F, rank_F, code, n, k
472 CHARACTER(len=3) :: tit_m
473 CHARACTER(len=200) :: name_best_ev
474 mpi_comm,
DIMENSION(2) :: communicator
476 CALL mpi_comm_rank(communicator(2),rank_f, code)
477 CALL mpi_comm_size(communicator(2),nb_procs_f, code)
478 ALLOCATE(field_h(h_mesh%np, 6, 1), field_phi(phi_mesh%np, 2, 1))
480 IF (
inputs%if_arpack_vtu_2d)
THEN 482 IF (n==rank_f+1)
THEN 483 field_h(:,:,1) = eigen_vect(:,:,1)
485 field_h(:,:,1) = 0.d0
487 WRITE(tit_m,
'(i3)') n-1
488 name_best_ev =
'Eigenvect_H_mode_'//trim(adjustl(tit_m))
489 CALL vtu_3d(field_h,
'H_mesh', name_best_ev,
'mag',
'new')
491 field_h(:,k,1) = mu_h_field*field_h(:,k,1)
493 name_best_ev =
'Eigenvect_B_mode_'//trim(adjustl(tit_m))
494 CALL vtu_3d(field_h,
'H_mesh', name_best_ev,
'ind',
'new')
499 field_h(:,k,1) = mu_h_field*eigen_vect(:,k,1)
501 CALL write_restart_maxwell(communicator, h_mesh, phi_mesh, 1.d0, list_mode, eigen_vect, eigen_vect, &
502 field_h, field_h, field_phi, field_phi, &
subroutine arpack_not_sym(communicator, nb_vp, nconv, iter_max, tol_arpack, prodmat, eigen, eigen_vect, which, imode, list_mode, redo)
subroutine, public prodmat_maxwell_int_by_parts(vect_in, vect_out, ndim, i)
subroutine, public make_vtu_file_2d(communicator, mesh_in, header, field_in, field_name, what, opt_it)
subroutine error_petsc(string)
subroutine, public make_vtu_file_arpack(communicator, mesh, header, field, field_name, what, num_vp)
subroutine arpack_maxwell_int_by_parts(communicator, H_mesh, phi_mesh, dt, list_mode, mu_H_field)
subroutine, public vtu_3d(field, name_of_mesh, header, name_of_field, what, opt_it, opt_grad_curl, opt_2D, opt_mesh_in)
real(kind=8) function norme_h1_champ_par(communicator, mesh, list_mode, v)
real(kind=8) function norme_div_par(communicator, H_mesh, list_mode, v)
subroutine arpack_navier_stokes
real(kind=8) function norme_l2_champ_par(communicator, mesh, list_mode, v)
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, public post_proc_arpack(communicator, H_mesh, phi_mesh, list_mode, mu_H_field, eigen_vect)
subroutine, public solver_arpack_mhd(communicator, H_mesh, phi_mesh, dt, list_mode, mu_H_field)