PageRenderTime 66ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 1ms

/leggi_bin/leggi_campi.cpp

https://github.com/ALaDyn/tools-ALaDyn
C++ | 923 lines | 758 code | 112 blank | 53 comment | 129 complexity | f82bf3dc1e9bdf97e29b111b10fd9511 MD5 | raw file
  1. #ifndef __LEGGI_CAMPI_C
  2. #define __LEGGI_CAMPI_C
  3. #include "leggi_binario_ALaDyn_fortran.h"
  4. int leggi_campi(int argc, const char** argv, Parametri * parametri)
  5. {
  6. std::string basefilename = std::string(argv[1]);
  7. std::ostringstream nomefile_bin;
  8. const int out_swap = parametri->p[SWAP];
  9. const int out_parameters = parametri->p[OUT_PARAMS];
  10. const int out_vtk = parametri->p[OUT_VTK];
  11. const int out_vtk_nostretch = parametri->p[OUT_VTK_NOSTRETCH];
  12. const int out_cutx = parametri->p[OUT_CUTX];
  13. const int out_cuty = parametri->p[OUT_CUTY];
  14. const int out_cutz = parametri->p[OUT_CUTZ];
  15. const int out_lineoutx = parametri->p[OUT_LINEOUT_X];
  16. const int out_2d = parametri->p[OUT_GRID2D];
  17. size_t npunti_x = parametri->npunti_x_ricampionati;
  18. size_t npunti_y = parametri->npunti_y_ricampionati;
  19. size_t npunti_z = parametri->npunti_z_ricampionati;
  20. size_t npunti_x_per_cpu = parametri->npx_per_cpu;
  21. size_t npunti_y_per_cpu = parametri->npy_per_cpu;
  22. size_t npunti_z_per_cpu = parametri->npz_per_cpu;
  23. int ncpu_x = parametri->ncpu_x;
  24. int ncpu_y = parametri->ncpu_y;
  25. int ncpu_z = parametri->ncpu_z;
  26. int span = parametri->span;
  27. float xminimo = parametri->xmin;
  28. float xmaximo = parametri->xmax;
  29. float yminimo = parametri->ymin;
  30. float ymaximo = parametri->ymax;
  31. float zminimo = parametri->zmin;
  32. float zmaximo = parametri->zmax;
  33. float taglio;
  34. std::vector<float> cutx, cuty, cutz;
  35. std::vector<size_t> gridIndex_cutx, gridIndex_cuty, gridIndex_cutz;
  36. int indice_multifile = 0;
  37. int N_param = 0, np_loc, npoint_loc[3] = { 0, 0, 0 }, loc_size = 0;
  38. int segnoy = 0, segnoz = 0, buff = 0;
  39. int nx = 0, ibx = 0, iby = 0, ibz = 0, model = 0, dmodel = 0, nsp = 0, lpord = 0, deord = 0, npe = 0, fvar = 0;
  40. int npe_y = 0, npe_z = 0, nxloc = 0, nx1 = 0, ny1 = 0, nyloc = 0, nz1 = 0, nzloc = 0;
  41. float tnow = 0., w0x = 0., w0y = 0., nrat = 0., a0 = 0., lam0 = 0., B0 = 0., ompe = 0.;
  42. float xt_in = 0., xt_end = 0., charge = 0., mass = 0., xmin = 0., xmax = 0., ymin = 0., ymax = 0., zmin = 0., zmax = 0.;
  43. float E0 = 0., dx = 0., dy = 0., dz = 0., xx = 0., yy = 0.;
  44. int *int_param;
  45. float *real_param;
  46. float *field, *buffer;
  47. double *x_lineout;
  48. char nomefile_parametri[MAX_LENGTH_FILENAME];
  49. char nomefile_campi[MAX_LENGTH_FILENAME];
  50. std::FILE *file_in;
  51. std::FILE *parameters;
  52. std::FILE *clean_fields;
  53. size_t fread_size = 0;
  54. if (parametri->old_fortran_bin)
  55. {
  56. nomefile_bin << basefilename << ".bin";
  57. file_in = fopen(nomefile_bin.str().c_str(), "rb");
  58. if (file_in == NULL) std::cout << "Unable to open file!" << std::endl;
  59. else std::cout << "File opened to read parameters!" << std::endl;
  60. fread_size = std::fread(&buff, sizeof(int), 1, file_in);
  61. fread_size = std::fread(&N_param, sizeof(int), 1, file_in);
  62. fread_size = std::fread(&buff, sizeof(int), 1, file_in);
  63. if (out_swap) swap_endian_i(&N_param, 1);
  64. int_param = new int[N_param];
  65. real_param = new float[N_param];
  66. // int_param=(int*)malloc(N_param*sizeof(int));
  67. // real_param=(float*)malloc(N_param*sizeof(float));
  68. fread_size = std::fread(&buff, sizeof(int), 1, file_in);
  69. fread_size = std::fread(int_param, sizeof(int), N_param, file_in);
  70. fread_size = std::fread(&buff, sizeof(int), 1, file_in);
  71. fread_size = std::fread(&buff, sizeof(int), 1, file_in);
  72. fread_size = std::fread(real_param, sizeof(float), N_param, file_in);
  73. fread_size = std::fread(&buff, sizeof(int), 1, file_in);
  74. if (out_swap) swap_endian_i(int_param, N_param);
  75. if (out_swap) swap_endian_f(real_param, N_param);
  76. fclose(file_in);
  77. npe_y = int_param[0];
  78. npe_z = int_param[1];
  79. npe = npe_y*npe_z;
  80. nx = int_param[2];
  81. nx1 = int_param[3];
  82. ny1 = int_param[4];
  83. nyloc = int_param[5];
  84. nz1 = int_param[6];
  85. nzloc = int_param[7];
  86. ibx = int_param[8];
  87. iby = int_param[9];
  88. ibz = int_param[10];
  89. model = int_param[11]; //modello di laser utilizzato
  90. dmodel = int_param[12]; //modello di condizioni iniziali
  91. nsp = int_param[13]; //numero di speci
  92. np_loc = int_param[14]; //numero di componenti dello spazio dei momenti
  93. lpord = int_param[15]; //ordine dello schema leapfrog
  94. deord = int_param[16]; //ordine derivate
  95. fvar = int_param[17];
  96. tnow = real_param[0]; //tempo dell'output
  97. xmin = real_param[1]; //estremi della griglia
  98. xmax = real_param[2]; //estremi della griglia
  99. ymin = real_param[3]; //estremi della griglia
  100. ymax = real_param[4]; //estremi della griglia
  101. zmin = real_param[5]; //estremi della griglia
  102. zmax = real_param[6]; //estremi della griglia
  103. w0x = real_param[7]; //waist del laser in x
  104. w0y = real_param[8]; //waist del laser in y
  105. nrat = real_param[9]; //n orver n critical
  106. a0 = real_param[10]; // a0 laser
  107. lam0 = real_param[11]; // lambda
  108. E0 = real_param[12]; //conversione da campi numerici a TV/m
  109. B0 = E0 + (float)(33.3);
  110. ompe = real_param[13]; //costante accoppiamento correnti campi
  111. xt_in = real_param[14]; //inizio plasma
  112. xt_end = real_param[15];
  113. charge = real_param[16]; //carica particella su carica elettrone
  114. mass = real_param[17]; //massa particelle su massa elettrone
  115. }
  116. else
  117. {
  118. std::cout << "Reading parameters from dat files!" << std::endl;
  119. npe_y = parametri->intpar[0];
  120. npe_z = parametri->intpar[1];
  121. npe = npe_y*npe_z;
  122. nx = parametri->intpar[2];
  123. nx1 = parametri->intpar[3];
  124. ny1 = parametri->intpar[4];
  125. nyloc = parametri->intpar[5];
  126. nz1 = parametri->intpar[6];
  127. nzloc = parametri->intpar[7];
  128. ibx = parametri->intpar[8];
  129. iby = parametri->intpar[9];
  130. ibz = parametri->intpar[10];
  131. model = parametri->intpar[11];
  132. dmodel = parametri->intpar[12];
  133. nsp = parametri->intpar[13];
  134. np_loc = parametri->intpar[14];
  135. lpord = parametri->intpar[15];
  136. deord = parametri->intpar[16];
  137. fvar = parametri->intpar[17];
  138. tnow = parametri->realpar[0];
  139. xmin = parametri->realpar[1];
  140. xmax = parametri->realpar[2];
  141. ymin = parametri->realpar[3];
  142. ymax = parametri->realpar[4];
  143. zmin = parametri->realpar[5];
  144. zmax = parametri->realpar[6];
  145. w0x = parametri->realpar[7];
  146. w0y = parametri->realpar[8];
  147. nrat = parametri->realpar[9];
  148. a0 = parametri->realpar[10];
  149. lam0 = parametri->realpar[11];
  150. E0 = parametri->realpar[12];
  151. B0 = E0 + (float)(100.0 / 3.0);
  152. ompe = parametri->realpar[13];
  153. xt_in = parametri->realpar[14];
  154. xt_end = parametri->realpar[15];
  155. charge = parametri->realpar[16];
  156. mass = parametri->realpar[17];
  157. }
  158. printf("=========INIZIO LETTURE==========\n");
  159. size_t prodotto = nx1*ny1*nz1;
  160. printf("nx1*ny1*nz1: %i %i %i = %.10e\n", nx1, ny1, nz1, (double)prodotto);
  161. fflush(stdout);
  162. /* Quanto segue non sarebbe necessario se vecchie e nuove variabili fossero unificate*/
  163. npunti_x = nx1;
  164. npunti_y = ny1;
  165. npunti_z = nz1;
  166. ncpu_x = 1;
  167. ncpu_y = npe_y;
  168. ncpu_z = npe_z;
  169. npunti_x_per_cpu = nx1;
  170. npunti_y_per_cpu = nyloc;
  171. npunti_z_per_cpu = nzloc;
  172. xminimo = xmin;
  173. xmaximo = xmax;
  174. yminimo = ymin;
  175. ymaximo = ymax;
  176. zminimo = zmin;
  177. zmaximo = zmax;
  178. field = new float[npunti_x*npunti_y*npunti_z];
  179. // field=(float*)malloc(npunti_x*npunti_y*npunti_z*sizeof(float));
  180. x_lineout = new double[npunti_x];
  181. if (!parametri->nuovi_dati_su_griglia)
  182. {
  183. nomefile_bin.str("");
  184. nomefile_bin << basefilename << ".bin";
  185. file_in = fopen(nomefile_bin.str().c_str(), "rb");
  186. if (file_in == NULL) std::cout << "Unable to open file!" << std::endl;
  187. else std::cout << "File opened to read data!" << std::endl;
  188. fread_size = std::fread(&buff, sizeof(int), 1, file_in);
  189. fread_size = std::fread(&N_param, sizeof(int), 1, file_in);
  190. fread_size = std::fread(&buff, sizeof(int), 1, file_in);
  191. if (out_swap) swap_endian_i(&N_param, 1);
  192. int_param = new int[N_param];
  193. real_param = new float[N_param];
  194. fread_size = std::fread(&buff, sizeof(int), 1, file_in);
  195. fread_size = std::fread(int_param, sizeof(int), N_param, file_in);
  196. fread_size = std::fread(&buff, sizeof(int), 1, file_in);
  197. fread_size = std::fread(&buff, sizeof(int), 1, file_in);
  198. fread_size = std::fread(real_param, sizeof(float), N_param, file_in);
  199. fread_size = std::fread(&buff, sizeof(int), 1, file_in);
  200. for (int ipz = 0; ipz < ncpu_z; ipz++)
  201. {
  202. segnoy = 0;
  203. for (int ipy = 0; ipy < ncpu_y; ipy++)
  204. {
  205. fread_size = std::fread(&buff, sizeof(int), 1, file_in);
  206. fread_size = std::fread(npoint_loc, sizeof(int), 3, file_in);
  207. fread_size = std::fread(&buff, sizeof(int), 1, file_in);
  208. if (out_swap) swap_endian_i(npoint_loc, 3);
  209. loc_size = npoint_loc[0] * npoint_loc[1] * npoint_loc[2];
  210. nxloc = npoint_loc[0]; // ma non dovrebbero essere gia' noti? possono variare da cpu a cpu? non credo...
  211. nyloc = npoint_loc[1]; // comunque a questo punto lascio i "vecchi" nxloc, nyloc ed nzloc, in attesa di rimuoverli in futuro con le versioni aggiornate
  212. nzloc = npoint_loc[2]; // che leggono dal binario se necessario oppure dal dat allegato per i nuovi
  213. #ifdef ENABLE_DEBUG
  214. printf("processore ipz=%i/%i ipy=%i/%i segnoz=%i segnoy=%i\n",ipz,npe_z, ipy,npe_y,segnoz,segnoy );
  215. #else
  216. printf("processore ipz=%i/%i ipy=%i/%i segnoz=%i segnoy=%i\r", ipz, npe_z, ipy, npe_y, segnoz, segnoy);
  217. #endif
  218. fflush(stdout);
  219. buffer = new float[loc_size];
  220. //buffer=(float*)malloc(loc_size*sizeof(float));
  221. fread_size = std::fread(&buff, sizeof(int), 1, file_in);
  222. fread_size = std::fread(buffer, sizeof(float), loc_size, file_in);
  223. fread_size = std::fread(&buff, sizeof(int), 1, file_in);
  224. if (out_swap) swap_endian_f(buffer, loc_size);
  225. for (size_t k = 0; k < nzloc; k++)
  226. for (size_t j = 0; j < nyloc; j++)
  227. for (size_t i = 0; i < nxloc; i++)
  228. field[i + (j + segnoy)*npunti_x + (k + segnoz)*npunti_x*npunti_y] = buffer[i + j*nxloc + k*nxloc*nyloc];
  229. segnoy += nyloc;
  230. delete[] buffer;
  231. buffer = NULL;
  232. }
  233. segnoz += nzloc;
  234. }
  235. // leggiamo ora le coordinate dei punti di griglia, presenti solo nelle versioni che possono prevedere griglia stretchata e che ancora non la scrivevano nel .dat
  236. // se presenti, sovrascrivono quelle lette o precostruite (se non trovate nel file .dat) dalle routine dei parametri
  237. fread_size = std::fread(&buff, sizeof(int), 1, file_in); // facciamo il test sul buffer Fortran della prima coordinata;
  238. // se esiste, non e' necessario tornare indietro perche' il buffer fortran che precede i dati non e' di alcun interesse
  239. if (!std::feof(file_in))
  240. {
  241. float *x_coordinates, *y_coordinates, *z_coordinates;
  242. x_coordinates = new float[npunti_x];
  243. y_coordinates = new float[npunti_y];
  244. z_coordinates = new float[npunti_z];
  245. fread_size = std::fread(x_coordinates, sizeof(float), npunti_x, file_in);
  246. fread_size = std::fread(&buff, sizeof(int), 1, file_in);
  247. fread_size = std::fread(&buff, sizeof(int), 1, file_in);
  248. fread_size = std::fread(y_coordinates, sizeof(float), npunti_y, file_in);
  249. fread_size = std::fread(&buff, sizeof(int), 1, file_in);
  250. fread_size = std::fread(&buff, sizeof(int), 1, file_in);
  251. fread_size = std::fread(z_coordinates, sizeof(float), npunti_z, file_in);
  252. fread_size = std::fread(&buff, sizeof(int), 1, file_in);
  253. if (out_swap)
  254. {
  255. swap_endian_f(x_coordinates, npunti_x);
  256. swap_endian_f(y_coordinates, npunti_y);
  257. swap_endian_f(z_coordinates, npunti_z);
  258. }
  259. parametri->xcoord.resize(npunti_x, 0);
  260. parametri->ycoord.resize(npunti_y, 0);
  261. parametri->zcoord.resize(npunti_z, 0);
  262. for (int i = 0; i < npunti_x; i++)
  263. parametri->xcoord[i] = x_coordinates[i];
  264. for (int i = 0; i < npunti_y; i++)
  265. parametri->ycoord[i] = y_coordinates[i];
  266. for (int i = 0; i < npunti_z; i++)
  267. parametri->zcoord[i] = z_coordinates[i];
  268. }
  269. else parametri->stretched_grid = false;
  270. printf("=========FINE LETTURE==========\n");
  271. fflush(stdout);
  272. }
  273. else
  274. {
  275. if (!parametri->multifile)
  276. {
  277. nomefile_bin.str("");
  278. nomefile_bin << std::string(argv[1]) << ".bin";
  279. file_in = fopen(nomefile_bin.str().c_str(), "rb");
  280. if (file_in == NULL) std::cout << "Unable to open file!" << std::endl;
  281. else std::cout << "File opened to read data!" << std::endl;
  282. int header_size = 3;
  283. int * header = new int[header_size];
  284. for (int ipz = 0; ipz < ncpu_z; ipz++)
  285. {
  286. segnoy = 0;
  287. for (int ipy = 0; ipy < ncpu_y; ipy++)
  288. {
  289. fread_size = std::fread(header, sizeof(int), header_size, file_in);
  290. if (out_swap) swap_endian_i(header, header_size);
  291. loc_size = header[0] * header[1] * header[2];
  292. nxloc = header[0];
  293. nyloc = header[1];
  294. nzloc = header[2];
  295. #ifdef ENABLE_DEBUG
  296. printf("file %i, processore ipy=%i/%i, reading %i elements\n", indice_multifile, ipy, npe_y, loc_size);
  297. #else
  298. printf("file %i, processore ipy=%i/%i\r", indice_multifile, ipy, npe_y);
  299. #endif
  300. fflush(stdout);
  301. buffer = new float[loc_size];
  302. fread_size = std::fread(buffer, sizeof(float), loc_size, file_in);
  303. if (out_swap) swap_endian_f(buffer, loc_size);
  304. for (size_t k = 0; k < nzloc; k++)
  305. for (size_t j = 0; j < nyloc; j++)
  306. for (size_t i = 0; i < nxloc; i++)
  307. field[i + (j + segnoy)*npunti_x + (k + segnoz)*npunti_x*npunti_y] = buffer[i + j*nxloc + k*nxloc*nyloc];
  308. segnoy += nyloc;
  309. delete[] buffer;
  310. buffer = NULL;
  311. }
  312. segnoz += nzloc;
  313. }
  314. printf("=========FINE LETTURE==========\n");
  315. fflush(stdout);
  316. }
  317. else
  318. {
  319. int header_size = 3;
  320. int * header = new int[header_size];
  321. while (1)
  322. {
  323. nomefile_bin.str("");
  324. nomefile_bin << std::string(argv[1]) << "_" << std::setfill('0') << std::setw(3) << indice_multifile << ".bin";
  325. file_in = fopen(nomefile_bin.str().c_str(), "rb");
  326. if (file_in == NULL)
  327. {
  328. std::cout << "End of files!" << std::endl;
  329. break;
  330. }
  331. else std::cout << "Opened file #" << indice_multifile << " to read data!" << std::endl;
  332. segnoy = 0;
  333. for (int ipy = 0; ipy < ncpu_y; ipy++)
  334. {
  335. fread_size = std::fread(header, sizeof(int), header_size, file_in);
  336. if (out_swap) swap_endian_i(header, header_size);
  337. loc_size = header[0] * header[1] * header[2];
  338. nxloc = header[0];
  339. nyloc = header[1];
  340. nzloc = header[2];
  341. #ifdef ENABLE_DEBUG
  342. printf("file %i, processore ipy=%i/%i, reading %i elements\n", indice_multifile, ipy, npe_y, loc_size);
  343. #else
  344. printf("file %i, processore ipy=%i/%i\r", indice_multifile, ipy, npe_y);
  345. #endif
  346. fflush(stdout);
  347. buffer = new float[loc_size];
  348. fread_size = std::fread(buffer, sizeof(float), loc_size, file_in);
  349. if (out_swap) swap_endian_f(buffer, loc_size);
  350. for (size_t k = 0; k < nzloc; k++)
  351. for (size_t j = 0; j < nyloc; j++)
  352. for (size_t i = 0; i < nxloc; i++)
  353. field[i + (j + segnoy)*npunti_x + (k + segnoz)*npunti_x*npunti_y] = buffer[i + j*nxloc + k*nxloc*nyloc];
  354. segnoy += nyloc;
  355. delete[] buffer;
  356. buffer = NULL;
  357. }
  358. segnoz += nzloc;
  359. indice_multifile++;
  360. fclose(file_in);
  361. }
  362. printf("=========FINE LETTURE==========\n");
  363. fflush(stdout);
  364. }
  365. }
  366. if (npunti_z == 1 && out_2d)
  367. {
  368. printf("\nScrittura file gnuplot 2D\n");
  369. sprintf(nomefile_campi, "%s.txt", argv[1]);
  370. clean_fields = fopen(nomefile_campi, "w");
  371. printf("\nWriting the fields file 2D (not vtk)\n");
  372. //output per gnuplot (x:y:valore) compatibile con programmino passe_par_tout togliendo i #
  373. fprintf(clean_fields, "#%lu\n#%lu\n#%lu\n", npunti_x, npunti_y, npunti_z);
  374. fprintf(clean_fields, "#%f %f\n#%f %f\n", xmin, ymin, xmax, ymax);
  375. for (int j = 0; j < npunti_y; j++)
  376. {
  377. for (int i = 0; i < npunti_x; i++)
  378. {
  379. xx = parametri->xcoord[i];//xmin+dx*i;
  380. yy = parametri->ycoord[j];//ymin+dy*j;
  381. fprintf(clean_fields, "%.4g %.4g %.4g\n", xx, yy, field[i + j*npunti_x]);
  382. }
  383. }
  384. fclose(clean_fields);
  385. }
  386. if (npunti_z == 1 && out_lineoutx)
  387. {
  388. int myj;
  389. printf("\nScrittura lineout 1D\n");
  390. sprintf(nomefile_campi, "%s_lineout.txt", argv[1]);
  391. clean_fields = fopen(nomefile_campi, "w");
  392. printf("\nWriting the lineout file 1D (not vtk)\n");
  393. for (int i = 0; i < npunti_x; i++) x_lineout[i] = 0;
  394. for (int j = 0; j < npunti_y; j++)
  395. {
  396. if (parametri->ycoord[j] >= 0)
  397. {
  398. myj = j;
  399. break;
  400. }
  401. }
  402. fprintf(clean_fields, "#");
  403. for (int j = myj - span; j < (myj + span + 1); j++)
  404. {
  405. fprintf(clean_fields, "%.4g\t", parametri->ycoord[j]);
  406. for (int i = 0; i < npunti_x; i++)
  407. {
  408. x_lineout[i] += field[i + j*npunti_x] / (2 * span + 1.0);
  409. }
  410. }
  411. fprintf(clean_fields, "\n");
  412. for (int i = 0; i < npunti_x; i++)
  413. {
  414. xx = parametri->xcoord[i];//xmin+dx*i;
  415. fprintf(clean_fields, "%.4g %.4g\n", xx, x_lineout[i]);
  416. }
  417. fclose(clean_fields);
  418. }
  419. if (npunti_z > 1 && out_lineoutx)
  420. {
  421. int myj;
  422. printf("\nScrittura lineout 1D\n");
  423. sprintf(nomefile_campi, "%s_lineout.txt", argv[1]);
  424. clean_fields = fopen(nomefile_campi, "w");
  425. printf("\nWriting the lineout file 1D (not vtk)\n");
  426. for (int i = 0; i < npunti_x; i++)
  427. x_lineout[i] = 0;
  428. for (int j = 0; j < npunti_y; j++)
  429. {
  430. if (parametri->ycoord[j] >= 0)
  431. {
  432. myj = j;
  433. break;
  434. }
  435. }
  436. fprintf(clean_fields, "#");
  437. for (size_t k = myj - span; k < (myj + span + 1); k++)
  438. {
  439. fprintf(clean_fields, "%.4g\t", parametri->zcoord[k]);
  440. for (size_t j = myj - span; j < (myj + span + 1); j++)
  441. {
  442. for (size_t i = 0; i < npunti_x; i++)
  443. {
  444. x_lineout[i] += field[i + j*npunti_x + k*npunti_x*npunti_y] / ((2 * span + 1.0)*(2 * span + 1.0));
  445. }
  446. }
  447. }
  448. fprintf(clean_fields, "\n");
  449. for (int i = 0; i < npunti_x; i++)
  450. {
  451. xx = parametri->xcoord[i];//xmin+dx*i;
  452. fprintf(clean_fields, "%.4g %.4g\n", xx, x_lineout[i]);
  453. }
  454. fclose(clean_fields);
  455. }
  456. if (npunti_z > 1 && out_cutz)
  457. {
  458. if (parametri->posizioni_taglio_griglia_z.size() == 0)
  459. {
  460. taglio = parametri->zcoord[npunti_z / 2];
  461. cutz.push_back(taglio);
  462. gridIndex_cutz.push_back(npunti_z / 2);
  463. }
  464. else
  465. {
  466. taglio = zminimo;
  467. int i = 0;
  468. for (size_t j = 0; j < parametri->posizioni_taglio_griglia_z.size(); j++)
  469. {
  470. while (taglio < parametri->posizioni_taglio_griglia_z.at(j)) taglio = parametri->zcoord[i], i++;
  471. cutz.push_back(taglio);
  472. gridIndex_cutz.push_back(i - 1);
  473. i = 0;
  474. }
  475. }
  476. for (size_t n = 0; n < cutz.size(); n++)
  477. {
  478. sprintf(nomefile_campi, "%s_cutz_%g.txt", argv[1], cutz[n]);
  479. printf("\nScrittura file gnuplot taglio z=%g\n", cutz[n]);
  480. clean_fields = fopen(nomefile_campi, "wb");
  481. printf("\nWriting the fields file 2D (not vtk)\n");
  482. //output per gnuplot (x:y:valore) compatibile con programmino passe_par_tout togliendo i #
  483. fprintf(clean_fields, "# 2D cut at z=%g\n", cutz[n]);
  484. fprintf(clean_fields, "# %lu\n#%lu\n#%i\n", npunti_x, npunti_y, 1);
  485. fprintf(clean_fields, "#%f %f\n#%f %f\n", xmin, ymin, xmax, ymax);
  486. size_t k = gridIndex_cutz[n];
  487. for (size_t j = 0; j < npunti_y; j++)
  488. {
  489. for (size_t i = 0; i < npunti_x; i++)
  490. {
  491. xx = parametri->xcoord[i];//xx=xmin+dx*i;
  492. yy = parametri->ycoord[j];//yy=ymin+dy*j;
  493. fprintf(clean_fields, "%.4g %.4g %.4g\n", xx, yy, field[i + j*npunti_x + k*npunti_x*npunti_y]);
  494. }
  495. }
  496. fclose(clean_fields);
  497. }
  498. }
  499. if (npunti_z > 1 && out_cuty)
  500. {
  501. if (parametri->posizioni_taglio_griglia_y.size() == 0)
  502. {
  503. taglio = parametri->ycoord[npunti_y / 2];
  504. cuty.push_back(taglio);
  505. gridIndex_cuty.push_back(npunti_y / 2);
  506. }
  507. else
  508. {
  509. taglio = yminimo;
  510. int i = 0;
  511. for (size_t j = 0; j < parametri->posizioni_taglio_griglia_y.size(); j++)
  512. {
  513. while (taglio < parametri->posizioni_taglio_griglia_y.at(j)) taglio = parametri->ycoord[i], i++;
  514. cuty.push_back(taglio);
  515. gridIndex_cuty.push_back(i - 1);
  516. i = 0;
  517. }
  518. }
  519. for (size_t n = 0; n < cuty.size(); n++)
  520. {
  521. sprintf(nomefile_campi, "%s_cuty_%g.txt", argv[1], cuty[n]);
  522. printf("\nScrittura file gnuplot taglio y=%g\n", cuty[n]);
  523. clean_fields = fopen(nomefile_campi, "wb");
  524. printf("\nWriting the fields file 2D (not vtk)\n");
  525. //output per gnuplot (x:y:valore) compatibile con programmino passe_par_tout togliendo i #
  526. fprintf(clean_fields, "# 2D cut at y=%g\n", cuty[n]);
  527. fprintf(clean_fields, "# %lu\n#%lu\n#%i\n", npunti_x, npunti_z, 1);
  528. fprintf(clean_fields, "#%f %f\n#%f %f\n", xmin, zmin, xmax, zmax);
  529. size_t j = gridIndex_cuty[n];
  530. for (size_t k = 0; k < npunti_z; k++)
  531. {
  532. for (size_t i = 0; i < npunti_x; i++)
  533. {
  534. xx = parametri->xcoord[i];//xx=xmin+dx*i;
  535. yy = parametri->ycoord[k];//yy=ymin+dy*j;
  536. fprintf(clean_fields, "%.4g %.4g %.4g\n", xx, yy, field[i + j*npunti_x + k*npunti_x*npunti_y]);
  537. }
  538. }
  539. fclose(clean_fields);
  540. }
  541. }
  542. if (npunti_z > 1 && out_cutx)
  543. {
  544. if (parametri->posizioni_taglio_griglia_x.size() == 0)
  545. {
  546. taglio = parametri->xcoord[npunti_x / 2];
  547. cutx.push_back(taglio);
  548. gridIndex_cutx.push_back(npunti_x / 2);
  549. }
  550. else
  551. {
  552. taglio = xminimo;
  553. int i = 0;
  554. for (size_t j = 0; j < parametri->posizioni_taglio_griglia_x.size(); j++)
  555. {
  556. while (taglio < parametri->posizioni_taglio_griglia_x.at(j)) taglio = parametri->xcoord[i], i++;
  557. cutx.push_back(taglio);
  558. gridIndex_cutx.push_back(i - 1);
  559. i = 0;
  560. }
  561. }
  562. for (size_t n = 0; n < cutx.size(); n++)
  563. {
  564. sprintf(nomefile_campi, "%s_cutx_%g.txt", argv[1], cutx[n]);
  565. printf("\nScrittura file gnuplot taglio x=%g\n", cutx[n]);
  566. clean_fields = fopen(nomefile_campi, "wb");
  567. printf("\nWriting the fields file 2D (not vtk)\n");
  568. //output per gnuplot (x:y:valore) compatibile con programmino passe_par_tout togliendo i #
  569. fprintf(clean_fields, "# 2D cut at x=%g\n", cutx[n]);
  570. fprintf(clean_fields, "# %lu\n#%lu\n#%i\n", npunti_y, npunti_z, 1);
  571. fprintf(clean_fields, "#%f %f\n#%f %f\n", ymin, zmin, ymax, zmax);
  572. size_t i = gridIndex_cutx[n];
  573. for (size_t k = 0; k < npunti_z; k++)
  574. {
  575. for (size_t j = 0; j < npunti_y; j++)
  576. {
  577. xx = parametri->ycoord[j];//xx=xmin+dx*i;
  578. yy = parametri->zcoord[k];//yy=ymin+dy*j;
  579. fprintf(clean_fields, "%.4g %.4g %.4g\n", xx, yy, field[i + j*npunti_x + k*npunti_x*npunti_y]);
  580. }
  581. }
  582. fclose(clean_fields);
  583. }
  584. }
  585. if (out_vtk)
  586. {
  587. printf("%lu\nScrittura vtk\n\n", (unsigned long)fread_size);
  588. float *x_coordinates, *y_coordinates, *z_coordinates;
  589. x_coordinates = new float[npunti_x];
  590. y_coordinates = new float[npunti_y];
  591. z_coordinates = new float[npunti_z];
  592. for (size_t i = 0; i < npunti_x; i++)
  593. x_coordinates[i] = parametri->xcoord[i];
  594. for (size_t i = 0; i < npunti_y; i++)
  595. y_coordinates[i] = parametri->ycoord[i];
  596. for (size_t i = 0; i < npunti_z; i++)
  597. z_coordinates[i] = parametri->zcoord[i];
  598. if (parametri->endian_machine == 0)
  599. {
  600. swap_endian_f(field, npunti_x*npunti_y*npunti_z);
  601. swap_endian_f(x_coordinates, npunti_x);
  602. swap_endian_f(y_coordinates, npunti_y);
  603. swap_endian_f(z_coordinates, npunti_z);
  604. }
  605. //////// DATASET UNSTRUCTURED_GRID VERSION ////////
  606. sprintf(nomefile_campi, "%s.vtk", argv[1]);
  607. clean_fields = fopen(nomefile_campi, "w");
  608. printf("\nWriting the fields file\n");
  609. fprintf(clean_fields, "# vtk DataFile Version 2.0\n");
  610. fprintf(clean_fields, "titolo mio\n");
  611. fprintf(clean_fields, "BINARY\n");
  612. fprintf(clean_fields, "DATASET UNSTRUCTURED_GRID\n");
  613. fprintf(clean_fields, "POINTS %lu float\n", npunti_x*((size_t)npunti_y)*npunti_z);
  614. float rr[3];
  615. for (size_t k = 0; k < npunti_z; k++)
  616. {
  617. rr[2] = z_coordinates[k];
  618. for (size_t j = 0; j < npunti_y; j++)
  619. {
  620. rr[1] = y_coordinates[j];
  621. for (size_t i = 0; i < npunti_x; i++)
  622. {
  623. rr[0] = x_coordinates[i];
  624. fwrite((void*)rr, sizeof(float), 3, clean_fields);
  625. }
  626. }
  627. }
  628. fprintf(clean_fields, "POINT_DATA %lu\n", npunti_x*npunti_y*npunti_z);
  629. fprintf(clean_fields, "SCALARS %s float 1\n", parametri->support_label);
  630. fprintf(clean_fields, "LOOKUP_TABLE default\n");
  631. fwrite((void*)field, sizeof(float), npunti_x*((size_t)npunti_y)*npunti_z, clean_fields);
  632. fclose(clean_fields);
  633. }
  634. if (out_vtk_nostretch)
  635. {
  636. printf("%lu\nScrittura vtk della parte non stretchata della griglia\n\n", (unsigned long)fread_size);
  637. int inizio_punti_non_stretchati_x, inizio_punti_non_stretchati_y, inizio_punti_non_stretchati_z;
  638. int fine_punti_non_stretchati_x, fine_punti_non_stretchati_y, fine_punti_non_stretchati_z;
  639. size_t npunti_non_stretchati_x, npunti_non_stretchati_y, npunti_non_stretchati_z;
  640. if (parametri->stretched_grid)
  641. {
  642. if (parametri->stretched_along_x) inizio_punti_non_stretchati_x = (int)(npunti_x / 6.0);
  643. else inizio_punti_non_stretchati_x = 0;
  644. inizio_punti_non_stretchati_y = (int)(npunti_y / 6.0);
  645. inizio_punti_non_stretchati_z = (int)(npunti_z / 6.0);
  646. if (parametri->stretched_along_x) fine_punti_non_stretchati_x = (int)(npunti_x*5.0 / 6.0);
  647. else fine_punti_non_stretchati_x = (int)(npunti_x);
  648. fine_punti_non_stretchati_y = (int)(npunti_y*5.0 / 6.0);
  649. fine_punti_non_stretchati_z = (int)(npunti_z*5.0 / 6.0);
  650. npunti_non_stretchati_x = (size_t)(fine_punti_non_stretchati_x - inizio_punti_non_stretchati_x);
  651. npunti_non_stretchati_y = (size_t)(fine_punti_non_stretchati_y - inizio_punti_non_stretchati_y);
  652. npunti_non_stretchati_z = (size_t)(fine_punti_non_stretchati_z - inizio_punti_non_stretchati_z);
  653. }
  654. else
  655. {
  656. fine_punti_non_stretchati_x = (int)npunti_x;
  657. npunti_non_stretchati_x = npunti_x;
  658. fine_punti_non_stretchati_y = (int)npunti_y;
  659. npunti_non_stretchati_y = npunti_y;
  660. fine_punti_non_stretchati_z = (int)npunti_z;
  661. npunti_non_stretchati_z = npunti_z;
  662. inizio_punti_non_stretchati_x = inizio_punti_non_stretchati_y = inizio_punti_non_stretchati_z = 0;
  663. }
  664. float * field_non_stretchato = new float[npunti_non_stretchati_x*npunti_non_stretchati_y*npunti_non_stretchati_z];
  665. int a = 0, b = 0, c = 0;
  666. for (int k = inizio_punti_non_stretchati_z; k < fine_punti_non_stretchati_z; k++)
  667. {
  668. c = k - inizio_punti_non_stretchati_z;
  669. for (int j = inizio_punti_non_stretchati_y; j < fine_punti_non_stretchati_y; j++)
  670. {
  671. b = j - inizio_punti_non_stretchati_y;
  672. for (int i = inizio_punti_non_stretchati_x; i < fine_punti_non_stretchati_x; i++)
  673. {
  674. a = i - inizio_punti_non_stretchati_x;
  675. field_non_stretchato[a + b*npunti_non_stretchati_x + c*npunti_non_stretchati_x*npunti_non_stretchati_y] = field[i + j*npunti_x + k*npunti_x*npunti_y];
  676. }
  677. }
  678. }
  679. if (parametri->endian_machine == 0) swap_endian_f(field_non_stretchato, npunti_non_stretchati_x*npunti_non_stretchati_y*npunti_non_stretchati_z);
  680. //////// DATASET STRUCTURED_POINTS VERSION ////////
  681. float xmin_non_stretchato = parametri->xcoord[inizio_punti_non_stretchati_x];
  682. // float xmax_non_stretchato = parametri->xcoord[fine_punti_non_stretchati_x];
  683. float ymin_non_stretchato = parametri->ycoord[inizio_punti_non_stretchati_y];
  684. // float ymax_non_stretchato = parametri->ycoord[fine_punti_non_stretchati_y];
  685. float zmin_non_stretchato = parametri->zcoord[inizio_punti_non_stretchati_z];
  686. // float zmax_non_stretchato = parametri->zcoord[fine_punti_non_stretchati_z];
  687. dx = parametri->xcoord[npunti_x / 2] - parametri->xcoord[npunti_x / 2 - 1];
  688. dy = parametri->ycoord[npunti_y / 2] - parametri->ycoord[npunti_y / 2 - 1];
  689. dz = parametri->zcoord[npunti_z / 2] - parametri->zcoord[npunti_z / 2 - 1];
  690. sprintf(nomefile_campi, "%s_nostretch.vtk", argv[1]);
  691. clean_fields = fopen(nomefile_campi, "wb");
  692. printf("\nWriting the fields file\n");
  693. fprintf(clean_fields, "# vtk DataFile Version 2.0\n");
  694. fprintf(clean_fields, "titolo mio\n");
  695. fprintf(clean_fields, "BINARY\n");
  696. fprintf(clean_fields, "DATASET STRUCTURED_POINTS\n");
  697. fprintf(clean_fields, "DIMENSIONS %lu %lu %lu\n", npunti_non_stretchati_x, npunti_non_stretchati_y, npunti_non_stretchati_z);
  698. fprintf(clean_fields, "ORIGIN %f %f %f\n", xmin_non_stretchato, ymin_non_stretchato, zmin_non_stretchato);
  699. fprintf(clean_fields, "SPACING %f %f %f\n", dx, dy, dz);
  700. fprintf(clean_fields, "POINT_DATA %lu\n", npunti_non_stretchati_x*npunti_non_stretchati_y*npunti_non_stretchati_z);
  701. fprintf(clean_fields, "SCALARS %s float 1\n", parametri->support_label);
  702. fprintf(clean_fields, "LOOKUP_TABLE default\n");
  703. fwrite((void*)field_non_stretchato, sizeof(float), npunti_non_stretchati_x*npunti_non_stretchati_y*npunti_non_stretchati_z, clean_fields);
  704. /******************************************************************************
  705. //////// DATASET RECTILINEAR_GRID VERSION ////////
  706. float *x_coordinates, *y_coordinates, *z_coordinates;
  707. x_coordinates=new float[npunti_non_stretchati_x];
  708. y_coordinates=new float[npunti_non_stretchati_y];
  709. z_coordinates=new float[npunti_non_stretchati_z];
  710. for (int i = inizio_punti_non_stretchati_x; i < fine_punti_non_stretchati_x; i++) x_coordinates[i] = parametri->xcoord[i];
  711. for (int i = inizio_punti_non_stretchati_y; i < fine_punti_non_stretchati_y; i++) y_coordinates[i] = parametri->ycoord[i];
  712. for (int i = inizio_punti_non_stretchati_z; i < fine_punti_non_stretchati_z; i++) z_coordinates[i] = parametri->zcoord[i];
  713. if(parametri->endian_machine == 0)
  714. {
  715. swap_endian_f(x_coordinates,npunti_non_stretchati_x);
  716. swap_endian_f(y_coordinates,npunti_non_stretchati_y);
  717. swap_endian_f(z_coordinates,npunti_non_stretchati_z);
  718. }
  719. sprintf(nomefile_campi,"%s_out.vtk",argv[1]);
  720. clean_fields=fopen(nomefile_campi, "wb");
  721. printf("\nWriting the fields file\n");
  722. fprintf(clean_fields,"# vtk DataFile Version 2.0\n");
  723. fprintf(clean_fields,"titolo mio\n");
  724. fprintf(clean_fields,"BINARY\n");
  725. fprintf(clean_fields,"DATASET RECTILINEAR_GRID\n");
  726. fprintf(clean_fields,"DIMENSIONS %i %i %i\n",npunti_non_stretchati_x, npunti_non_stretchati_y, npunti_non_stretchati_z);
  727. fprintf(clean_fields,"X_COORDINATES %i float\n",npunti_non_stretchati_x);
  728. fwrite((void*)x_coordinates,sizeof(float),npunti_non_stretchati_x,clean_fields);
  729. fprintf(clean_fields,"Y_COORDINATES %i float\n",npunti_non_stretchati_y);
  730. fwrite((void*)y_coordinates,sizeof(float),npunti_non_stretchati_y,clean_fields);
  731. fprintf(clean_fields,"Z_COORDINATES %i float\n",npunti_non_stretchati_z);
  732. fwrite((void*)z_coordinates,sizeof(float),npunti_non_stretchati_z,clean_fields);
  733. fprintf(clean_fields,"POINT_DATA %i\n",npunti_non_stretchati_x*npunti_non_stretchati_y*npunti_non_stretchati_z);
  734. fprintf(clean_fields,"SCALARS %s float 1\n",parametri->support_label);
  735. fprintf(clean_fields,"LOOKUP_TABLE default\n");
  736. fwrite((void*)field_non_stretchato,sizeof(float),npunti_non_stretchati_x*npunti_non_stretchati_y*npunti_non_stretchati_z,clean_fields);
  737. ******************************************************************************/
  738. fclose(clean_fields);
  739. }
  740. if (out_parameters)
  741. {
  742. sprintf(nomefile_parametri, "%s.parameters", argv[1]);
  743. parameters = fopen(nomefile_parametri, "w");
  744. printf("\nWriting parameters to file\n");
  745. fprintf(parameters, "interi\n");
  746. fprintf(parameters, "npe_y=%i\n", npe_y);
  747. fprintf(parameters, "npe_z=%i\n", npe_z);
  748. fprintf(parameters, "npe=%i\n", npe);
  749. fprintf(parameters, "nx=%i\n", nx);
  750. fprintf(parameters, "nx1=%i\n", nx1);
  751. fprintf(parameters, "ny1=%i\n", ny1);
  752. fprintf(parameters, "nyloc=%i\n", nyloc);
  753. fprintf(parameters, "nz1=%i\n", nz1);
  754. fprintf(parameters, "nzloc=%i\n", nzloc);
  755. fprintf(parameters, "ibx=%i\n", ibx);
  756. fprintf(parameters, "iby=%i\n", iby);
  757. fprintf(parameters, "ibz=%i\n", ibz);
  758. fprintf(parameters, "model=%i\n", model);
  759. fprintf(parameters, "dmodel=%i\n", dmodel);
  760. fprintf(parameters, "nsp=%i\n", nsp);
  761. fprintf(parameters, "np_loc=%i\n", np_loc);
  762. fprintf(parameters, "lpord=%i\n", lpord);
  763. fprintf(parameters, "deord=%i\n", deord);
  764. fprintf(parameters, "fvar=%i\n", fvar);
  765. fprintf(parameters, "========= fine interi\n");
  766. fprintf(parameters, "\n floating\n");
  767. fprintf(parameters, "tnow=%f\n", tnow);
  768. fprintf(parameters, "xmin=%f\n", xmin);
  769. fprintf(parameters, "xmax=%f\n", xmax);
  770. fprintf(parameters, "ymin=%f\n", ymin);
  771. fprintf(parameters, "ymax=%f\n", ymax);
  772. fprintf(parameters, "zmin=%f\n", zmin);
  773. fprintf(parameters, "zmax=%f\n", zmax);
  774. fprintf(parameters, "w0x=%f\n", w0x);
  775. fprintf(parameters, "w0y=%f\n", w0y);
  776. fprintf(parameters, "nrat=%f\n", nrat);
  777. fprintf(parameters, "a0=%f\n", a0);
  778. fprintf(parameters, "lam0=%f\n", lam0);
  779. fprintf(parameters, "E0=%f\n", E0);
  780. fprintf(parameters, "B0=%f\n", B0);
  781. fprintf(parameters, "ompe=%f\n", ompe);
  782. fprintf(parameters, "xt_in=%f\n", xt_in);
  783. fprintf(parameters, "xt_end=%f\n", xt_end);
  784. fprintf(parameters, "charge=%f\n", charge);
  785. fprintf(parameters, "mass=%f\n", mass);
  786. fprintf(parameters, "\n\nGrid along x axis\n");
  787. for (int i = 0; i < nx1; i++)
  788. {
  789. fprintf(parameters, "%.4g ", parametri->xcoord[i]);
  790. if (i > 0 && i % 10 == 0) fprintf(parameters, "\n");
  791. }
  792. fprintf(parameters, "\n\nGrid along y axis\n");
  793. for (int i = 0; i < ny1; i++)
  794. {
  795. fprintf(parameters, "%.4g ", parametri->ycoord[i]);
  796. if (i > 0 && i % 10 == 0) fprintf(parameters, "\n");
  797. }
  798. fprintf(parameters, "\n\nGrid along z axis\n");
  799. for (int i = 0; i < nz1; i++)
  800. {
  801. fprintf(parameters, "%.4g ", parametri->zcoord[i]);
  802. if (i > 0 && i % 10 == 0) fprintf(parameters, "\n");
  803. }
  804. fclose(parameters);
  805. }
  806. printf("%lu\nFine\n\n", (unsigned long)fread_size);
  807. return 0;
  808. }
  809. #endif