Date: 2013-09-02T10:10:04+00:00

Actual source code: vecutil.c

      1: /*
      2:    Miscellaneous Vec-related functions.

      4:    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      5:    SLEPc - Scalable Library for Eigenvalue Problem Computations
      6:    Copyright (c) 2002-2013, Universitat Politecnica de Valencia, Spain

      8:    This file is part of SLEPc.

     10:    SLEPc is free software: you can redistribute it and/or modify it under  the
     11:    terms of version 3 of the GNU Lesser General Public License as published by
     12:    the Free Software Foundation.

     14:    SLEPc  is  distributed in the hope that it will be useful, but WITHOUT  ANY
     15:    WARRANTY;  without even the implied warranty of MERCHANTABILITY or  FITNESS
     16:    FOR  A  PARTICULAR PURPOSE. See the GNU Lesser General Public  License  for
     17:    more details.

     19:    You  should have received a copy of the GNU Lesser General  Public  License
     20:    along with SLEPc. If not, see <http://www.gnu.org/licenses/>.
     21:    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     22: */

     24: #include <slepc-private/vecimplslepc.h>            /*I "slepcvec.h" I*/
     25: #include <slepcsys.h>

     29: /*@
     30:    SlepcVecSetRandom - Sets all components of a vector to random numbers.

     32:    Logically Collective on Vec

     34:    Input/Output Parameter:
     35: .  x  - the vector

     37:    Input Parameter:
     38: -  rctx - the random number context, formed by PetscRandomCreate(), or NULL and
     39:           it will create one internally.

     41:    Note:
     42:    This operation is equivalent to VecSetRandom - the difference is that the
     43:    vector generated by SlepcVecSetRandom is the same irrespective of the size
     44:    of the communicator (if all processes pass a PetscRandom context initialized
     45:    with the same seed).

     47:    Level: developer
     48: @*/
     49: PetscErrorCode SlepcVecSetRandom(Vec x,PetscRandom rctx)
     50: {
     52:   PetscRandom    randObj = NULL;
     53:   PetscInt       i,n,low,high;
     54:   PetscScalar    *px,t;

     59:   else {
     60:     PetscRandomCreate(PetscObjectComm((PetscObject)x),&randObj);
     61:     PetscRandomSetSeed(randObj,0x12345678);
     62:     PetscRandomSetFromOptions(randObj);
     63:     rctx = randObj;
     64:   }

     66:   VecGetSize(x,&n);
     67:   VecGetOwnershipRange(x,&low,&high);
     68:   VecGetArray(x,&px);
     69:   for (i=0;i<n;i++) {
     70:     PetscRandomGetValue(rctx,&t);
     71:     if (i>=low && i<high) px[i-low] = t;
     72:   }
     73:   VecRestoreArray(x,&px);
     74:   PetscRandomDestroy(&randObj);
     75:   PetscObjectStateIncrease((PetscObject)x);
     76:   return(0);
     77: }

     81: /*@C
     82:    SlepcVecNormalize - Normalizes a possibly complex vector by the 2-norm.

     84:    Collective on Vec

     86:    Input parameters:
     87: +  xr         - the real part of the vector (overwritten on output)
     88: .  xi         - the imaginary part of the vector (not referenced if iscomplex is false)
     89: -  iscomplex - a flag that indicating if the vector is complex

     91:    Output parameter:
     92: .  norm      - the vector norm before normalization (can be set to NULL)

     94:    Level: developer

     96: @*/
     97: PetscErrorCode SlepcVecNormalize(Vec xr,Vec xi,PetscBool iscomplex,PetscReal *norm)
     98: {
    100: #if !defined(PETSC_USE_COMPLEX)
    101:   PetscReal      normr,normi,alpha;
    102: #endif

    106: #if !defined(PETSC_USE_COMPLEX)
    107:   if (iscomplex) {
    109:     VecNormBegin(xr,NORM_2,&normr);
    110:     VecNormBegin(xi,NORM_2,&normi);
    111:     VecNormEnd(xr,NORM_2,&normr);
    112:     VecNormEnd(xi,NORM_2,&normi);
    113:     alpha = SlepcAbsEigenvalue(normr,normi);
    114:     if (norm) *norm = alpha;
    115:     alpha = 1.0 / alpha;
    116:     VecScale(xr,alpha);
    117:     VecScale(xi,alpha);
    118:   } else
    119: #endif
    120:   {
    121:     VecNormalize(xr,norm);
    122:   }
    123:   return(0);
    124: }