41 double a_Lx,
double a_Ly,
double a_Lz,
double a_Ox,
double a_Oy,
double a_Oz,
int a_momin,
int a_momax,
double a_kmin,
double a_kmax,
42 std::string nom_fichier,
const Domaine_IJK& splitting,
43 int a_i_offset,
int a_j_offset,
int a_k_offset
48 nproc_tot = a_nproc_tot;
57 n_lmn = (2*nl+1)*(2*nm+1)*(2*nn+1);
68 i_offset = a_i_offset;
69 j_offset = a_j_offset;
70 k_offset = a_k_offset;
74 force = set_dimensions(force,2,3,n_ijk);
76 allocate_velocity(force_, splitting, 2);
77 force_.nommer(
"FORCE_PH");
79 std::ofstream Physical_flux(nom_fichier.c_str());
82 Physical_flux <<
"-------- PHYSICAL_FORCE --------" << std::endl;
83 Physical_flux << std::endl <<
"i,j,k \t : f_x, \tf_y, \tf_z,\t";
87 std::ofstream Offset_flux(
"/volatile/FFTW/creeping_flow/creeping_flow_bis/src/offset.txt");
90 Offset_flux <<
"-------- PHYSICAL_POSITION --------" << std::endl;
91 Offset_flux << std::endl <<
"i,j,k \t : f_x, \tf_y, \tf_z,\t";
116 double t(2.*M_PI*roc/Lx);
118 for (
int k=0; k<nk; k++)
120 pos[2] = Oz + k*Lz/nk;
121 for (
int j=0; j<nj; j++)
123 pos[1] = Oy + j*Ly/nj;
124 for (
int i=0; i<ni; i++)
126 int ind_ijk = (k*nj + j)*ni + i;
127 pos[0] = Ox + i*Lx/ni;
130 force[0][0][ind_ijk] = 2*cos(t*(pos[0]-pos[2]));
131 force[0][2][ind_ijk] = 2*cos(t*(pos[0]-pos[2]));
132 force[1][0][ind_ijk] = 0.;
133 force[1][2][ind_ijk] = 0.;
136 force_[0](i,j,k) = 2*cos(t*(pos[0]-pos[2]));
137 force_[2](i,j,k) = 2*cos(t*(pos[0]-pos[2]));
159 for (
int dir = 0; dir < 3; dir++)
161 force_[dir].data() = 0.;
164 const int n_ind_mni((2*nm+1)*(2*nn+1)*1*ni);
165 const int n_ind_nij((2*nn+1)*1*ni*1*nj);
166 const int n_ind_lmn((2*nl+1)*(2*nm+1)*(2*nn+1));
168 std:: vector <double > bout_a_quart(2*3*n_ind_mni,0.);
169 std:: vector <double > bout_b_quart(2*3*n_ind_nij,0.);
171 double expo_a[2], expo_b[2], expo_c[2];
173 double dz(Lz/nk), dy(Ly/nj), dx(Lx/ni);
180 for (
int k=0; k<nk; k++)
182 pos[2] = Oz + k*Lz/nk + dz/2.;
183 for (
int j=0; j<nj; j++)
185 pos[1] = Oy + j*Ly/nj + dy/2.;
186 for (
int i=0; i<ni; i++)
188 pos[0] = Ox + i*Lx/ni + dx/2.;
189 for (
int n=0; n<2*nn; n++)
191 int ind_nij = ( (j*ni + i) * (2*nn+1) + n );
195 for(
int dir=0; dir<3; dir++)
197 int ind_RDInij((0*n_dir+dir) * n_ind_nij + ind_nij);
198 int ind_CDInij((1*n_dir+dir) * n_ind_nij + ind_nij);
199 bout_b_quart[ind_RDInij] = 0.0;
200 bout_b_quart[ind_CDInij] = 0.0;
203 double kappa_n = (- kmax + (n)*(2*kmax)/(2*nn) );
204 for (
int m=0; m<2*nm; m++)
206 int ind_mni = ((i*(2*nn+1) + n) * (2*nm+1) + m );
210 for(
int dir=0; dir<3; dir++)
212 int ind_RDImni((0*n_dir+dir) * n_ind_mni + ind_mni);
213 int ind_CDImni((1*n_dir+dir) * n_ind_mni + ind_mni);
214 bout_a_quart[ind_RDImni] = 0.0;
215 bout_a_quart[ind_CDImni] = 0.0;
218 double kappa_m = (- kmax + (m)*(2*kmax)/(2*nm));
220 for (
int l=0; l<2*nl; l++)
222 int ind_lmn = ( (n*(2*nm+1) + m) * (2*nl+1) +l);
223 double kappa_l = (- kmax + (l)*(2*kmax)/(2*nl));
225 expo_a[0] = cos(kappa_l*pos[0]);
226 expo_a[1] = sin(kappa_l*pos[0]);
228 for (
int dir=0; dir<3; dir++)
230 int ind_RDImni((0*n_dir+dir)*n_ind_mni+ind_mni);
231 int ind_RDIlmn((0*n_dir+dir)*n_ind_lmn+ind_lmn);
232 int ind_CDImni((1*n_dir+dir)*n_ind_mni+ind_mni);
233 int ind_CDIlmn((1*n_dir+dir)*n_ind_lmn+ind_lmn);
235 bout_a_quart[ind_RDImni] += 1*(coeff_force[ind_RDIlmn]*expo_a[0] - coeff_force[ind_CDIlmn]*expo_a[1]);
236 bout_a_quart[ind_CDImni] += 1*(coeff_force[ind_RDIlmn]*expo_a[1] + coeff_force[ind_CDIlmn]*expo_a[0]);
239 expo_b[0] = cos(kappa_m*pos[1]);
240 expo_b[1] = sin(kappa_m*pos[1]);
241 for (
int dir=0; dir<3; dir++)
243 int ind_RDInij((0*n_dir+dir)*n_ind_nij+ind_nij);
244 int ind_RDImni((0*n_dir+dir)*n_ind_mni+ind_mni);
245 int ind_CDInij((1*n_dir+dir)*n_ind_nij+ind_nij);
246 int ind_CDImni((1*n_dir+dir)*n_ind_mni+ind_mni);
248 bout_b_quart[ind_RDInij] += 1*(bout_a_quart[ind_RDImni]*expo_b[0] - bout_a_quart[ind_CDImni]*expo_b[1]);
249 bout_b_quart[ind_CDInij] += 1*(bout_a_quart[ind_RDImni]*expo_b[1] + bout_a_quart[ind_CDImni]*expo_b[0]);
252 expo_c[0] = cos(kappa_n*pos[2]);
253 expo_c[1] = sin(kappa_n*pos[2]);
254 for (
int dir=0; dir<3; dir++)
259 int ind_RDInij((0*n_dir+dir)*n_ind_nij+ind_nij);
260 int ind_CDInij((1*n_dir+dir)*n_ind_nij+ind_nij);
265 force_[dir](i,j,k) += 1*(bout_b_quart[ind_RDInij]*expo_c[0] - bout_b_quart[ind_CDInij]*expo_c[1]);
294 for (
int dir = 0; dir < 3; dir++)
296 force_[dir].data() = 0.;
299 int n_ind_mni((2*nm+1)*(2*nn+1)*1*ni_o);
300 int n_ind_nij((2*nn+1)*1*ni_o*1*nj_o);
301 int n_ind_lmn((2*nl+1)*(2*nm+1)*(2*nn+1));
303 std:: vector <double > bout_a_quart(2*3*n_ind_mni,0.);
304 std:: vector <double > bout_b_quart(2*3*n_ind_nij,0.);
306 double expo_a[2], expo_b[2], expo_c[2];
315 ArrOfDouble pos_x_fx, pos_y_fx, pos_z_fx;
316 build_local_coords(force_[0], pos_x_fx, pos_y_fx, pos_z_fx);
317 ArrOfDouble pos_x_fy, pos_y_fy, pos_z_fy;
318 build_local_coords(force_[1], pos_x_fy, pos_y_fy, pos_z_fy);
319 ArrOfDouble pos_x_fz, pos_y_fz, pos_z_fz;
320 build_local_coords(force_[2], pos_x_fz, pos_y_fz, pos_z_fz);
323 for (
int dir=0; dir<3; dir++)
326 for (
int m=0; m<2*nm+1; m++)
327 for (
int n=0; n<2*nn+1; n++)
328 for (
int i=0; i<ni; i++)
330 int ind_mni = ((i*(2*nn+1) + n) * (2*nm+1) + m );
333 pos[0] = pos_x_fx[i];
334 for (
int l=0; l<2*nl+1; l++)
336 int ind_lmn = ( (n*(2*nm+1) + m) * (2*nl+1) +l);
337 double kappa_l = (- kmax + (l)*(2*kmax)/(2*nl));
338 expo_a[0] = cos(kappa_l*pos[0]);
339 expo_a[1] = sin(kappa_l*pos[0]);
341 int ind_RDImni((0*n_dir+dir) * n_ind_mni + ind_mni);
342 int ind_RDIlmn((0*n_dir+dir) * n_ind_lmn + ind_lmn);
343 int ind_CDImni((1*n_dir+dir) * n_ind_mni + ind_mni);
344 int ind_CDIlmn((1*n_dir+dir) * n_ind_lmn + ind_lmn);
346 bout_a_quart[ind_RDImni] += 1*(coeff_force[ind_RDIlmn]*expo_a[0] - coeff_force[ind_CDIlmn]*expo_a[1]);
347 bout_a_quart[ind_CDImni] += 1*(coeff_force[ind_RDIlmn]*expo_a[1] + coeff_force[ind_CDIlmn]*expo_a[0]);
353 for (
int n=0; n<2*nn+1; n++)
354 for (
int i=0; i<ni; i++)
355 for (
int j=0; j<nj; j++)
357 int ind_nij = ( (j*ni_o + i) * (2*nn+1) + n );
360 pos[1] = pos_y_fy[j];
361 for (
int m=0; m<2*nm; m++)
363 int ind_mni = ((i*(2*nn+1) + n) * (2*nm+1) + m );
364 double kappa_m = (- kmax + (m)*(2*kmax)/(2*nm));
365 expo_b[0] = cos(kappa_m*pos[1]);
366 expo_b[1] = sin(kappa_m*pos[1]);
368 int ind_RDInij((0*n_dir+dir)*n_ind_nij+ind_nij);
369 int ind_RDImni((0*n_dir+dir)*n_ind_mni+ind_mni);
370 int ind_CDInij((1*n_dir+dir)*n_ind_nij+ind_nij);
371 int ind_CDImni((1*n_dir+dir)*n_ind_mni+ind_mni);
373 bout_b_quart[ind_RDInij] += 1*(bout_a_quart[ind_RDImni]*expo_b[0] - bout_a_quart[ind_CDImni]*expo_b[1]);
374 bout_b_quart[ind_CDInij] += 1*(bout_a_quart[ind_RDImni]*expo_b[1] + bout_a_quart[ind_CDImni]*expo_b[0]);
381 for (
int k=0; k<nk; k++)
382 for (
int j=0; j<nj; j++)
383 for (
int i=0; i<ni; i++)
387 pos[2] = pos_z_fz[k];
388 for (
int n=0; n<2*nn+1; n++)
390 int ind_nij = ( (j*ni_o + i) * (2*nn+1) + n );
391 double kappa_n = - kmax + (n)*(2*kmax)/(2*nn);
392 expo_c[0] = cos(kappa_n*pos[2]);
393 expo_c[1] = sin(kappa_n*pos[2]);
395 int ind_RDInij((0*n_dir+dir)*n_ind_nij+ind_nij);
396 int ind_CDInij((1*n_dir+dir)*n_ind_nij+ind_nij);
401 force_[dir](i,j,k) += 1*(bout_b_quart[ind_RDInij]*expo_c[0] - bout_b_quart[ind_CDInij]*expo_c[1]);
406 force_[dir].echange_espace_virtuel(force_[dir].ghost());
429 for (
int dir = 0; dir < 3; dir++)
431 force_[dir].data() = 0.;
434 int n_ind_mni((2*nm+1)*(2*nn+1)*1*ni_o);
435 int n_ind_nij((2*nn+1)*1*ni_o*1*nj_o);
436 int n_ind_lmn((2*nl+1)*(2*nm+1)*(2*nn+1));
438 std:: vector <double > bout_a_quart(2*3*n_ind_mni,0.);
439 std:: vector <double > bout_b_quart(2*3*n_ind_nij,0.);
441 double expo_a[2], expo_b[2], expo_c[2];
450 ArrOfDouble pos_x_fx, pos_y_fx, pos_z_fx;
451 build_local_coords(force_[0], pos_x_fx, pos_y_fx, pos_z_fx);
452 ArrOfDouble pos_x_fy, pos_y_fy, pos_z_fy;
453 build_local_coords(force_[1], pos_x_fy, pos_y_fy, pos_z_fy);
454 ArrOfDouble pos_x_fz, pos_y_fz, pos_z_fz;
455 build_local_coords(force_[2], pos_x_fz, pos_y_fz, pos_z_fz);
458 for (
int dir=0; dir<3; dir++)
461 for (
int m=0; m<2*nm+1; m++)
462 for (
int n=0; n<2*nn+1; n++)
463 for (
int i=0; i<ni; i++)
465 int ind_mni = ((i*(2*nn+1) + n) * (2*nm+1) + m );
468 pos[0] = pos_x_fx[i];
469 for (
int l=0; l<2*nl+1; l++)
471 int ind_lmn = ( (n*(2*nm+1) + m) * (2*nl+1) +l);
472 double kappa_l = (- kmax + (l)*(2*kmax)/(2*nl));
473 expo_a[0] = cos(kappa_l*(pos[0]-advection_length[0]));
474 expo_a[1] = sin(kappa_l*(pos[0]-advection_length[0]));
476 int ind_RDImni((0*n_dir+dir) * n_ind_mni + ind_mni);
477 int ind_RDIlmn((0*n_dir+dir) * n_ind_lmn + ind_lmn);
478 int ind_CDImni((1*n_dir+dir) * n_ind_mni + ind_mni);
479 int ind_CDIlmn((1*n_dir+dir) * n_ind_lmn + ind_lmn);
481 bout_a_quart[ind_RDImni] += 1*(coeff_force[ind_RDIlmn]*expo_a[0] - coeff_force[ind_CDIlmn]*expo_a[1]);
482 bout_a_quart[ind_CDImni] += 1*(coeff_force[ind_RDIlmn]*expo_a[1] + coeff_force[ind_CDIlmn]*expo_a[0]);
488 for (
int n=0; n<2*nn+1; n++)
489 for (
int i=0; i<ni; i++)
490 for (
int j=0; j<nj; j++)
492 int ind_nij = ( (j*ni_o + i) * (2*nn+1) + n );
495 pos[1] = pos_y_fy[j];
496 for (
int m=0; m<2*nm; m++)
498 int ind_mni = ((i*(2*nn+1) + n) * (2*nm+1) + m );
499 double kappa_m = (- kmax + (m)*(2*kmax)/(2*nm));
500 expo_b[0] = cos(kappa_m*(pos[1]-advection_length[1]));
501 expo_b[1] = sin(kappa_m*(pos[1]-advection_length[1]));
503 int ind_RDInij((0*n_dir+dir)*n_ind_nij+ind_nij);
504 int ind_RDImni((0*n_dir+dir)*n_ind_mni+ind_mni);
505 int ind_CDInij((1*n_dir+dir)*n_ind_nij+ind_nij);
506 int ind_CDImni((1*n_dir+dir)*n_ind_mni+ind_mni);
508 bout_b_quart[ind_RDInij] += 1*(bout_a_quart[ind_RDImni]*expo_b[0] - bout_a_quart[ind_CDImni]*expo_b[1]);
509 bout_b_quart[ind_CDInij] += 1*(bout_a_quart[ind_RDImni]*expo_b[1] + bout_a_quart[ind_CDImni]*expo_b[0]);
516 for (
int k=0; k<nk; k++)
517 for (
int j=0; j<nj; j++)
518 for (
int i=0; i<ni; i++)
522 pos[2] = pos_z_fz[k];
523 for (
int n=0; n<2*nn+1; n++)
525 int ind_nij = ( (j*ni_o + i) * (2*nn+1) + n );
526 double kappa_n = - kmax + (n)*(2*kmax)/(2*nn);
527 expo_c[0] = cos(kappa_n*(pos[2]-advection_length[2]));
528 expo_c[1] = sin(kappa_n*(pos[2]-advection_length[2]));
530 int ind_RDInij((0*n_dir+dir)*n_ind_nij+ind_nij);
531 int ind_CDInij((1*n_dir+dir)*n_ind_nij+ind_nij);
536 force_[dir](i,j,k) += 1*(bout_b_quart[ind_RDInij]*expo_c[0] - bout_b_quart[ind_CDInij]*expo_c[1]);
541 force_[dir].echange_espace_virtuel(force_[dir].ghost());
556 std::cout <<
"test in force_ph/write" << std::endl;
557 std::ofstream Physical_flux(nom_fichier_sortie.c_str(), std::ios::app);
562 Physical_flux << std::endl <<
"time : " << t << std::endl << std::endl;
567 ind = (k*nj + j)*ni + i;
568 Physical_flux << i<<
","<<j<<
","<<k<<
"\t : ";
569 Physical_flux << force[0][0][ind] <<
" + i" << force[1][0][ind]<<
", \t";
570 Physical_flux << force[0][1][ind] <<
" + i" << force[1][1][ind]<<
", \t";
571 Physical_flux << force[0][2][ind] <<
" + i" << force[1][2][ind]<<
", \t";
572 Physical_flux << std::endl;
580 std::ofstream Offset_flux(
"/volatile/FFTW/creeping_flow/creeping_flow_bis/src/offset.txt", std::ios::app);
584 Offset_flux << std::endl <<
"of_i,of_j,of_k,i,j,k,x,y,z"<< std::endl;
585 double dz(Lz/nk), dy(Ly/nj), dx(Lx/ni);
586 for (
int k=0; k<nk; k++)
588 double z = Oz + k*Lz/nk + dz/2.;
589 for (
int j=0; j<nj; j++)
591 double y = Oy + j*Ly/nj + dy/2.;
592 for (
int i=0; i<ni; i++)
594 double x = Ox + i*Lx/ni + dx/2.;
598 Offset_flux << i<<
","<<j<<
","<<k<<
";";
599 Offset_flux << x<<
","<<y<<
","<<z<<
";";
600 Offset_flux << std::endl;
636 std::ofstream Physical_flux(nom_fichier_sortie.c_str());
641 Physical_flux << std::endl <<
"i,j,k, \t x,y,z, \t rf_x, \t cf_x, \t\t rf_y, \t cf_y, \t\t rf_z, \t cf_z \t";
642 Physical_flux << std::endl;
649 ind = (k*nj + j)*ni + i;
655 Physical_flux << i<<
","<<j<<
","<<k<<
"\t,";
656 Physical_flux << x <<
",\t" << y <<
",\t" << z <<
", \t\t";
657 Physical_flux << force[0][0][ind] <<
",\t" << force[1][0][ind]<<
", \t\t";
658 Physical_flux << force[0][1][ind] <<
",\t" << force[1][1][ind]<<
", \t\t";
659 Physical_flux << force[0][2][ind] <<
",\t" << force[1][2][ind]<<
"\t";
660 Physical_flux << std::endl;
This class encapsulates all the information related to the eulerian mesh for TrioIJK.
int get_offset_local(int direction) const
Returns the local offset in requested direction.
void initialise(int nproc_tot, int ni, int nj, int nk, int nl, int nm, int nn, double Lx, double Ly, double Lz, double Ox, double Oy, double Oz, int momin, int momax, double kmin, double kmax, std::string nom_fichier, const Domaine_IJK &splitting, int a_i_offset, int a_j_offset, int a_k_offset)