LCOV - code coverage report
Current view: top level - eps/impls/external/blopex - petsc-interface.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 66 76 86.8 %
Date: 2019-10-20 05:41:02 Functions: 12 15 80.0 %

          Line data    Source code
       1             : /* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */
       2             : /* @@@ BLOPEX (version 1.1) LGPL Version 2.1 or above.See www.gnu.org. */
       3             : /* @@@ Copyright 2010 BLOPEX team https://github.com/lobpcg/blopex     */
       4             : /* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */
       5             : /* This code was developed by Merico Argentati, Andrew Knyazev, Ilya Lashuk and Evgueni Ovtchinnikov */
       6             : 
       7             : #include <petscvec.h>
       8             : #include <petscblaslapack.h>
       9             : #include "blopex_interpreter.h"
      10             : #include "blopex_temp_multivector.h"
      11             : #include "blopex_fortran_matrix.h"
      12             : 
      13             : static PetscRandom LOBPCG_RandomContext = NULL;
      14             : 
      15             : #if !defined(PETSC_USE_COMPLEX)
      16        1012 : BlopexInt PETSC_dpotrf_interface (char *uplo,BlopexInt *n,double *a,BlopexInt * lda,BlopexInt *info)
      17             : {
      18             :   PetscBLASInt n_,lda_,info_;
      19             : 
      20             :   /* type conversion */
      21        1012 :   n_ = *n;
      22        1012 :   lda_ = *lda;
      23        1012 :   info_ = *info;
      24             : 
      25        1012 :   LAPACKpotrf_(uplo,&n_,(PetscScalar*)a,&lda_,&info_);
      26             : 
      27        1012 :   *info = info_;
      28        1012 :   return 0;
      29             : }
      30             : 
      31         514 : BlopexInt PETSC_dsygv_interface (BlopexInt *itype,char *jobz,char *uplo,BlopexInt *n,double *a,BlopexInt *lda,double *b,BlopexInt *ldb,double *w,double *work,BlopexInt *lwork,BlopexInt *info)
      32             : {
      33             :   PetscBLASInt itype_,n_,lda_,ldb_,lwork_,info_;
      34             : 
      35         514 :   itype_ = *itype;
      36         514 :   n_ = *n;
      37         514 :   lda_ = *lda;
      38         514 :   ldb_ = *ldb;
      39         514 :   lwork_ = *lwork;
      40         514 :   info_ = *info;
      41             : 
      42         514 :   LAPACKsygv_(&itype_,jobz,uplo,&n_,(PetscScalar*)a,&lda_,(PetscScalar*)b,&ldb_,(PetscScalar*)w,(PetscScalar*)work,&lwork_,&info_);
      43             : 
      44         514 :   *info = info_;
      45         514 :   return 0;
      46             : }
      47             : #else
      48             : BlopexInt PETSC_zpotrf_interface (char *uplo,BlopexInt *n,komplex *a,BlopexInt* lda,BlopexInt *info)
      49             : {
      50             :   PetscBLASInt n_,lda_,info_;
      51             : 
      52             :   /* type conversion */
      53             :   n_ = *n;
      54             :   lda_ = (PetscBLASInt)*lda;
      55             : 
      56             :   LAPACKpotrf_(uplo,&n_,(PetscScalar*)a,&lda_,&info_);
      57             : 
      58             :   *info = info_;
      59             :   return 0;
      60             : }
      61             : 
      62             : BlopexInt PETSC_zsygv_interface (BlopexInt *itype,char *jobz,char *uplo,BlopexInt *n,komplex *a,BlopexInt *lda,komplex *b,BlopexInt *ldb,double *w,komplex *work,BlopexInt *lwork,double *rwork,BlopexInt *info)
      63             : {
      64             :   PetscBLASInt itype_,n_,lda_,ldb_,lwork_,info_;
      65             : 
      66             :   itype_ = *itype;
      67             :   n_ = *n;
      68             :   lda_ = *lda;
      69             :   ldb_ = *ldb;
      70             :   lwork_ = *lwork;
      71             :   info_ = *info;
      72             : 
      73             :   LAPACKsygv_(&itype_,jobz,uplo,&n_,(PetscScalar*)a,&lda_,(PetscScalar*)b,&ldb_,(PetscReal*)w,(PetscScalar*)work,&lwork_,(PetscReal*)rwork,&info_);
      74             : 
      75             :   *info = info_;
      76             :   return 0;
      77             : }
      78             : #endif
      79             : 
      80         247 : void *PETSC_MimicVector(void *vvector)
      81             : {
      82             :   PetscErrorCode  ierr;
      83             :   Vec temp;
      84             : 
      85         247 :   ierr = VecDuplicate((Vec)vvector,&temp);CHKERRABORT(PETSC_COMM_SELF,ierr);
      86         247 :   return (void*)temp;
      87             : }
      88             : 
      89         290 : BlopexInt PETSC_DestroyVector(void *vvector)
      90             : {
      91             :   PetscErrorCode ierr;
      92         290 :   Vec v = (Vec)vvector;
      93             : 
      94         290 :   ierr = VecDestroy(&v);CHKERRQ(ierr);
      95             :   return 0;
      96             : }
      97             : 
      98       59023 : BlopexInt PETSC_InnerProd(void *x,void *y,void *result)
      99             : {
     100             :   PetscErrorCode ierr;
     101             : 
     102       59023 :   ierr = VecDot((Vec)x,(Vec)y,(PetscScalar*)result);CHKERRQ(ierr);
     103             :   return 0;
     104             : }
     105             : 
     106       16495 : BlopexInt PETSC_CopyVector(void *x,void *y)
     107             : {
     108             :   PetscErrorCode  ierr;
     109             : 
     110       16495 :   ierr = VecCopy((Vec)x,(Vec)y);CHKERRQ(ierr);
     111             :   return 0;
     112             : }
     113             : 
     114       21734 : BlopexInt PETSC_ClearVector(void *x)
     115             : {
     116             :   PetscErrorCode  ierr;
     117             : 
     118       21734 :   ierr = VecSet((Vec)x,0.0);CHKERRQ(ierr);
     119             :   return 0;
     120             : }
     121             : 
     122           0 : BlopexInt PETSC_SetRandomValues(void* v,BlopexInt seed)
     123             : {
     124             :   PetscErrorCode ierr;
     125             : 
     126             :   /* note: without previous call to LOBPCG_InitRandomContext LOBPCG_RandomContext will be null,
     127             :     and VecSetRandom will use internal petsc random context */
     128             : 
     129           0 :   ierr = VecSetRandom((Vec)v,LOBPCG_RandomContext);CHKERRQ(ierr);
     130             :   return 0;
     131             : }
     132             : 
     133           0 : BlopexInt PETSC_ScaleVector(double alpha,void *x)
     134             : {
     135             :   PetscErrorCode ierr;
     136             : 
     137           0 :   ierr = VecScale((Vec)x,alpha);CHKERRQ(ierr);
     138             :   return 0;
     139             : }
     140             : 
     141       80589 : BlopexInt PETSC_Axpy(void *alpha,void *x,void *y)
     142             : {
     143             :   PetscErrorCode ierr;
     144             : 
     145       80589 :   ierr = VecAXPY((Vec)y,*(PetscScalar*)alpha,(Vec)x);CHKERRQ(ierr);
     146             :   return 0;
     147             : }
     148             : 
     149           0 : BlopexInt PETSC_VectorSize(void *x)
     150             : {
     151             :   PetscInt N;
     152           0 :   VecGetSize((Vec)x,&N);
     153           0 :   return N;
     154             : }
     155             : 
     156           6 : int LOBPCG_InitRandomContext(MPI_Comm comm,PetscRandom rand)
     157             : {
     158             :   PetscErrorCode ierr;
     159             :   /* PetscScalar rnd_bound = 1.0; */
     160             : 
     161           6 :   if (rand) {
     162           0 :     ierr = PetscObjectReference((PetscObject)rand);CHKERRQ(ierr);
     163           0 :     ierr = PetscRandomDestroy(&LOBPCG_RandomContext);CHKERRQ(ierr);
     164           0 :     LOBPCG_RandomContext = rand;
     165             :   } else {
     166           6 :     ierr = PetscRandomCreate(comm,&LOBPCG_RandomContext);CHKERRQ(ierr);
     167             :   }
     168             :   return 0;
     169             : }
     170             : 
     171           6 : int LOBPCG_SetFromOptionsRandomContext(void)
     172             : {
     173             :   PetscErrorCode ierr;
     174           6 :   ierr = PetscRandomSetFromOptions(LOBPCG_RandomContext);CHKERRQ(ierr);
     175             : 
     176             : #if defined(PETSC_USE_COMPLEX)
     177             :   ierr = PetscRandomSetInterval(LOBPCG_RandomContext,(PetscScalar)PetscCMPLX(-1.0,-1.0),(PetscScalar)PetscCMPLX(1.0,1.0));CHKERRQ(ierr);
     178             : #else
     179           6 :   ierr = PetscRandomSetInterval(LOBPCG_RandomContext,(PetscScalar)-1.0,(PetscScalar)1.0);CHKERRQ(ierr);
     180             : #endif
     181             :   return 0;
     182             : }
     183             : 
     184           6 : int LOBPCG_DestroyRandomContext(void)
     185             : {
     186             :   PetscErrorCode ierr;
     187             : 
     188           6 :   ierr = PetscRandomDestroy(&LOBPCG_RandomContext);CHKERRQ(ierr);
     189             :   return 0;
     190             : }
     191             : 
     192           7 : int PETSCSetupInterpreter(mv_InterfaceInterpreter *i)
     193             : {
     194           7 :   i->CreateVector = PETSC_MimicVector;
     195           7 :   i->DestroyVector = PETSC_DestroyVector;
     196           7 :   i->InnerProd = PETSC_InnerProd;
     197           7 :   i->CopyVector = PETSC_CopyVector;
     198           7 :   i->ClearVector = PETSC_ClearVector;
     199           7 :   i->SetRandomValues = PETSC_SetRandomValues;
     200           7 :   i->ScaleVector = PETSC_ScaleVector;
     201           7 :   i->Axpy = PETSC_Axpy;
     202           7 :   i->VectorSize = PETSC_VectorSize;
     203             : 
     204             :   /* Multivector part */
     205             : 
     206           7 :   i->CreateMultiVector = mv_TempMultiVectorCreateFromSampleVector;
     207           7 :   i->CopyCreateMultiVector = mv_TempMultiVectorCreateCopy;
     208           7 :   i->DestroyMultiVector = mv_TempMultiVectorDestroy;
     209             : 
     210           7 :   i->Width = mv_TempMultiVectorWidth;
     211           7 :   i->Height = mv_TempMultiVectorHeight;
     212           7 :   i->SetMask = mv_TempMultiVectorSetMask;
     213           7 :   i->CopyMultiVector = mv_TempMultiVectorCopy;
     214           7 :   i->ClearMultiVector = mv_TempMultiVectorClear;
     215           7 :   i->SetRandomVectors = mv_TempMultiVectorSetRandom;
     216           7 :   i->Eval = mv_TempMultiVectorEval;
     217             : 
     218             : #if defined(PETSC_USE_COMPLEX)
     219             :   i->MultiInnerProd = mv_TempMultiVectorByMultiVector_complex;
     220             :   i->MultiInnerProdDiag = mv_TempMultiVectorByMultiVectorDiag_complex;
     221             :   i->MultiVecMat = mv_TempMultiVectorByMatrix_complex;
     222             :   i->MultiVecMatDiag = mv_TempMultiVectorByDiagonal_complex;
     223             :   i->MultiAxpy = mv_TempMultiVectorAxpy_complex;
     224             :   i->MultiXapy = mv_TempMultiVectorXapy_complex;
     225             : #else
     226           7 :   i->MultiInnerProd = mv_TempMultiVectorByMultiVector;
     227           7 :   i->MultiInnerProdDiag = mv_TempMultiVectorByMultiVectorDiag;
     228           7 :   i->MultiVecMat = mv_TempMultiVectorByMatrix;
     229           7 :   i->MultiVecMatDiag = mv_TempMultiVectorByDiagonal;
     230           7 :   i->MultiAxpy = mv_TempMultiVectorAxpy;
     231           7 :   i->MultiXapy = mv_TempMultiVectorXapy;
     232             : #endif
     233             : 
     234           7 :   return 0;
     235             : }

Generated by: LCOV version 1.13