Actual source code: test1.c

      1: /*
      2:    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      3:    SLEPc - Scalable Library for Eigenvalue Problem Computations
      4:    Copyright (c) 2002-, Universitat Politecnica de Valencia, Spain

      6:    This file is part of SLEPc.
      7:    SLEPc is distributed under a 2-clause BSD license (see LICENSE).
      8:    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      9: */

     11: static char help[] = "Test RG interface functions.\n\n";

     13: #include <slepcrg.h>

     15: #define NPOINTS 10
     16: #define NVERTEX 7

     18: int main(int argc,char **argv)
     19: {
     20:   RG             rg;
     21:   PetscInt       i,inside,nv;
     22:   PetscBool      triv;
     23:   PetscReal      re,im,a,b,c,d;
     24:   PetscScalar    ar,ai,cr[NPOINTS],ci[NPOINTS],vr[NVERTEX],vi[NVERTEX],*pr,*pi;

     26:   PetscFunctionBeginUser;
     27:   PetscCall(SlepcInitialize(&argc,&argv,NULL,help));
     28:   PetscCall(RGCreate(PETSC_COMM_WORLD,&rg));

     30:   /* ellipse */
     31:   PetscCall(RGSetType(rg,RGELLIPSE));
     32:   PetscCall(RGIsTrivial(rg,&triv));
     33:   PetscCheck(triv,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Region should be trivial before setting parameters");
     34:   PetscCall(RGEllipseSetParameters(rg,1.1,2,0.1));
     35:   PetscCall(RGSetFromOptions(rg));
     36:   PetscCall(RGIsTrivial(rg,&triv));
     37:   PetscCheck(!triv,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Region should be non-trivial after setting parameters");
     38:   PetscCall(RGView(rg,NULL));
     39:   PetscCall(RGViewFromOptions(rg,NULL,"-rg_ellipse_view"));
     40:   re = 0.1; im = 0.3;
     41: #if defined(PETSC_USE_COMPLEX)
     42:   ar = PetscCMPLX(re,im);
     43: #else
     44:   ar = re; ai = im;
     45: #endif
     46:   PetscCall(RGCheckInside(rg,1,&ar,&ai,&inside));
     47:   PetscCall(PetscPrintf(PETSC_COMM_WORLD,"Point (%g,%g) is %s the region\n",(double)re,(double)im,(inside>=0)?"inside":"outside"));

     49:   PetscCall(RGComputeBoundingBox(rg,&a,&b,&c,&d));
     50:   PetscCall(PetscPrintf(PETSC_COMM_WORLD,"The bounding box is [%g,%g]x[%g,%g]\n",(double)a,(double)b,(double)c,(double)d));

     52:   PetscCall(PetscPrintf(PETSC_COMM_WORLD,"Contour points: "));
     53:   PetscCall(RGComputeContour(rg,NPOINTS,cr,ci));
     54:   for (i=0;i<NPOINTS;i++) {
     55: #if defined(PETSC_USE_COMPLEX)
     56:     re = PetscRealPart(cr[i]);
     57:     im = PetscImaginaryPart(cr[i]);
     58: #else
     59:     re = cr[i];
     60:     im = ci[i];
     61: #endif
     62:     PetscCall(PetscPrintf(PETSC_COMM_WORLD,"(%.3g,%.3g) ",(double)re,(double)im));
     63:   }
     64:   PetscCall(PetscPrintf(PETSC_COMM_WORLD,"\n"));

     66:   /* interval */
     67:   PetscCall(RGSetType(rg,RGINTERVAL));
     68:   PetscCall(RGIsTrivial(rg,&triv));
     69:   PetscCheck(triv,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Region should be trivial before setting parameters");
     70:   PetscCall(RGIntervalSetEndpoints(rg,-1,1,-0.1,0.1));
     71:   PetscCall(RGSetFromOptions(rg));
     72:   PetscCall(RGIsTrivial(rg,&triv));
     73:   PetscCheck(!triv,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Region should be non-trivial after setting parameters");
     74:   PetscCall(RGView(rg,NULL));
     75:   PetscCall(RGViewFromOptions(rg,NULL,"-rg_interval_view"));
     76:   re = 0.2; im = 0;
     77: #if defined(PETSC_USE_COMPLEX)
     78:   ar = PetscCMPLX(re,im);
     79: #else
     80:   ar = re; ai = im;
     81: #endif
     82:   PetscCall(RGCheckInside(rg,1,&ar,&ai,&inside));
     83:   PetscCall(PetscPrintf(PETSC_COMM_WORLD,"Point (%g,%g) is %s the region\n",(double)re,(double)im,(inside>=0)?"inside":"outside"));

     85:   PetscCall(RGComputeBoundingBox(rg,&a,&b,&c,&d));
     86:   PetscCall(PetscPrintf(PETSC_COMM_WORLD,"The bounding box is [%g,%g]x[%g,%g]\n",(double)a,(double)b,(double)c,(double)d));

     88:   PetscCall(PetscPrintf(PETSC_COMM_WORLD,"Contour points: "));
     89:   PetscCall(RGComputeContour(rg,NPOINTS,cr,ci));
     90:   for (i=0;i<NPOINTS;i++) {
     91: #if defined(PETSC_USE_COMPLEX)
     92:     re = PetscRealPart(cr[i]);
     93:     im = PetscImaginaryPart(cr[i]);
     94: #else
     95:     re = cr[i];
     96:     im = ci[i];
     97: #endif
     98:     PetscCall(PetscPrintf(PETSC_COMM_WORLD,"(%.3g,%.3g) ",(double)re,(double)im));
     99:   }
    100:   PetscCall(PetscPrintf(PETSC_COMM_WORLD,"\n"));

    102:   /* polygon */
    103: #if defined(PETSC_USE_COMPLEX)
    104:   vr[0] = PetscCMPLX(0.0,2.0);
    105:   vr[1] = PetscCMPLX(1.0,4.0);
    106:   vr[2] = PetscCMPLX(2.0,5.0);
    107:   vr[3] = PetscCMPLX(4.0,3.0);
    108:   vr[4] = PetscCMPLX(5.0,4.0);
    109:   vr[5] = PetscCMPLX(6.0,1.0);
    110:   vr[6] = PetscCMPLX(2.0,0.0);
    111: #else
    112:   vr[0] = 0.0; vi[0] = 1.0;
    113:   vr[1] = 0.0; vi[1] = -1.0;
    114:   vr[2] = 0.6; vi[2] = -0.8;
    115:   vr[3] = 1.0; vi[3] = -1.0;
    116:   vr[4] = 2.0; vi[4] = 0.0;
    117:   vr[5] = 1.0; vi[5] = 1.0;
    118:   vr[6] = 0.6; vi[6] = 0.8;
    119: #endif
    120:   PetscCall(RGSetType(rg,RGPOLYGON));
    121:   PetscCall(RGIsTrivial(rg,&triv));
    122:   PetscCheck(triv,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Region should be trivial before setting parameters");
    123:   PetscCall(RGPolygonSetVertices(rg,NVERTEX,vr,vi));
    124:   PetscCall(RGSetFromOptions(rg));
    125:   PetscCall(RGIsTrivial(rg,&triv));
    126:   PetscCheck(!triv,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Region should be non-trivial after setting parameters");
    127:   PetscCall(RGView(rg,NULL));
    128:   PetscCall(RGViewFromOptions(rg,NULL,"-rg_polygon_view"));
    129:   re = 5; im = 0.9;
    130: #if defined(PETSC_USE_COMPLEX)
    131:   ar = PetscCMPLX(re,im);
    132: #else
    133:   ar = re; ai = im;
    134: #endif
    135:   PetscCall(RGCheckInside(rg,1,&ar,&ai,&inside));
    136:   PetscCall(PetscPrintf(PETSC_COMM_WORLD,"Point (%g,%g) is %s the region\n",(double)re,(double)im,(inside>=0)?"inside":"outside"));

    138:   PetscCall(RGComputeBoundingBox(rg,&a,&b,&c,&d));
    139:   PetscCall(PetscPrintf(PETSC_COMM_WORLD,"The bounding box is [%g,%g]x[%g,%g]\n",(double)a,(double)b,(double)c,(double)d));

    141:   PetscCall(PetscPrintf(PETSC_COMM_WORLD,"Contour points: "));
    142:   PetscCall(RGComputeContour(rg,NPOINTS,cr,ci));
    143:   for (i=0;i<NPOINTS;i++) {
    144: #if defined(PETSC_USE_COMPLEX)
    145:     re = PetscRealPart(cr[i]);
    146:     im = PetscImaginaryPart(cr[i]);
    147: #else
    148:     re = cr[i];
    149:     im = ci[i];
    150: #endif
    151:     PetscCall(PetscPrintf(PETSC_COMM_WORLD,"(%.3g,%.3g) ",(double)re,(double)im));
    152:   }
    153:   PetscCall(PetscPrintf(PETSC_COMM_WORLD,"\n"));

    155:   /* check vertices */
    156:   PetscCall(RGPolygonGetVertices(rg,&nv,&pr,&pi));
    157:   PetscCheck(nv==NVERTEX,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Wrong number of vertices: %" PetscInt_FMT,nv);
    158:   for (i=0;i<nv;i++) {
    159: #if !defined(PETSC_USE_COMPLEX)
    160:     if (pr[i]!=vr[i] || pi[i]!=vi[i])
    161: #else
    162:     if (pr[i]!=vr[i])
    163: #endif
    164:        SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Vertex number %" PetscInt_FMT " does not match",i);
    165:   }

    167:   PetscCall(PetscFree(pr));
    168: #if !defined(PETSC_USE_COMPLEX)
    169:   PetscCall(PetscFree(pi));
    170: #endif
    171:   PetscCall(RGDestroy(&rg));
    172:   PetscCall(SlepcFinalize());
    173:   return 0;
    174: }

    176: /*TEST

    178:    test:
    179:       suffix: 1
    180:       requires: !complex

    182:    test:
    183:       suffix: 1_complex
    184:       requires: complex

    186:    test:
    187:       suffix: 2
    188:       requires: !complex
    189:       args: -rg_ellipse_view draw:tikz:ellipse.tikz -rg_interval_view draw:tikz:interval.tikz -rg_polygon_view draw:tikz:polygon.tikz
    190:       filter: cat - ellipse.tikz interval.tikz polygon.tikz
    191:       requires: !single

    193:    test:
    194:       suffix: 2_complex
    195:       requires: complex !single
    196:       args: -rg_ellipse_view draw:tikz:ellipse.tikz -rg_interval_view draw:tikz:interval.tikz -rg_polygon_view draw:tikz:polygon.tikz
    197:       filter: cat - ellipse.tikz interval.tikz polygon.tikz

    199: TEST*/