hello

i am trying to solve generalized eigenvalue problem using eps solver. i
have a monte carlo loop in the program which has to run for about 1000
times. matrix sizes are 15 X 15 as a dummy problem and 23040 X23040 in the
real problem.
as i run the program i see that eps takes increasingly more amount of time
for computation with respect to iterations and number of processors too.
i have used all the options to the best of  my knowledge and need your help
to improve the program in any way possible.
i am attaching .c file of mycode with this email.

I would be extremely greatful to you for your valuable suggestions.



*Siddhesh M Godbole*

5th year Dual Degree,
Civil Eng & Applied Mech.
IIT Madras
 static char help[]="eps";

#include <petscmat.h>
#include <petscvec.h>
#include <../src/mat/impls/sbaij/seq/sbaij.h>
#include <petscblaslapack.h>
#include <petscksp.h>
#include <math.h>
#include <petsc-private/vecimpl.h>
#include <petsc-private/taoimpl.h>
#include "../src/tao/pde_constrained/impls/lcl/lcl.h"
#include <slepceps.h>
#include "mpi.h"

extern PetscErrorCode CkEigenSolutions(PetscInt*,Mat*,PetscReal*,Vec*,PetscInt*,PetscInt*,PetscReal*);
extern PetscErrorCode FormElementStiffness_idx0(PetscScalar,PetscScalar,PetscScalar,PetscScalar,PetscScalar*);
extern PetscErrorCode FormElementStiffness(PetscScalar,PetscScalar,PetscScalar,PetscScalar,PetscScalar*);
extern PetscErrorCode FormElementMass_idx0(PetscScalar, PetscScalar, PetscScalar, PetscScalar, PetscScalar*);
extern PetscErrorCode FormElementMass(PetscScalar, PetscScalar, PetscScalar, PetscScalar, PetscScalar*);
extern PetscErrorCode FormRandomElementStiffness(PetscScalar, PetscScalar, PetscScalar, PetscScalar, PetscScalar*);



#undef __FUNCT__
#define __FUNCT__ "main"
 int main(int argc,char **args)
{
  Mat            K,M,DM,DK,ME,KE,Phi,TPhi,P,disp,vel,acc,f,invM,Kcap,a,b,invKcap,U,mmtop,kktop,a2DM;
  Vec            Iv,*Cv,xr,xi,delpe;
  Vec            random,P0,P1,P2,Pans,dKcap,delp,delu,delv,dela,v1,v1a3,acc1a5,v2,*av1,bacc1,v1a4,acc1a6,a1delu,a2delu,disp1,disp2,acc1,acc2/*(intial condition vector of acceleration)*/;    
  char           file1[PETSC_MAX_PATH_LEN],file2[PETSC_MAX_PATH_LEN];           /* input file name */  
  PetscBool      flg,flgB=PETSC_FALSE;
  PetscErrorCode ierr;
  PetscRandom    rnd;
  PetscBool      preload=PETSC_TRUE,isSymmetric,evecs,isHermitian,isGeneralized,isPositive,*aK;
  PetscScalar    *arrayK,*arrayM,*evecs_array,kr,ki,re,im,*axr;
  PetscMPIInt    size,rank;
  PetscInt       i,j,z,k,nev,il,iu,r,trial=1,change;
  PetscInt       maxit,its,lits,nconv,nini=1,ncon=0,S=100000,Dim=100000;
  PetscLogStage  stages[2];
  PetscReal      vl,vu,abstol=1.e-8;
  PetscScalar    Matlab_E,freq[Dim],total[Dim],average[Dim],REV[trial],Xr[Dim];
  PetscInt       t,/*n=5,m=2*/id[1],idx[6],IDX[3],index[1],idxmcsn[Dim],idxmcsm[1],idxrandom[trial],idx1[Dim],idxnt[1000],rows[Dim],one[1],istart,iend,nrows;
  /*S = (n+1)*(m);*/
  ST		 st;	
  EPS		 eps;
  EPSType        type;	
  PetscScalar    Ke[16], Me[16],K0[4],M0[4];
  PetscScalar    width = 25.65/1000;   /*25.65 mm */        
  PetscScalar    depth = 3.25/1000;    /* 3.25 mm   */        
  PetscScalar    Area = width*depth, rho   = 2662;         /*2662 kg/m3*/   
  PetscScalar 	 Tlel =.31;            /*length of the beam*/   
  PetscScalar    lel  = Tlel/5;        /*length of each element*/  
  PetscScalar    I = width*depth*depth*depth/12;          /*moment of inertia*/
  PetscScalar    E = 50000000000,En;       /*Modulus of elasticity*/
  PetscViewer    fd1,fd2,fd3,viewer;
  PetscReal      tol;
  	/*parameters used in Newmarks method*/  	
  PetscScalar 	 value[1000],*aP0,*aDM,*aDK,*aa,*ab,*aKcap,*aav1,*abacc1,*aP2,*adelp,*adelu,*av1a3,*av1a4,*aacc1a5,*aacc1a6,*adelv,*adela,*aa1delu,*aa2delu,*adisp1,*adisp2,*arv1,*arv2,*aacc1,*aacc2;
  PetscScalar	 ainvKcap[S],*adKcap;
  PetscScalar	 gaama=1/2,beta=1/4,dt=.01,tt=1000,a1=200,a2= 40000,a3=400,a4= 2,a5= 2,a6=0;






SlepcInitialize(&argc,&args,(char*)0,help);
 
  ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr);
  ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
     
