2014-04-10 4 views
0

Gaussian CUBE 파일을 작성하는 C 또는 C++의 빠른 루틴에 관심이 있습니다. 순간 내가 가진 가장 빠른 코드는 이것이다 :C 또는 C++에서 Gaussian CUBE 파일을 빠르게 작성하는 방법

FILE* outfile; 
    outfile = fopen(recSpace[iPlane].filename.c_str(), "w"); 
    fprintf(outfile, "%s\n", " GAUSSIAN CUBE FORMAT "); 
    fprintf(outfile, "%s\n", " OUTER LOOP : X, MIDDLE LOOP : Y, INNER LOOP : Z"); 
    fprintf(outfile, "%d %12.6f %12.6f %12.6f\n", 0, x0, y0, z0); 
    fprintf(outfile, "%5d %10.3f %10.3f %10.3f\n", nx, x1, 0.0, 0.0); 
    fprintf(outfile, "%5d %10.3f %10.3f %10.3f\n", ny, 0.0, y1, 0.0); 
    fprintf(outfile, "%5d %10.3f %10.3f %10.3f\n", nz, 0.0, 0.0, z1); 
    int numbers_per_line = 0; 
    double* numbers = (double*)malloc(6 * sizeof(double)); 
    for(unsigned int k=0; k<nz; k++) 
    { 
     std::cout << "Writing layer " << k + 1 << " out of " << nz << std::endl; 
     for(unsigned int j=0; j<ny;j++) 
     { 
     numbers_per_line = 0; 
     for(unsigned int i=0; i<nx; i++) 
     { 
      int address = i * nx * ny + j * ny + k; 
      if(numbers_per_line < 6) 
      { 
      numbers[numbers_per_line] = layer[address]; 
      numbers_per_line++; 
      } 
      if(numbers_per_line == 6) 
      { 
      fprintf(outfile, "%g %g %g %g %g %g \n", numbers[0], numbers[1], numbers[2], numbers[3], numbers[4], numbers[5]); 
      numbers_per_line = 0; 
      } 
     } 
     if(numbers_per_line % 6 != 0) 
     { 
      for(int l=0; l<numbers_per_line; l++) 
      { 
      fprintf(outfile, "%g", numbers[l]); 
      } 
      fprintf(outfile, "\n"); 
     } 
     } 
    } 
    fclose(outfile); 

그것은 윈도우 7 64 비트에서 601 * 601 * 601 볼륨을 작성하는 약 5 분 정도 소요됩니다. 더 빠른 방법이 있습니까?

감사합니다.

답변

0

fprintf()이 느린 경우 파일을 mmapping하고 메모리로 직접 작업하는 것이 더 유용 할 수 있습니다. 그러나 float-> 문자열 변환 코드를 직접 작성해야합니다.

관련 문제