9 dt,list_mode,mu_h_field)
16 TYPE(mesh_type),
INTENT(IN) :: h_mesh, phi_mesh
17 REAL(KIND=8),
INTENT(IN) :: dt
18 INTEGER,
POINTER,
DIMENSION(:),
INTENT(IN) :: list_mode
19 REAL(KIND=8),
DIMENSION(:),
INTENT(IN) :: mu_h_field
21 CHARACTER(len=3) :: arpack_type
24 #include "petsc/finclude/petsc.h"
25 mpi_comm,
DIMENSION(2) :: communicator
32 IF (inputs%if_arpack)
THEN
33 IF (arpack_type==
'nst')
THEN
35 ELSE IF (arpack_type==
'max')
THEN
37 dt,list_mode,mu_h_field)
40 CALL mpi_comm_rank(mpi_comm_world,rank,code)
41 CALL mpi_barrier(mpi_comm_world,code)
63 REAL(KIND=8),
INTENT(IN) :: dt
64 INTEGER,
POINTER,
DIMENSION(:),
INTENT(IN) :: list_mode
65 REAL(KIND=8),
DIMENSION(:),
INTENT(IN):: mu_h_field
66 REAL(KIND=8),
ALLOCATABLE,
DIMENSION(:,:) :: eigen
67 REAL(KIND=8),
ALLOCATABLE,
DIMENSION(:,:) :: eigen_vect
68 REAL(KIND=8) :: rho,
theta, rmax, norm, err
70 INTEGER :: i, n, ndim, nconv, nmax, k, code, rank
71 CHARACTER(LEN=3) :: st_mode, st_eigen
72 REAL(KIND=8),
ALLOCATABLE,
DIMENSION(:,:,:):: vect, rot_hn
73 REAL(KIND=8),
ALLOCATABLE,
DIMENSION(:,:) :: ev_hn, best_ev
75 REAL(KIND=8),
ALLOCATABLE,
DIMENSION(:,:,:):: ev_hn_3d
76 CHARACTER(LEN=200) :: header
77 CHARACTER(LEN=3) :: what
78 INTEGER :: nb_procs_f, rank_f
86 #include "petsc/finclude/petsc.h"
87 mpi_comm,
DIMENSION(2) :: communicator
88 CALL mpi_comm_rank(mpi_comm_world,rank,code)
89 CALL mpi_comm_rank(communicator(2),rank_f, code)
90 CALL mpi_comm_size(communicator(2),nb_procs_f, code)
94 ALLOCATE(eigen(inputs%nb_eigenvalues,2),eigen_vect(ndim,inputs%nb_eigenvalues), &
95 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))
96 ALLOCATE(vect(6,h_mesh%np,1))
102 inputs%arpack_iter_max,inputs%arpack_tolerance, &
104 inputs%arpack_which, i, list_mode, redo)
106 WRITE(st_mode,
'(I3)') list_mode(i)
109 DO n = 1, min(nconv,inputs%nb_eigenvalues)
110 rho = sqrt(eigen(n,1)**2+eigen(n,2)**2)
111 theta = atan2(eigen(n,2),eigen(n,1))
112 IF (log(rho).GE.rmax)
THEN
117 IF (inputs%if_arpack_vtu_2d)
THEN
127 ev_hn(:,k) = eigen_vect((k-1)*h_mesh%np+1:k*h_mesh%np,n)
128 ev_hn_3d(:,k,1) = eigen_vect((k-1)*h_mesh%np+1:k*h_mesh%np,n)
130 WRITE(st_eigen,
'(I3)') n
131 header =
'Hn_Eigen_'//trim(adjustl(st_eigen))//
'_mode_'//trim(adjustl(st_mode))
135 header=
'Hn_mode_'//trim(adjustl(st_mode))//
'_theta_cos'
146 ev_hn_3d(:,:,1) = ev_hn
152 ev_hn(:,k) = mu_h_field(:)*eigen_vect((k-1)*h_mesh%np+1:k*h_mesh%np,n)
154 header =
'Bn_Eigen_'//trim(adjustl(st_eigen))//
'_mode_'//trim(adjustl(st_mode))
158 header=
'Bn_mode_'//trim(adjustl(st_mode))//
'_theta_cos'
178 rho = sqrt(eigen(nmax,1)**2+eigen(nmax,2)**2)
179 theta = atan2(eigen(nmax,2),eigen(nmax,1))
181 vect(k,:,1) = mu_h_field(:)*eigen_vect((k-1)*h_mesh%np+1:k*h_mesh%np,nmax)
185 err =
norme_div_par(communicator(1), h_mesh, list_mode(i:i), vect)
186 WRITE(10+rank,*) log(rho)/dt,
theta/dt, list_mode(i)
187 WRITE(10+rank,*) err/norm
189 WRITE(*,
'(A)')
'==================================================='
190 WRITE(*,
'(A,i2,A,i2,A,e12.5,A,e12.5,A)')
'| mode',list_mode(i),
', LR',nmax,&
191 ' = (',log(rho)/dt,
' + I *',
theta/dt,
') |'
192 WRITE(*,
'(A,e10.3,A)')
'| |div(Bn)|_L2/|Bn|_H1 =', err/norm,
' |'
193 WRITE(*,
'(A)')
'==================================================='
194 WRITE(10+rank,
'(A)')
'==================================================='
195 WRITE(10+rank,
'(A,i2,A,i2,A,e12.5,A,e12.5,A)')
'| mode',list_mode(i),
', LR',nmax,&
196 ' = (',log(rho)/dt,
' + I *',
theta/dt,
') |'
197 WRITE(10+rank,
'(A,e10.3,A)')
'| |div(Bn)|_L2/|Bn|_H1 =', err/norm,
' |'
198 WRITE(10+rank,
'(A)')
'==================================================='
201 DO n = 1, min(nconv,inputs%nb_eigenvalues)
202 rho = sqrt(eigen(n,1)**2+eigen(n,2)**2)
203 theta = atan2(eigen(n,2),eigen(n,1))
205 vect(k,:,1) = mu_h_field(:)*eigen_vect((k-1)*h_mesh%np+1:k*h_mesh%np,n)
209 err =
norme_div_par(communicator(1), h_mesh, list_mode(i:i), vect)
211 WRITE(*,
'(A)')
'==================================================='
212 WRITE(*,
'(A,i2,A,i2,A,e12.5,A,e12.5,A)')
'| mode',list_mode(i),
', Eg',n,&
213 ' = (',log(rho)/dt,
' + I *',
theta/dt,
') |'
214 WRITE(*,
'(A,e10.3,A)')
'| |div(Bn)|_L2/|Bn|_H1 =', err/norm,
' |'
215 WRITE(*,
'(A)')
'==================================================='
217 WRITE(10+rank,
'(A)')
'==================================================='
218 WRITE(10+rank,
'(A,i2,A,i2,A,e12.5,A,e12.5,A)')
'| mode',list_mode(i),
', Eg',n,&
219 ' = (',log(rho)/dt,
' + I *',
theta/dt,
') |'
220 WRITE(10+rank,
'(A,e10.3,A)')
'| |div(Bn)|_L2/|Bn|_H1 =', err/norm,
' |'
221 WRITE(10+rank,
'(A)')
'==================================================='
243 CALL
post_proc_arpack(communicator, h_mesh, phi_mesh, list_mode, mu_h_field, ev_hn_3d)
246 DEALLOCATE(eigen,eigen_vect,vect)
257 SUBROUTINE arpack_not_sym(communicator, nb_vp, nconv, iter_max, tol_arpack, prodmat, &
258 eigen, eigen_vect, which, imode, list_mode, redo)
262 SUBROUTINE prodmat(x,b,m,i)
264 REAL(KIND=8),
DIMENSION(m) :: x
265 REAL(KIND=8),
DIMENSION(m) :: b
266 END SUBROUTINE prodmat
268 INTEGER,
INTENT(IN) :: nb_vp, iter_max, imode
269 REAL(KIND=8),
INTENT(INOUT) :: tol_arpack
270 REAL(KIND=8),
DIMENSION(nb_vp,2),
INTENT(OUT) :: eigen
271 REAL(KIND=8),
DIMENSION(:,:),
INTENT(OUT) :: eigen_vect
272 INTEGER,
POINTER,
DIMENSION(:),
INTENT(IN) :: list_mode
273 LOGICAL,
INTENT(IN) :: redo
276 INTEGER :: ido, info, it=0
277 CHARACTER(len=1) :: bmat
278 CHARACTER(len=2) :: which
279 INTEGER,
DIMENSION(11) :: iparam, ipntr
280 INTEGER :: ndim, nev, ncv, lworkl, nconv
281 REAL(KIND=8) :: sigmar, sigmai
287 REAL(KIND=8),
ALLOCATABLE,
DIMENSION(:) :: resid, workl
288 REAL(KIND=8),
ALLOCATABLE,
DIMENSION(:) :: workd
289 REAL(KIND=8),
ALLOCATABLE,
DIMENSION(:) :: workev
290 REAL(KIND=8),
ALLOCATABLE,
DIMENSION(:,:) :: v, d
291 LOGICAL,
ALLOCATABLE,
DIMENSION(:) :: sel
293 INTEGER :: np, nev2, i, j, unit_save, &
294 ndim_r, nb_vp_r, code, rank, nb_procs, ido_loop
295 REAL(KIND=8) :: rnorm
296 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: tableau_ido
299 #include "petsc/finclude/petsc.h"
300 mpi_comm,
DIMENSION(2) :: communicator
302 CALL mpi_comm_rank(mpi_comm_world,rank,code)
304 CALL mpi_comm_size(communicator(2),nb_procs,code)
305 ALLOCATE(tableau_ido(nb_procs))
308 ndim =
SIZE(eigen_vect,1)
311 lworkl = 3*ncv**2+6*ncv
312 ALLOCATE(v(ndim,ncv), workl(lworkl), resid(ndim))
313 ALLOCATE(sel(ncv), d(ncv,3), workev(3*ncv))
314 ALLOCATE(workd(3*ndim))
317 unit_save=200+list_mode(imode)
319 READ(unit_save) ido, tol_arpack, iparam, ipntr, info, &
320 np, rnorm, nconv, nev2, ndim_r, bmat, nb_vp_r
321 IF (ndim_r/=ndim .OR. nb_vp_r/=nb_vp)
THEN
324 READ(unit_save) (resid(i), i = 1, ndim)
325 READ(unit_save) (workd(i), i = 1, 3*ndim)
326 READ(unit_save) (workl(i), i = 1, lworkl)
328 READ(unit_save) (v(i,j), i = 1, ndim)
348 CALL prodmat(workd(1:ndim), resid, ndim, imode)
349 workd(ndim/2+1:ndim)=workd(1:ndim/2)
358 DO WHILE(ido_loop.NE.99)
360 IF(rank==0 .AND. mod(it,100)==0)
WRITE(*,
'(a,I5)')
' Arpack iteration', it
362 CALL pdnaupd(communicator(1), ido,bmat,ndim,which,nev, tol_arpack, &
363 resid, ncv, v, ndim, iparam, ipntr,&
364 workd, workl, lworkl, info)
368 CALL mpi_allgather(ido, 1, mpi_integer, tableau_ido, 1, mpi_integer, &
369 communicator(2), code)
371 IF (minval(abs(tableau_ido+2))==0)
THEN
375 IF (maxval(abs(tableau_ido-99))/=0)
THEN
382 IF (.NOT. bidon)
THEN
383 WRITE(*,
'(A,i3,A,i5)')
'ARPACK OK for mode', list_mode(imode), &
384 ' Nb of Arpack iterations', iparam(3)
388 CALL prodmat(workd(ipntr(1):), workd(ipntr(2):), ndim, imode)
389 ELSE IF(ido==-1 .OR. ido==1)
THEN
390 CALL prodmat(workd(ipntr(1):), workd(ipntr(2):), ndim, imode)
422 WRITE(*,*)
' Only ', nconv,
'eigenvalues have been computed instead of', nev
423 WRITE(*,*)
' it_max not large enough'
427 CALL pdneupd(communicator(1), .true.,
'All', sel, d, d(1,2), v, ndim, &
428 sigmar, sigmai, workev, bmat, ndim, which, nev, tol_arpack, &
429 resid, ncv, v, ndim, iparam, ipntr, workd, workl, lworkl, info)
431 nev2=min(nb_vp, nconv)
432 eigen_vect(:,1:nev2) = v(:,1:nev2)
433 eigen(1:nev2,1) = d(1:nev2,1)
434 eigen(1:nev2,2) = d(1:nev2,2)
451 SUBROUTINE post_proc_arpack(communicator, H_mesh, phi_mesh, list_mode, mu_H_field, eigen_vect)
460 TYPE(mesh_type),
INTENT(IN) :: h_mesh, phi_mesh
461 INTEGER,
DIMENSION(:),
INTENT(IN) :: list_mode
462 REAL(KIND=8),
DIMENSION(:),
INTENT(IN) :: mu_h_field
463 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: eigen_vect
465 REAL(KIND=8),
DIMENSION(:,:,:),
ALLOCATABLE :: field_h, field_phi
466 INTEGER :: nb_procs_f, rank_f, code, n, k
467 CHARACTER(len=3) :: tit_m
468 CHARACTER(len=200) :: name_best_ev
470 #include "petsc/finclude/petsc.h"
471 mpi_comm,
DIMENSION(2) :: communicator
474 CALL mpi_comm_rank(communicator(2),rank_f, code)
475 CALL mpi_comm_size(communicator(2),nb_procs_f, code)
476 ALLOCATE(field_h(h_mesh%np, 6, 1), field_phi(phi_mesh%np, 2, 1))
478 IF (inputs%if_arpack_vtu_2d)
THEN
480 IF (n==rank_f+1)
THEN
481 field_h(:,:,1) = eigen_vect(:,:,1)
483 field_h(:,:,1) = 0.d0
485 WRITE(tit_m,
'(i3)') n-1
486 name_best_ev =
'Eigenvect_H_mode_'//trim(adjustl(tit_m))
487 CALL
vtu_3d(field_h,
'H_mesh', name_best_ev,
'mag',
'new')
489 field_h(:,k,1) = mu_h_field*field_h(:,k,1)
491 name_best_ev =
'Eigenvect_B_mode_'//trim(adjustl(tit_m))
492 CALL
vtu_3d(field_h,
'H_mesh', name_best_ev,
'ind',
'new')
497 field_h(:,k,1) = mu_h_field*eigen_vect(:,k,1)
499 CALL
write_restart_maxwell(communicator, h_mesh, phi_mesh, 1.d0, list_mode, eigen_vect, eigen_vect, &
500 field_h, field_h, field_phi, field_phi, &
501 inputs%file_name, 1, 1)
subroutine arpack_navier_stokes
subroutine, public vtu_3d(field_in, name_of_mesh, header, name_of_field, what, opt_it, opt_grad_curl)
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, public solver_arpack_mhd(communicator, H_mesh, phi_mesh, dt, list_mode, mu_H_field)
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 theta
subroutine, public make_vtu_file_2d(communicator, mesh, header, field, field_name, what, opt_it)
real(kind=8) function norme_h1_champ_par(communicator, mesh, list_mode, v)
subroutine, public post_proc_arpack(communicator, H_mesh, phi_mesh, list_mode, mu_H_field, eigen_vect)
real(kind=8) function norme_div_par(communicator, H_mesh, list_mode, v)
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 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)
real(kind=8) function norme_l2_champ_par(communicator, mesh, list_mode, v)
subroutine error_petsc(string)