/*Setting up socket connection for Petsc-Matlab interfacing*/	
	/*fd1 = PETSC_VIEWER_SOCKET_WORLD;
	/*fd2 = PETSC_VIEWER_SOCKET_2;
	/*fd3 = PETSC_VIEWER_SOCKET_3;
	PetscViewerSocketOpen(PETSC_COMM_WORLD,"NULL",PETSC_DEFAULT,&fd1);*/
 	
	/*PetscViewerSocketOpen(PETSC_COMM_WORLD,"NULL",PETSC_DEFAULT,&fd3);

/*if matrices are to be read from the file*/
	/*ierr = PetscOptionsGetString(NULL,"-file1",file1,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr);
	ierr = PetscPrintf(PETSC_COMM_WORLD," Reading Real 'Mass' matrix from a binary file...\n");CHKERRQ(ierr);
	ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,file1,FILE_MODE_READ,&viewer);CHKERRQ(ierr);*/
	/*ierr = MatCreate(PETSC_COMM_WORLD,&mmtop);CHKERRQ(ierr);
	ierr = MatLoad(mmtop,fd1);CHKERRQ(ierr);
	/*ierr = MatView(mmtop,fd1);CHKERRQ(ierr);
 	
	/*ierr = MatSetFromOptions(Mfile);CHKERRQ(ierr);
 	ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);*/

	/*ierr = PetscOptionsGetString(NULL,"-file2",file2,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr);
	ierr = PetscPrintf(PETSC_COMM_WORLD," Reading Real 'Stiffness' matrix from a binary file...\n");CHKERRQ(ierr);
	ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,file2,FILE_MODE_READ,&fd);CHKERRQ(ierr);*/
	/*PetscViewerSocketOpen(PETSC_COMM_WORLD,"NULL",PETSC_DEFAULT,&fd2); */	
	/*ierr = MatCreate(PETSC_COMM_WORLD,&kktop);CHKERRQ(ierr);
	ierr = MatLoad(kktop,fd1);CHKERRQ(ierr);
	/*ierr = MatView(kktop,fd1);CHKERRQ(ierr);
	/*ierr = MatSetFromOptions(Kfile);CHKERRQ(ierr);
 	ierr = PetscViewerDestroy(&fd);CHKERRQ(ierr);*/





 
 
 PetscRandomCreate(PETSC_COMM_WORLD,&rnd);
 PetscRandomSetType(rnd,PETSCRAND48);
 PetscRandomSetFromOptions(rnd);
 
 for(i=0;i<trial;i++) { PetscRandomGetValue(rnd,&Matlab_E);	REV[i]=Matlab_E-0.5;	}
/* for(i=0;i<trial/5;i++) printf("from processor %d:   %f   %f   %f    %f   %f    \n ",rank,REV[i],REV[trial/5+i],REV[2*trial/5+i],REV[3*trial/5+i],REV[4*trial/5+i]);*/

 PetscRandomDestroy(&rnd);      

for(i=0;i<S;i++) {freq[i]=0;total[i]=0;average[i]=0;}

