> On 11 Sep 2019, at 3:46 PM, Smith, Barry F. <bsm...@mcs.anl.gov> wrote:
>
>
> The phrase Hermitian symmetric was originally an attempt to make the text
> clearer, but in fact it is confusing and wrong. The phrase Hermitian
> symmetric should be removed and just Hermitian used.
>
> Real matrices are either either both symmetric and Hermitian or not
> symmetric and not Hermitian
>
> Complex matrices can be set to symmetric or Hermitian. For SBAIJ this
> changes the meaning of the values in the matrix; for matrices with full
> storage this means the user is stating that the matrix values are actually
> symmetric or Hermitian in the storage.
>
> Currently for complex matrices one can state the matrix is both symmetric
> and Hermitian which would mean one is stating the imaginary parts are all
> zero; if this is the case then it doesn't matter if the
> MatMult_SeqSBAIJ_1_Hermitian() or the MatMult_SeqSBAIJ_1() is used for
> SeqBAIJ. Note that calling both of these doesn't mean the imaginary parts
> will be zeroed out, it is statement by the user that the imaginary parts are
> zero.
>
> For parallel matrices, even in debug node, checking the user is telling
> the truth when they set symmetric or Hermitian is considered too expensive
> so we just trust the user.
>
> With the replacement of Hermitian symmetric by Hermitian will the text
> now be clear or should more clarification be given in the manual pages (as
> above)?
I think it makes the text more clear.
However, it’s not very clear to me:
1) how to setup a SeqSBAIJ Mat as Hermitian, i.e., is MatSetOption(A,
MAT_SYMMETRIC, PETSC_FALSE); MatSetOption(A, MAT_HERMITIAN, PETSC_TRUE); OK?
2) why isn’t there more checks in MatSetOption_SeqSBAIJ. As we can all agree
one, if(MAT_SYMMETRIC and MAT_HERMITIAN), then there should be no error for bs
> 1, but on the contrary, isn’t (!MAT_SYMMETRIC and MAT_HERMITIAN and bs > 1)
problematic right now?
3) why any of those checks should be performed in MatSetOption_SeqSBAIJ.
Calling MatAXPY with two matrices of the same type with the same flags is
feasible no matter the value of bs.
Thanks,
Pierre
> Barry
>
>
> case MAT_HERMITIAN:
> #if defined(PETSC_USE_COMPLEX) /* MAT_HERMITIAN is a synonym for
> MAT_SYMMETRIC with reals */
> if (!A->assembled) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must
> call MatAssemblyEnd() first");
> if (A->cmap->n < 65536 && A->cmap->bs == 1) {
> A->ops->mult = MatMult_SeqSBAIJ_1_Hermitian_ushort;
> } else if (A->cmap->bs == 1) {
> A->ops->mult = MatMult_SeqSBAIJ_1_Hermitian;
> } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No support for Hermitian
> with block size greater than 1");
> #endif
>
>
>
> case MAT_SYMMETRIC:
> mat->symmetric = flg;
> if (flg) mat->structurally_symmetric = PETSC_TRUE;
> mat->symmetric_set = PETSC_TRUE;
> mat->structurally_symmetric_set = flg;
> #if !defined(PETSC_USE_COMPLEX)
> mat->hermitian = flg;
> mat->hermitian_set = PETSC_TRUE;
> #endif
> break;
> case MAT_HERMITIAN:
> mat->hermitian = flg;
> if (flg) mat->structurally_symmetric = PETSC_TRUE;
> mat->hermitian_set = PETSC_TRUE;
> mat->structurally_symmetric_set = flg;
> #if !defined(PETSC_USE_COMPLEX)
> mat->symmetric = flg;
> mat->symmetric_set = PETSC_TRUE;
> #endif
>
>
>
>
>> On Sep 11, 2019, at 5:55 AM, Pierre Jolivet via petsc-dev
>> <petsc-dev@mcs.anl.gov> wrote:
>>
>> (Putting back petsc-dev on c/c)
>> I don’t think you are the one that needs to do the changes.
>> There should be clarifications from the PETSc side of things, first.
>> From the man page your are quoting
>> (https://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/Mat/MATSEQSBAIJ.html):
>> 1) how to make a SBAIJ Mat Hermitian but not symmetric? Is this handled by
>> PETSc? Is this legal to do MatSetOption(A, MAT_SYMMETRIC, PETSC_FALSE)
>> followed by MatSetOption(A, MAT_HERMITIAN, PETSC_TRUE)? I think this is the
>> case where bs>1 is not handled internally by PETSc, so for this case it
>> should be OK to error out.
>> 2) “Hermitian symmetric” is a fancy way of saying that the matrix has no
>> imaginary part. Or is just “Hermitian" what is supposed to be written on the
>> page? In which case, how do you tell to PETSc that you are indeed dealing
>> with a matrix with no imaginary part.
>>
>> Thanks,
>> Pierre
>>
>>> On 11 Sep 2019, at 11:51 AM, Jose E. Roman <jro...@dsic.upv.es> wrote:
>>>
>>> Now I understand better. You are right. Maybe I should do some changes in
>>> SLEPc. I will think about this next week.
>>>
>>>
>>>> El 11 sept 2019, a las 11:38, Pierre Jolivet <pierre.joli...@enseeiht.fr>
>>>> escribió:
>>>>
>>>>
>>>>
>>>>> On 11 Sep 2019, at 11:21 AM, Jose E. Roman <jro...@dsic.upv.es> wrote:
>>>>>
>>>>> In
>>>>> https://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/Mat/MATSEQSBAIJ.html
>>>>> it says "To make it Hermitian symmetric you can call MatSetOption(Mat,
>>>>> MAT_HERMITIAN);" So my understanding is that in SBAIJ assumes
>>>>> MAT_SYMMETRIC and the user must set MAT_HERMITIAN if desired.
>>>>
>>>> Right, that is exactly what you do in STMatSetHermitian. You get from the
>>>> user a SBAIJ matrix (so SYMMETRIC = true), and you set yourself HERMITIAN
>>>> = true.
>>>>
>>>>> I don't think it makes sense to set both MAT_HERMITIAN and MAT_SYMMETRIC.
>>>>
>>>> Why? A symmetric (or Hermitian) matrix with no imaginary part is both
>>>> Hermitian and symmetric, so at least this set of options defines correctly
>>>> the structure of the matrix (which is not the case if you only assume it
>>>> is _either_ symmetric or Hermitian).
>>>>
>>>>> But I may be wrong because I find this part of PETSc very confusing.
>>>>>
>>>>>
>>>>>> El 11 sept 2019, a las 11:08, Jose E. Roman <jro...@dsic.upv.es>
>>>>>> escribió:
>>>>>>
>>>>>> Do you mean setting both flags MAT_HERMITIAN and MAT_SYMMETRIC? Is this
>>>>>> possible?
>>>>
>>>> It was possible before my commit for bs == 1, but not for bs > 1.
>>>>
>>>> At least now my tests are not failing.
>>>>
>>>>>>> El 11 sept 2019, a las 11:04, Pierre Jolivet
>>>>>>> <pierre.joli...@enseeiht.fr> escribió:
>>>>>>>
>>>>>>> Symmetric <=> a_ij = a_ji
>>>>>>> Hermitian <=> a_ij = conj(a_ji)
>>>>>>>
>>>>>>> Symmetric + Hermitian <=> a_ij = conj(a_ji) = a_ji <=> imag(a_ji) = 0
>>>>>>> \forall ij
>>>>>>>
>>>>>>> Or am I stupid?
>>>>>>>
>>>>>>>> On 11 Sep 2019, at 10:59 AM, Jose E. Roman <jro...@dsic.upv.es> wrote:
>>>>>>>>
>>>>>>>> Not sure if I understand you. Do you mean that a complex SBAIJ Mat
>>>>>>>> with MAT_HERMITIAN flag can be assumed to have zero imaginary part? I
>>>>>>>> don't think so. This matrix should have real diagonal entries, but
>>>>>>>> off-diagonal entries should be allowed to have nonzero imaginary part.
>>>>>>>> This is what is done in MatMult_SeqSBAIJ_1_Hermitian(), where
>>>>>>>> off-diagonal entries are conjugated when used for the strict lower
>>>>>>>> triangular part. So I guess the right fix is to implement
>>>>>>>> MatMult_SeqSBAIJ_2_Hermitian(), MatMult_SeqSBAIJ_3_Hermitian() and so
>>>>>>>> on with appropriate use of PetscConj().
>>>>>>>>
>>>>>>>> Jose
>>>>>>>>
>>>>>>>>> El 11 sept 2019, a las 10:36, Pierre Jolivet
>>>>>>>>> <pierre.joli...@enseeiht.fr> escribió:
>>>>>>>>>
>>>>>>>>> Nevermind, this is the wrong fix.
>>>>>>>>> The proper fix is in PETSc. It should not error out if the matrix is
>>>>>>>>> also symmetric.
>>>>>>>>> Indeed, complex symmetric Hermitian => complex with no imaginary part.
>>>>>>>>> Thus all operations like MatMult, MatMultHermitianTranspose,
>>>>>>>>> Cholesky… will work for bs > 1, since all is filled with zeroes.
>>>>>>>>> I will take care of this, I’m c/c’ing petsc-dev so that they don’t
>>>>>>>>> have to “reverse engineer” the trivial change to
>>>>>>>>> MatSetOption_SeqSBAIJ.
>>>>>>>>>
>>>>>>>>> Sorry about the noise.
>>>>>>>>>
>>>>>>>>> Thank you,
>>>>>>>>> Pierre
>>>>>>>>>
>>>>>>>>>> On 10 Sep 2019, at 8:37 AM, Pierre Jolivet
>>>>>>>>>> <pierre.joli...@enseeiht.fr> wrote:
>>>>>>>>>>
>>>>>>>>>> Hello,
>>>>>>>>>> Could you consider not setting MAT_HERMITIAN here
>>>>>>>>>> http://slepc.upv.es/documentation/current/src/sys/classes/st/interface/stsles.c.html#line276
>>>>>>>>>> when using SBAIJ matrices with bs > 1?
>>>>>>>>>> This makes PETSc error out with
>>>>>>>>>> # [1]PETSC ERROR: No support for this operation for this object
>>>>>>>>>> type
>>>>>>>>>> # [1]PETSC ERROR: No support for Hermitian with block size
>>>>>>>>>> greater than 1
>>>>>>>>>>
>>>>>>>>>> The change does not bring any regression, since PETSc is always
>>>>>>>>>> giving an error without it, but on the contrary, it improves the
>>>>>>>>>> range of applicability of SLEPc, e.g., for complex Hermitian
>>>>>>>>>> problems with SBAIJ matrices and bs > 1 that _don’t_ require the
>>>>>>>>>> flag MAT_HERMITIAN set to true.
>>>>>>>>>>
>>>>>>>>>> Thanks,
>>>>>>>>>> Pierre
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>