77 integer,
parameter :: VERB = 2
78 logical,
parameter :: WITH_MUMPS = .false.
94 integer ,
parameter :: nev = 5
95 integer ,
parameter :: itMax = 100
96 real(RP),
parameter :: tol = 1
e-7_rp
97 real(RP),
parameter :: sigma =-1.0_rp
100 integer ,
parameter :: nev_exact = 6
101 real(RP),
dimension(nev_exact) :: lambda
111 integer,
parameter :: fe_1 =
fe_p2_2d 113 integer,
parameter :: fe_2 =
fe_p2_1d 123 type(quadmesh) :: qdm_1, qdm_2
126 character(len=100),
parameter :: &
127 & mesh_file= trim(GMSH_DIR)//
"disk/disk2_3.msh" 143 type(csr) :: S1, S2, M2, K
148 procedure(rntornxl),
pointer :: Kinv => null()
155 character(LEN=300) :: shell_com
168 write(*,*)
'eigen_Ventcel_2D: start' 170 write(*,*)
" RESOLUTION OF THE EIGEN-PROBLEM" 172 write(*,*)
" Delta u = 0 on Omega" 174 write(*,*)
" Delta_B u + \partial_n u + lambda u = 0 on Gamma" 179 write(*,*)
"================================== ASSEMBLING THE MESH " 180 msh = mesh(mesh_file,
'gmsh')
181 if (verb>1)
call print(msh)
184 write(*,*)
"================================== ASSEMBLING THE& 185 & FINITE ELEMENT SPACE" 190 if (verb>1)
call print(x_h)
193 write(*,*)
"================================== ASSEMBLING THE& 194 & INTEGRATION METHOD ON Omega" 195 qdm_1 = quadmesh(msh)
196 call set(qdm_1, qd_1)
198 if (verb>1)
call print(qdm_1)
201 write(*,*)
"================================== ASSEMBLING THE& 202 & INTEGRATION METHOD ON Gamma" 203 qdm_2 = quadmesh(msh)
204 call set(qdm_2, qd_2)
206 if (verb>1)
call print(qdm_2)
209 write(*,*)
"================================== ASSEMBLING THE& 210 & MATRICES S1, S2, M2" 214 call diffusion_massmat(m2, one_r3, x_h, qdm_2)
219 call diffusion_stiffmat(s1, emetric, x_h, qdm_1)
220 call diffusion_stiffmat(s2, emetric, x_h, qdm_2)
223 write(*,*)
"================================== COMPUTE THE SYSTEM & 224 &MATRIX K = S1 + S2 - sigma * M2" 227 call add_submatrix(k, s2)
228 call add_submatrix(k, m2, -sigma)
231 write(*,*)
"================================== LINEAR SOLVER K*x = y" 234 write(*,*)
" K = LDLT, decomposition with MUMPS" 240 write(*,*)
" Krylov CG settings" 241 kry = krylov(
kry_cg, tol=tol*1.0
e-2_rp, itmax=1000, verb=0)
250 write(*,*)
"================================== EIGEN-SOLVER DEF." 254 eig = eigen(
size =
size, nev = nev, sym=.true., std=.false.)
257 call set(eig, itmax=itmax, tol=tol, verb=2)
260 if (verb>1)
call print(eig)
264 write(*,*)
"================================== NUMERICAL RESOLUTION" 266 call solve(eig,
b=
pmv_m, op=kinv)
271 write(*,*)
"================================== POST-PROCESSING" 273 write(*,*)
"Computed eigenvalues" 275 write(*,*)
" i =", int(ii,1),
", lambda = ", &
276 &
real(eig%lambda(ii), SP)
280 write(*,*)
"Numerical errors |lambda - lambda_h| " 291 do ii=1, min(nev, nev_exact)
292 err = abs( eig%lambda(ii) - lambda(ii))
293 write(*,*)
" i =", int(ii,1),
", error = ", &
302 shell_com =
'eig_ventcel.msh' 305 call write(x_h, trim(shell_com),
'gmsh')
310 call gmsh_addview(x_h, eig%v(:,ii), &
312 &
'Eigen-functions',
real(ii, RP), ii)
316 shell_com =
'gmsh -option '//trim(gmsh_dir)//
'gmsh-options-view'&
317 & //
' '//trim(shell_com)
318 call system(shell_com)
328 subroutine pmv_m(y, x)
329 real(RP),
dimension(:),
intent(out) :: y
330 real(RP),
dimension(:),
intent(in) :: x
332 call matvecprod(y, m2, x)
338 real(RP),
dimension(:),
intent(inout) :: x
339 logical ,
intent(out) :: ierr
340 real(RP),
dimension(:),
intent(in) :: y
342 call solve(x, kry, y, k, pc)
351 real(RP),
dimension(:),
intent(inout) :: x
352 logical ,
intent(out) :: ierr
353 real(RP),
dimension(:),
intent(in) :: y
363 real(RP),
dimension(size) :: u, v, w
368 write(*,*)
"Residual | Ku - lambda Mu |_l2 / | u |_l2" 374 call matvecprod(v, k , u)
377 w = v - eig%lambda(ii)*w
378 res = sqrt( sum(w*w) / sum(u*u) )
380 print*,
" i = ", int(ii,1),
" : res = ",
real(res, sp)
385 write(*,*)
"Residual | \nu u - K^{-1} M u |_l2 / | u |_l2" 391 call kinv(w, ierr, v)
394 nu = 1.0_rp / ( eig%lambda(ii) - sigma )
396 res = sqrt( sum(w*w) / sum(u*u) )
398 print*,
" i = ", int(ii,1),
" : res = ",
real(res, sp)
integer, parameter eig_shift_invert
Shift-invert mode.
subroutine kinv_mumps(x, ierr, y)
subroutine, public choral_init(verb)
Initialisation for the CHORAL library
TOP-LEVEL MODULE FOR THE LIBRARY CHORAL
integer, parameter fe_p2_2d
integer, parameter quad_gauss_edg_4
subroutine pmv_m(y, x)
Matrix-vector product x –> M*x.
real(rp) function e(x, v1, v2)
integer, parameter pc_jacobi
Jacobi diagonal preconditioning.
subroutine kinv_pcg(y, ierr, x)
integer, parameter mumps_ldlt_sdp
MUMPS LDLT-SDP, sym def pos mat.
integer, parameter eig_which_sm
Computation of eigenvalues xith smallest magnitude.
program eigen_ventcel_2d
Solves the Ventcel eigenvalue problem
integer, parameter quad_gauss_trg_12
integer, parameter fe_p2_1d
integer, parameter kry_cg
CG linear solver.
real(rp) function b(x, w1, w2)