[Nek5000-users] Interfacing with Arpack
nek5000-users at lists.mcs.anl.gov
nek5000-users at lists.mcs.anl.gov
Mon Oct 20 05:58:00 CDT 2014
Giuseppe,
The key thing to understand about Nek is that variables are _always_ stored in their local format,
which implies you have redundant values at the interface such that they are ready for parallel operator
evaluation.
Let u_L denote such a vector with redundant values (L for Local) and let u be the corresponding
vector without the redundantly stored data. Nominally, there is a matrix Q that maps u to u_L:
(1) u_L = Q u
and the matrix-vector product involving the mass matrix, of the form w = M u, can be expressed as:
(2) w = M u = Q^T M_L Q u = Q^T M_L u_L
where M_L = block_diag(M^e) , e=1,...,Nelv is the block-diagonal matrix consisting of local mass
matrices within each element, e. In Nek, M^e is also block diagonal, so the whole _unassembled_
stiffness matrix, M_L, is diagonal. It is this matrix that is stored in bm1 ("B" on Mesh 1, the velocity/temp
mesh).
Notice that, as written, the output of (2) violates our "store only local vectors" policy, so we invoke
(1) to correct this:
(3) w_L = Q w = Q M u = Q Q^T M_L u_L.
We refer to QQ^T as direct-stiffness summation (dssum, in nek). It is the operation that
glues things together.
So, suppose you wish to find a continuous function that is close to a discontinuous function
in nek. Let f be the continuous thing and g be the discontinuous one. You can do this via:
(4) f_L = Q M^-1 Q M_L g_L.
In Nek, this would be written as:
n = nx1*ny1*nz1*nelv
call col3(f,g,bm1,n)
call dssum(f,nx1,ny1,nz1)
call col2 (f,binvm1,n)
Here, binvm1 is effectively binvm1 = 1./ (QQT*bm1) , if we view bm1 and binvm1 as
vectors, rather than diagonal matrices.
Paul
________________________________________
From: nek5000-users-bounces at lists.mcs.anl.gov [nek5000-users-bounces at lists.mcs.anl.gov] on behalf of nek5000-users at lists.mcs.anl.gov [nek5000-users at lists.mcs.anl.gov]
Sent: Monday, October 20, 2014 2:03 AM
To: nek5000-users at lists.mcs.anl.gov
Subject: [Nek5000-users] Interfacing with Arpack
Dear users and developers,
I would like to solve a generalized eigenvalue problem with Arpack,
based on Nek subroutines. Using reverse communication interface, I only
need to express the action of the matrices on the vectors, but I am not
sure on how to apply the mass matrix and the inverse mass matrix in the
Pn-Pn formulation.
Is it sufficient to write:
call col2(p1,bm1,n) !apply mass matrix to vector p1
...
call invcol2(p1,bm1,n) ! apply inverse mass matrix to vector p1
or should I do:
call rzero(h1,n)
call rone(h2,n)
call hmholtz('vel',p,p1,h1,h2,pmask,vmult,imsh,tolh,maxiter,isd)
to apply inverse mass matrix to p1, or should I do something else?
Also, from a related question from a couple of years ago, should I call
col2(v,vmask,n) after each matrix-vector product?
Thank you in advance.
Best,
Giuseppe
_______________________________________________
Nek5000-users mailing list
Nek5000-users at lists.mcs.anl.gov
https://lists.mcs.anl.gov/mailman/listinfo/nek5000-users
More information about the Nek5000-users
mailing list