int main(void){ FILE *grid, *file, *ufile, *rfile, *Qfile, *sfile; float *g1, *g2, *g3, *v1, *v2, *v3; float a[9], w[3], S, density; double u[3]={0}; int Nx, Ny, Nz, points, lines=0, i, m, info, junk, *flag, t, j, k, index; char ch, mfile[256]; double ndotv=0; double mag=0; grid = fopen("grid.out", "r"); fscanf(grid,"Nx Ny Nz %d %d %d\n",&Nx,&Ny,&Nz); points = Nx*Ny*Nz; g1 = malloc(points*sizeof(float)); g2 = malloc(points*sizeof(float)); g3 = malloc(points*sizeof(float)); v1 = malloc(points*sizeof(float)); v2 = malloc(points*sizeof(float)); v3 = malloc(points*sizeof(float)); flag = malloc(points*sizeof(int)); printf("READ IN PARAMETERS\n"); printf("number of points: %d\n",points); // Check number of frames FILE *check; check = fopen("vel.out","r"); if(check!=NULL){ while(!feof(check)){ ch = fgetc(check); if(ch == '\n') lines++; } fclose(check); lines = lines/points; } else lines = 1; printf("Number of movie frames: %d\n", lines); for(i=0;i<points;i++){ fscanf(grid,"%f %f %f %d\n", &g1[i], &g2[i], &g3[i], &flag[i]); } fclose(grid); ufile=fopen("vel.out","r"); rfile=fopen("den.out","r"); Qfile=fopen("Q.out","r"); sfile=fopen("stress.out","r"); for(m=0;m<lines;m++){ sprintf(mfile,"movie_%05d.vtk",m); file = fopen(mfile,"w"); fprintf(file,"# vtk DataFile Version 3.0\n"); fprintf(file,"vtk output\n"); fprintf(file,"ASCII\n"); fprintf(file,"DATASET STRUCTURED_GRID\n"); fprintf(file,"DIMENSIONS\t %d\t %d\t %d\t\n",Nx,Ny,Nz); fprintf(file,"POINTS\t %d\t float\n",points); for(i=0;i<points;i++){ fprintf(file,"\t%0.2f\t%0.2f\t%0.2f\n", g1[i], g2[i], g3[i]); } fprintf(file,"\n"); fprintf(file,"POINT_DATA\t%d\n",points); fprintf(file,"SCALARS S_field float 1\n"); fprintf(file,"LOOKUP_TABLE default\n"); for(i=0;i<points;i++){ S = 1; fscanf(Qfile,"%f %f %f %f %f\n",&a[0],&a[3],&a[6],&a[4],&a[7]); a[8] = -1*(a[0] + a[4]); info = LAPACKE_ssyev(LAPACK_COL_MAJOR, 'v', 'u', 3, a, 3, w); if(info>0) { printf("failure in eigenvalue routine\n"); exit(1); } if(flag[i]==1 || flag[i]==0) S = 0.5*3*w[2]; //S = 0.5*3*w[2]; v1[i] = a[6]; v2[i] = a[7]; v3[i] = a[8]; fprintf(file,"\t%0.2f\n",S); } fprintf(file,"\n"); fprintf(file,"VECTORS directors float\n"); //for(i=0;i<points;i++){ for(i=0;i<Nx;i++){ for(j=0;j<Ny;j++){ for(k=0;k<Nz;k++){ index = i*Nx+j*Ny+k*Nx*Ny; //if(i==(int)0.5*Nx && j==(int)0.5*Ny) fprintf(file,"\t%0.2f\t%0.2f\t%0.2f\n",v1[index],v2[index],v3[index]); if(flag[i]==1 || flag[i]==0) fprintf(file,"\t%0.2f\t%0.2f\t%0.2f\n",v1[i],v2[i],v3[i]); else fprintf(file,"\t%0.2f\t%0.2f\t%0.2f\n",0.0,0.0,0.0); } } } if(ufile!=NULL){ fprintf(file,"\n"); fprintf(file,"VECTORS velocity float\n"); for(i=0;i<points;i++){ fscanf(ufile,"%lf %lf %lf\n",&u[0],&u[1],&u[2]); if(flag[i]==1 || flag[i]==0) fprintf(file,"\t%f\t%f\t%f\n",u[0],u[1],u[2]); else fprintf(file,"\t%0.2f\t%0.2f\t%0.2f\n",0.0,0.0,0.0); } } if(sfile!=NULL){ fprintf(file,"\n"); fprintf(file,"VECTORS stress float\n"); for(i=0;i<points;i++){ fscanf(sfile,"%lf %lf %lf\n",&u[0],&u[1],&u[2]); fprintf(file,"\t%f\t%f\t%f\n",u[0],u[1],u[2]); } } if(rfile!=NULL){ fprintf(file,"\n"); fprintf(file,"SCALARS density float\n"); fprintf(file,"LOOKUP_TABLE default\n"); for(i=0;i<points;i++){ fscanf(rfile,"%f\n",&density); fprintf(file,"\t%e\n",density); } } if(ufile!=NULL){ fprintf(file,"\n"); fprintf(file,"SCALARS dot float\n"); fprintf(file,"LOOKUP_TABLE default\n"); rewind(ufile); for(i=0;i<points;i++){ ndotv=2; mag = 0; fscanf(ufile,"%lf %lf %lf\n",&u[0],&u[1],&u[2]); if(flag[i]==1 || flag[i]==0){ mag = sqrt(u[0]*u[0]+u[1]*u[1]+u[2]*u[2]); mag = 1.0/mag; ndotv = mag*(v1[i]*u[0]+v2[i]*u[1]+v3[i]*u[2]); //ndotv= (v1[i]*u[0]+v2[i]*u[1]+v3[i]*u[2]); if(ndotv!=ndotv) printf("ndotv\n"); if(ndotv<0) ndotv *= -1; } fprintf(file,"\t%e\n",ndotv); } } printf("printed file %d\n",m); fclose(file); } if(ufile!=NULL) fclose(ufile); if(rfile!=NULL) fclose(rfile); if(sfile!=NULL) fclose(sfile); fclose(Qfile); free(g1); free(g2); free(g3); free(v1); free(v2); free(v3); free(flag); printf("Done!\n"); }
template <> inline int syev(const char order, const char job, const char uplo, const int N, float *A, const int LDA, float *W) { return LAPACKE_ssyev(order, job, uplo, N, A, LDA, W); }
int main (int argc,char* argv[]) { // Some needed ints. n=size of matrix, info = error checker from ssyev lapack_int n=5,info; /* Declare matrix of values! */ float atemp[n*n] = { 1.96f, -6.49f, -0.47f, -7.20f, -0.65f, 0.00f, 3.80f, -6.39f, 1.50f, -6.34f, 0.00f, 0.00f, 4.17f, -1.51f, 2.67f, 0.00f, 0.00f, 0.00f, 5.70f, 1.80f, 0.00f, 0.00f, 0.00f, 0.00f, -7.10f }; /* Copy to a vector! */ std::vector<float> a(n*n); /* Declare vector to hold eigenvalues! */ std::vector<float> w(n); /* Move data to the std::vector a*/ std::memcpy(&a[0],atemp,n*n*sizeof(float)); /* Make a working vector! */ std::vector<float> c(n*n); std::memcpy(&c[0],&a[0],n*n*sizeof(float)); /* -------------------- Eigenvalues with lapack ----------------- */ /* Example of how to use std::vector with ssyev */ info = LAPACKE_ssyev( LAPACK_ROW_MAJOR,'V','U',n,&c[0],n,&w[0] ); /* Error checking */ if (info > 0) { std::cout << "Diagonalization failed! Error code: " << info << std::endl; exit(EXIT_FAILURE); } /* -------------------------------------------------------------- */ /* Print the eigenvalues */ std::cout << "Eigenvalues: " << std::endl; for (int j=0;j<n;++j) { std::cout << w[j] << " "; } std::cout << std::endl; /* Print the eigenvectors */ std::cout << "Eigenvectors: " << std::endl; for (int i=0;i<n;++i) { for (int j=0;j<n;++j) { std::cout << c[i*n+j] << " "; } std::cout << std::endl; } std::memcpy(&c[0],&a[0],n*n*sizeof(float)); /* -------------------- Matrix inverse with Lapack ----------------- */ // Seg faults on my machine, some problem with pthreads, but you get the point lapack_int ipiv[n]; LAPACK_sgetrf(&n,&n,&c[0],&n,ipiv,&info); // Error checking if (info > 0) { std::cout << "Inversion failed! Error code: " << info << std::endl; exit(EXIT_FAILURE); } info = LAPACKE_sgetri( n,n,&c[0],n,ipiv ); // Error checking if (info > 0) { std::cout << "Inversion failed! Error code: " << info << std::endl; exit(EXIT_FAILURE); } /* ----------------------------------------------------------------- */ /* -------------------- Matrix Mult with cBlas ----------------- */ std::vector<float> b(n*n); cblas_sgemm(CblasRowMajor,CblasTrans,CblasNoTrans,n,n,1,1.0f,&a[0],n,&c[0],n,0.0f,&b[0],n); //cblas_sgemm(CblasRowMajor,CblasNoTrans,CblasNoTrans,n,n,1,1.0f,&c[0],n,&a[0],n,0.0f,&b[0],n); /* -------------------------------------------------------------- */ /* Print the eigenvectors */ std::cout << "Matrx Mult Result: " << std::endl; for (int i=0;i<n;++i) { for (int j=0;j<n;++j) { std::cout << b[i*n+j] << " "; } std::cout << std::endl; } return 0; }
int main(int argc, char *argv[]){ FILE *grid, *file, *ufile, *rfile, *Qfile, *sfile, *ifile; float *g1, *g2, *g3, *v1, *v2, *v3; float a[9], w[3], u[3], S, density; int *gi; int Nx, Ny, Nz, points, lines=0, i, m, info, junk; char ch, mfile[256]; int m_int=1, Nxc, Nyc, Nzc, pointsc, j, k, id; grid = fopen("grid.out", "r"); fscanf(grid,"Nx Ny Nz %d %d %d\n",&Nx,&Ny,&Nz); points = Nx*Ny*Nz; if (argc>1) m_int = atoi(argv[1]); printf("every %d mesh points will be printed\n",m_int); Nxc = (Nx-1)/m_int + 1; Nyc = (Ny-1)/m_int + 1; Nzc = (Nz-1)/m_int + 1; pointsc = Nxc*Nyc*Nzc; g1 = malloc(points*sizeof(float)); g2 = malloc(points*sizeof(float)); g3 = malloc(points*sizeof(float)); v1 = malloc(points*sizeof(float)); v2 = malloc(points*sizeof(float)); v3 = malloc(points*sizeof(float)); gi = malloc(points*sizeof(int)); printf("READ IN PARAMETERS\n"); printf("number of points: %d\n",points); // Check number of frames FILE *check; check = fopen("u_3d.out","r"); while(!feof(check)){ ch = fgetc(check); if(ch == '\n') lines++; } fclose(check); lines = lines/points; printf("Number of movie frames: %d\n", lines); for(i=0;i<points;i++){ fscanf(grid,"%f %f %f %d\n", &g1[i], &g2[i], &g3[i], &gi[i]); } fclose(grid); ufile=fopen("u_3d.out","r"); rfile=fopen("rho_3d.out","r"); Qfile=fopen("Q_3d.out","r"); sfile=fopen("stress_3d.out","r"); ifile=fopen("type_3d.out","r"); for(m=0;m<lines;m++){ sprintf(mfile,"movie_%05d.vtk",m); file = fopen(mfile,"w"); fprintf(file,"# vtk DataFile Version 3.0\n"); fprintf(file,"vtk output\n"); fprintf(file,"ASCII\n"); fprintf(file,"DATASET STRUCTURED_GRID\n"); fprintf(file,"DIMENSIONS\t %d\t %d\t %d\t\n", Nxc, Nyc, Nzc); fprintf(file,"POINTS\t %d\t float\n",pointsc); for (k=0; k<Nz; k+=m_int) { for (j=0; j<Ny; j+=m_int) { for (i=0; i<Nx; i+=m_int) { id = i + ( j + k*Ny)*Nx; fprintf(file,"\t%0.2f\t%0.2f\t%0.2f\n", g1[id], g2[id], g3[id]); } } } fprintf(file,"\n"); fprintf(file,"POINT_DATA\t%d\n",pointsc); if(ifile!=NULL){ fprintf(file,"SCALARS type int 1\n"); fprintf(file,"LOOKUP_TABLE default\n"); for(id=0;id<points;id++){ i = id%Nx; j =(id/Nx)%Ny; k =(id/Nx)/Ny; fscanf(ifile,"%d\n",&gi[id]); if (i%m_int==0 && j%m_int==0 && k%m_int==0) fprintf(file,"\t%d\n",gi[i]); } fprintf(file,"\n"); } // fprintf(file,"POINT_DATA\t%d\n",points); fprintf(file,"SCALARS S_field float 1\n"); fprintf(file,"LOOKUP_TABLE default\n"); for(id=0;id<points;id++){ i = id%Nx; j =(id/Nx)%Ny; k =(id/Nx)/Ny; fscanf(Qfile,"%f %f %f %f %f\n",&a[0],&a[3],&a[6],&a[4],&a[7]); if (i%m_int==0 && j%m_int==0 && k%m_int==0) { a[8] = -1*(a[0] + a[4]); info = LAPACKE_ssyev(LAPACK_COL_MAJOR, 'v', 'u', 3, a, 3, w); if(info>0) { printf("failure in eigenvalue routine\n"); exit(1); } S = 0.5*3*w[2]; v1[id] = a[6]; v2[id] = a[7]; v3[id] = a[8]; fprintf(file,"\t%lf\n",S); } } fprintf(file,"\n"); fprintf(file,"VECTORS directors float\n"); for (k=0; k<Nz; k+=m_int) { for (j=0; j<Ny; j+=m_int) { for (i=0; i<Nx; i+=m_int) { id = i + ( j + k*Ny)*Nx; fprintf(file,"\t%f\t%f\t%f\n",v1[id],v2[id],v3[id]); } } } fprintf(file,"\n"); fprintf(file,"VECTORS velocity float\n"); for(id=0;id<points;id++){ fscanf(ufile,"%f %f %f\n",&u[0],&u[1],&u[2]); i = id%Nx; j =(id/Nx)%Ny; k =(id/Nx)/Ny; if (i%m_int==0 && j%m_int==0 && k%m_int==0) fprintf(file,"\t%f\t%f\t%f\n",u[0],u[1],u[2]); } if(sfile!=NULL){ fprintf(file,"\n"); fprintf(file,"VECTORS stress float\n"); for(id=0;id<points;id++){ fscanf(sfile,"%f %f %f\n",&u[0],&u[1],&u[2]); i = id%Nx; j =(id/Nx)%Ny; k =(id/Nx)/Ny; if (i%m_int==0 && j%m_int==0 && k%m_int==0) fprintf(file,"\t%f\t%f\t%f\n",u[0],u[1],u[2]); } } if(rfile!=NULL){ fprintf(file,"\n"); fprintf(file,"SCALARS density float\n"); fprintf(file,"LOOKUP_TABLE default\n"); for(id=0;id<points;id++){ fscanf(rfile,"%f\n",&density); i = id%Nx; j =(id/Nx)%Ny; k =(id/Nx)/Ny; if (i%m_int==0 && j%m_int==0 && k%m_int==0) fprintf(file,"\t%e\n",density); } } printf("printed file %d\n",m); fclose(file); } fclose(ufile); if(rfile!=NULL)fclose(rfile); fclose(Qfile); if(sfile!=NULL)fclose(sfile); if(ifile!=NULL)fclose(ifile); free(g1); free(g2); free(g3); free(v1); free(v2); free(v3); free(gi); printf("done!\n"); return 0; }