/*_____________________________________________________________________ Creating mass matrix_______________________________________________________*/
  ierr  = MatCreate(PETSC_COMM_WORLD,&M);CHKERRQ(ierr);
  ierr  = MatSetSizes(M,PETSC_DECIDE,PETSC_DECIDE,S,S);CHKERRQ(ierr);
  ierr  = MatSetFromOptions(M);CHKERRQ(ierr);
  ierr  = MatSetUp(M);CHKERRQ(ierr);
  /*
     Assemble matrix
  */
 
  
  for (i=0; i<5; i++) 
  {
    
    /* node numbers for the four corners of element */
    
    if(i==0)
    { ierr = FormElementMass_idx0(rho,lel,width,depth,M0);
    IDX[0]=0;
    IDX[1]=1;
    IDX[2]=2;
    ierr   = MatSetValues(M,3,IDX,3,IDX,M0,ADD_VALUES);CHKERRQ(ierr);}

    else  { ierr = FormElementMass(rho,lel,width,depth,Me);
    idx[0] = 3*(i-1);
    idx[1] = idx[0]+1; idx[2] = idx[1] + 1; idx[3] = idx[2] + 1; idx[4] = idx[3] + 1; idx[5] = idx[4] + 1;
    ierr   = MatSetValues(M,6,idx,6,idx,Me,ADD_VALUES);CHKERRQ(ierr);}
  }
  ierr = MatAssemblyBegin(M,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
  ierr = MatAssemblyEnd(M,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
  /*MatView(M,fd1);
/* printf("Mass Matrix is" "/n" "/n"); 
 */
/*PetscLogStagePush(stages[0]);*/





change=0;
/* ******************************************************************LOOP FOR MONTE CARLO SIMULATION STARTS******************************************************	*/



for(z=0;z<trial;z++)
{ 

 /*printf( " \n \n %d th trial on  process %d out of %d processes is working fine! \n", z,rank+1, size);


  /* _________________________________________________________________________________Stiffness matrices ___________________________________________________________________*/
 
  ierr  = MatCreate(PETSC_COMM_WORLD,&K);CHKERRQ(ierr);
  ierr  = MatSetSizes(K,PETSC_DECIDE,PETSC_DECIDE,S,S);CHKERRQ(ierr); 
  ierr  = MatSetFromOptions(K);CHKERRQ(ierr);
  ierr  = MatSetUp(K);CHKERRQ(ierr);
  /*
     Assemble matrix
  */
  
  
  for (i=0; i<5; i++) 
  {     
    
 
    if(i==0)
    {
    ierr = FormElementStiffness_idx0(E,Area,lel,I,K0);
    IDX[0]=2*i;
    IDX[1]=2*i+1;
    IDX[2]=2*i+2;
    ierr   = MatSetValues(K,3,IDX,3,IDX,K0,ADD_VALUES);CHKERRQ(ierr);
    }   
   else if(i<4)
   { 
    ierr = FormElementStiffness(E,Area,lel,I,Ke);CHKERRQ(ierr);
    idx[0] = 3*(i-1);
    idx[1] = idx[0]+1; idx[2] = idx[1] + 1; idx[3] = idx[2] + 1; idx[4] = idx[3] + 1; idx[5] = idx[4] + 1;
    ierr   = MatSetValues(K,6,idx,6,idx,Ke,ADD_VALUES);CHKERRQ(ierr);}
  
   else
   { 
    En = E*(1 + REV[z]/10);
    ierr = FormRandomElementStiffness(En,Area,lel,I,Ke);
    idx[0] = 3*(i-1);
    idx[1] = idx[0]+1; idx[2] = idx[1] + 1; idx[3] = idx[2] + 1;  idx[4] = idx[3] + 1; idx[5] = idx[4] + 1;
    ierr   = MatSetValues(K,6,idx,6,idx,Ke,ADD_VALUES);CHKERRQ(ierr);
   }
  }
   
  ierr = MatAssemblyBegin(K,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
  ierr = MatAssemblyEnd(K,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
 /*  printf("Mass Matrix is" "/n" "/n"); 
 MatView(K,viewer);*/
				/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      
         									 Create the eigensolver and set various options
  /*
     Create eigensolver context
  */
  
   ierr = EPSCreate(PETSC_COMM_WORLD,&eps);CHKERRQ(ierr); 													  

  /*
     Set operators. In this case, it is a generalized eigenvalue problem
  */
  ierr = EPSSetOperators(eps,K,M);CHKERRQ(ierr); 	/*==========================Do necessary changes with Kfile and Mfile according to the location from which they are taken======*/
  MatGetVecs(K,NULL,&xr);
 /* VecSet(xr,100);*/
  /*MatGetVecs(K,NULL,&xi);	*/			/*=========Do necessary changes=======*/		
  /*
     If the user provided initial guesses or constraints, pass them here
  */
  /*VecLoad(Iv,fd1);*/
  ierr = EPSSetInitialSpace(eps,1,&xr);CHKERRQ(ierr);
 /* ierr = EPSSetDeflationSpace(eps,ncon,Cv);CHKERRQ(ierr);*/

  /*
     Set solver parameters at runtime
  */
  ierr = EPSSetFromOptions(eps);CHKERRQ(ierr);

 				 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                   									Solve the eigensystem   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ 
   /*set problem as generalized hermitian*/
  										
  EPSSetProblemType(eps,EPS_GHEP); 


  ierr = EPSIsGeneralized(eps,&isGeneralized);CHKERRQ(ierr);
  ierr = EPSIsHermitian(eps,&isHermitian);CHKERRQ(ierr);
  ierr = EPSIsPositive(eps,&isPositive);CHKERRQ(ierr);
  ierr = EPSSolve(eps);CHKERRQ(ierr);

  



   /*ierr = EPSPrintSolution(eps,NULL);CHKERRQ(ierr);*/
 	 
  
  ierr = EPSGetConverged(eps,&nconv);CHKERRQ(ierr);

  /*printf(" converged eigenpairs are %d \n",nconv);*/
	 /* setting up the eigenvector matrix */
	 ierr  = MatCreate(PETSC_COMM_WORLD,&Phi);CHKERRQ(ierr);
 	 ierr  = MatSetSizes(Phi,PETSC_DECIDE,PETSC_DECIDE,Dim,nconv);CHKERRQ(ierr); 
 	 ierr  = MatSetFromOptions(Phi);CHKERRQ(ierr);
  	 ierr  = MatSetUp(Phi);CHKERRQ(ierr);
	
	
	
     /*Save eigenvectors, if requested in Phi matrix*/

	/*initializing Phi matrix*/
	
  for (i=0;i<nconv;i++)
 {    
	
     ierr = EPSGetEigenpair(eps,i,&kr,&ki,xr,xi);CHKERRQ(ierr);
    /*ierr = PetscPrintf(PETSC_COMM_WORLD,"eigenvalues are:   %12f   \n",sqrt((double)kr)/(2*3.1415926535));CHKERRQ(ierr);*/


	VecGetArray(xr,&axr);
	for(j=0;j<Dim;j++){idx1[j]=j;}
	MatSetValues(Phi,Dim,&idx1,1,&i,axr,ADD_VALUES);
	VecRestoreArray(xr,&axr);
	
/*ierr = padmatrix(xr,S,nconv,Phi,i);CHKERRQ(ierr);*/


      re = kr;
      im = ki;
  total[i]= total[i] + kr;
     
	
	
    }
	/*ierr = VecDestroy(&xr);CHKERRQ(ierr);*/
        ierr = MatAssemblyBegin(Phi,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
 	ierr = MatAssemblyEnd(Phi,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
	/*ierr = MatView(Phi,fd1);CHKERRQ(ierr);
   /* ierr = PetscPrintf(PETSC_COMM_WORLD,"\n");CHKERRQ(ierr);*/
  



  
  
 
  ierr = PetscFree(xi);CHKERRQ(ierr);
  

   ierr = EPSDestroy(&eps);CHKERRQ(ierr);
    ierr = VecDestroy(&xr);CHKERRQ(ierr);

/*_________________________________________________________________________________________________________________________________
 					Solving system dynamics
_________________________________________________________________________________________________________________________________*/


  ierr = MatTranspose(Phi,MAT_INITIAL_MATRIX,&TPhi);CHKERRQ(ierr);      /* B = A^T */
  ierr = MatMatMult(M,Phi,MAT_INITIAL_MATRIX,1,&ME);CHKERRQ(ierr);       /*ME = M*Phi*/
  ierr = MatMatMult(TPhi,ME,MAT_INITIAL_MATRIX,1,&DM);CHKERRQ(ierr);    /*DM = TPhi*ME*/

   
  ierr = MatMatMult(K,Phi,MAT_INITIAL_MATRIX,1,&KE);CHKERRQ(ierr);       /*ME = K*Phi*/
  ierr = MatMatMult(TPhi,KE,MAT_INITIAL_MATRIX,1,&DK);CHKERRQ(ierr);    /*DM = TPhi*KE*/
  /*ierr = PetscPrintf(PETSC_COMM_WORLD,"Decoupled mass matrix is\n");CHKERRQ(ierr);*/
 /* MatView(DM,fd1);
  /*ierr = PetscPrintf(PETSC_COMM_WORLD,"Decoupled stiffness matrix is\n");CHKERRQ(ierr);
  MatView(DK,PETSC_VIEWER_STDOUT_WORLD);*/

    ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
    
    /*ierr = MatDestroy(&Phi);CHKERRQ(ierr);*/
    
	ierr = MatDestroy(&KE);CHKERRQ(ierr);
	ierr = MatDestroy(&ME);CHKERRQ(ierr);

/* ************************************************************************** LOOP FOR MONTE CARLO ENDS******************************************************/
}
 for(i=0;i<nconv;i++) {
     average[i]=total[i]/trial;
     PetscPrintf(PETSC_COMM_WORLD,"average eigenvalues are :%f \n",sqrt(average[i])/(2*3.1415926535));
    }



   	


  /* Free work space. */



 

  ierr = MatDestroy(&M);CHKERRQ(ierr);
  

  /*ierr = PetscFinalize();*/
  ierr = SlepcFinalize();
  return 0; 
}

Reply via email to