示例#1
0
PetscErrorCode MatIsHermitian_IS(Mat A,PetscReal tol,PetscBool  *flg)
{
  PetscErrorCode ierr;
  Mat_IS         *matis = (Mat_IS*)A->data;
  PetscBool      local_sym;

  PetscFunctionBegin;
  ierr = MatIsHermitian(matis->A,tol,&local_sym);CHKERRQ(ierr);
  ierr = MPIU_Allreduce(&local_sym,flg,1,MPIU_BOOL,MPI_LAND,PetscObjectComm((PetscObject)A));CHKERRQ(ierr);
  PetscFunctionReturn(0);
}
int main( int argc, char **argv )
{
	Mat hmat,smat;
	PetscInt n=0,row,col, nev;
	PetscScalar number;	
	PetscViewer view;
	PetscBool flag;
	int ierr,i;
	char path[PETSC_MAX_PATH_LEN]="", temporary[PETSC_MAX_PATH_LEN]="";
	char infilename[PETSC_MAX_PATH_LEN]="", outfilename[PETSC_MAX_PATH_LEN]="";
	
	SlepcInitialize(&argc,&argv,(char*)0,help);
	
	ierr = PetscOptionsGetString(PETSC_NULL,"-in",infilename,PETSC_MAX_PATH_LEN-1,PETSC_NULL);CHKERRQ(ierr);
	ierr = PetscOptionsGetString(PETSC_NULL,"-out",outfilename,PETSC_MAX_PATH_LEN-1,PETSC_NULL);CHKERRQ(ierr);
	ierr = PetscOptionsGetInt(PETSC_NULL,"-n",&n,PETSC_NULL);CHKERRQ(ierr);
	
	ierr = PetscGetWorkingDirectory(path,PETSC_MAX_PATH_LEN);
	
	if ( strcmp(infilename, "") == 0 ||
		 strcmp(outfilename, "") == 0 ||
		 n == 0 ){
		SETERRQ(PETSC_COMM_WORLD,1,"Error in parameterlist.\nExample call: ./convertToPETScBin -in matrix.hmat -out matrix.dat -n 1912");			
	}
	
//	number = 2.0 + 3.0 * PETSC_i;	
//	PetscPrintf(PETSC_COMM_WORLD,"number: %g i%g\n", number);
//  std::cout << number
	PetscPrintf(PETSC_COMM_WORLD,"processing %s into %s\n", infilename, outfilename);
	
	ierr = MatCreateSeqAIJ(PETSC_COMM_WORLD,n,n,n,PETSC_NULL,&hmat);

	FILE *file;
	double real, imag;
	PetscScalar complex;
	PetscScalar myreal;
	
	strcat(temporary, path); strcat(temporary, "/"); strcat(temporary, infilename); strcpy(infilename, temporary);
	
	ierr   = PetscFOpen(PETSC_COMM_SELF,infilename,"r",&file);CHKERRQ(ierr);

	while ( fscanf(file,"%d %d %le %le\n",&row,&col,(double*)&real, (double*)&imag) != EOF ){
		row = row - 1; col = col -1; // adjustment
		
		if ( row == col ){
			complex = real /*+ imag*PETSC_i*/;
			ierr = MatSetValues(hmat,1,&row,1,&col,&complex,INSERT_VALUES);CHKERRQ(ierr);
		}else{
			complex = real /*+ imag*PETSC_i */;
			ierr = MatSetValues(hmat,1,&row,1,&col,&complex,INSERT_VALUES);CHKERRQ(ierr);
			complex = real /*- imag*PETSC_i */;
			ierr = MatSetValues(hmat,1,&col,1,&row,&complex,INSERT_VALUES);CHKERRQ(ierr);			
		}
			
	}
	
	fclose(file);
	ierr = MatAssemblyBegin(hmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
    ierr = MatAssemblyEnd(hmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);

	ierr = MatIsHermitian(hmat,0.00000000000001,&flag); CHKERRQ(ierr);
	if ( !flag ){
		SETERRQ(PETSC_COMM_WORLD,1,"Error. Output matrix is not hermitian.");
	}
	
// writing
	strcpy(temporary,"");
	strcat(temporary, path); strcat(temporary, "/"); strcat(temporary, outfilename); strcpy(outfilename, temporary);
	
	ierr = PetscViewerBinaryOpen(PETSC_COMM_SELF,outfilename,FILE_MODE_WRITE,&view);CHKERRQ(ierr);
	ierr = MatView(hmat,view);CHKERRQ(ierr);
	
	ierr = PetscViewersDestroy(&view);
	
	ierr = SlepcFinalize();CHKERRQ(ierr);
	return 0;
}