19#include <Domaine_IJK.h>
20#include <communications.h>
21#include <MaillerParallel.h>
24#include <Probleme_base.h>
25#include <Domaine_VF.h>
26#include <IJK_Navier_Stokes_tools.h>
42void Force_sp::initialise(
int a_nl,
int a_nn,
int a_nm,
int a_momin,
int a_momax,
double a_kmin,
double a_kmax, std::string nom_fichier
48 n_lmn = (2*nl+1)*(2*nm+1)*(2*nn+1);
62 force[0][0].resize(n_lmn,0.0);
63 force[1][0].resize(n_lmn,0.0);
64 force[0][1].resize(n_lmn,0.0);
65 force[1][1].resize(n_lmn,0.0);
66 force[0][2].resize(n_lmn,0.0);
67 force[1][2].resize(n_lmn,0.0);
69 force_flt.resize_array(2*3*n_lmn);
71 std::ofstream Spectral_flux(nom_fichier.c_str());
74 Spectral_flux <<
"-------- SECTRAL_FORCE --------" << std::endl;
75 Spectral_flux << std::endl <<
"l,m,n \t : f_x, \tf_y, \tf_z,\t";
82void Force_sp::initialise(
int a_nl,
int a_nn,
int a_nm,
int a_momin,
int a_momax,
double a_kmin,
double a_kmax,
double a_amplitude, std::string nom_fichier)
88 n_lmn = (2*nl+1)*(2*nm+1)*(2*nn+1);
93 amplitude = a_amplitude;
102 force[0][0].resize(n_lmn,0.0);
103 force[1][0].resize(n_lmn,0.0);
104 force[0][1].resize(n_lmn,0.0);
105 force[1][1].resize(n_lmn,0.0);
106 force[0][2].resize(n_lmn,0.0);
107 force[1][2].resize(n_lmn,0.0);
109 force_flt.resize_array(2*3*n_lmn);
111 std::ofstream Spectral_flux(nom_fichier.c_str());
114 Spectral_flux <<
"-------- SECTRAL_FORCE --------" << std::endl;
115 Spectral_flux << std::endl <<
"l,m,n \t : f_x, \tf_y, \tf_z,\t";
133 double coefficient_translation[2];
134 for (
int n=0; n<2*nn+1; n++)
135 for (
int m=0; m<2*nm+1; m++)
136 for (
int l=0; l<2*nl+1; l++)
138 int ind_lmn = (n*(2*nm+1) + m) * (2*nl+1) +l;
141 kappa[0] = - kmax + (l)*(2*kmax)/(2*nl);
142 kappa[1] = - kmax + (m)*(2*kmax)/(2*nm);
143 kappa[2] = - kmax + (n)*(2*kmax)/(2*nn);
145 if (!(std::fabs(kappa[0])<kmin && std::fabs(kappa[1])<kmin && std::fabs(kappa[2])<kmin))
150 double argument_advection(0);
151 for (
int dor=0; dor<n_dir; dor++)
154 Cout << dor <<
"argument_advection" << argument_advection << finl;
155 argument_advection += kappa[dor]*advection_length[dor];
157 Cout <<
"argument_advection" << argument_advection << finl;
158 coefficient_translation[0] = cos(-1.*argument_advection);
159 coefficient_translation[1] = sin(-1.*argument_advection);
161 for (
int dir=0; dir<n_dir; dir++)
167 int ind_CDIlmn((1*n_dir+dir)*n_lmn+ind_lmn);
168 int ind_RDIlmn((0*n_dir+dir)*n_lmn+ind_lmn);
170 force_flt[ind_RDIlmn] = force_flt[ind_RDIlmn]*coefficient_translation[0] - force_flt[ind_CDIlmn]*coefficient_translation[1];
171 force_flt[ind_CDIlmn] = force_flt[ind_CDIlmn]*coefficient_translation[0] + force_flt[ind_RDIlmn]*coefficient_translation[1];
182 envoyer_broadcast(force_flt,0);
189 n_lmn = (2*nl+1)*(2*nm+1)*(2*nn+1);
191 force_flt.resize(2*3*n_lmn);
205 int cpx, dir, l, m, n, ind;
208 for (n=0; n<2*nn+1; n++)
210 for (m=0; m<2*nm+1; m++)
211 for (l=0; l<2*nl+1; l++)
213 ind = (n*(2*nm+1) + m) * (2*nl+1) +l;
215 kappa[0] = - kmax + (l)*(2*kmax)/(2*nl);
216 kappa[1] = - kmax + (m)*(2*kmax)/(2*nm);
217 kappa[2] = - kmax + (n)*(2*kmax)/(2*nn);
218 norme_kappa = sqrt(kappa[0]*kappa[0] + kappa[1]*kappa[1] + kappa[2]*kappa[2]);
219 if (norme_kappa >= kmin)
221 for (dir=0; dir<3; dir++)
222 for (cpx=0; cpx<2; cpx++)
224 force[cpx][dir][ind] = kappa[0];
230 envoyer_broadcast(force_flt,0);
245 for (
int n=0; n<2*nn+1; n++)
248 for (
int m=0; m<2*nm+1; m++)
249 for (
int l=0; l<2*nl+1; l++)
251 ind = (n*(2*nm+1) + m) * (2*nl+1) +l;
252 kappa[0] = - kmax + (l)*(2*kmax)/(2*nl);
253 kappa[1] = - kmax + (m)*(2*kmax)/(2*nm);
254 kappa[2] = - kmax + (n)*(2*kmax)/(2*nn);
255 norme_kappa = sqrt(kappa[0]*kappa[0] + kappa[1]*kappa[1] + kappa[2]*kappa[2]);
257 if (norme_kappa >= kmin)
259 for (
int dir=0; dir<3; dir++)
262 if (l==nl+nl/2 || l==nl/2)
264 force[0][dir][ind] = amplitude;
265 force[1][dir][ind] = 0;
272 envoyer_broadcast(force_flt,0);
289 int l1(nl-roc), l2(nl+roc);
290 int n1(nn-roc), n2(nn+roc);
291 int fsp_m1(nm), fsp_m2(nm);
293 int ind1((n1*(2*nm+1) + fsp_m1) * (2*nl+1) +l1), ind2((n2*(2*nm+1) + fsp_m2) * (2*nl+1) +l2);
294 force[0][dir][ind1]=amplitude;
295 force[0][dir][ind2]=amplitude;
297 envoyer_broadcast(force_flt,0);
314 int n_ind_lmn(n_lmn);
316 int l_moins(nl-roc), l_plus(nl+roc);
317 int n_moins(nn-roc), n_plus(nn+roc);
321 int ind_moins((n_moins*(2*nm+1) + m_moins) * (2*nl+1) +l_plus);
322 int ind_plus((n_plus*(2*nm+1) + m_plus) * (2*nl+1) +l_moins);
324 for (
int dir=0; dir<2; dir++)
333 int ind_RDImoins((0*n_dir+dir)*n_ind_lmn+ind_moins);
334 int ind_RDIplus((0*n_dir+dir)*n_ind_lmn+ind_plus);
335 force_flt[ind_RDImoins]=amplitude*(1./sqrt(2))*coeff;
336 force_flt[ind_RDIplus]=amplitude*(1./sqrt(2))*coeff;
338 ind_RDImoins = (0*n_dir+dir+2)*n_ind_lmn+ind_moins;
339 ind_RDIplus = (0*n_dir+dir+2)*n_ind_lmn+ind_plus;
340 force_flt[ind_RDImoins]=amplitude*(1./sqrt(2))*coeff;
341 force_flt[ind_RDIplus]=amplitude*(1./sqrt(2))*coeff;
344 envoyer_broadcast(force_flt,0);
358 int n_ind_lmn(n_lmn);
370 int ind_moins((n_moins*(2*nm+1) + m_zero) * (2*nl+1) +l_zero);
371 int ind_plus((n_plus*(2*nm+1) + m_zero) * (2*nl+1) +l_zero);
374 int ind_RDImoins((0*n_dir+dir)*n_ind_lmn+ind_moins);
375 int ind_RDIplus((0*n_dir+dir)*n_ind_lmn+ind_plus);
376 force_flt[ind_RDImoins]=amplitude;
377 force_flt[ind_RDIplus]=amplitude;
379 force[0][dir][ind_moins]=amplitude;
380 force[0][dir][ind_plus]=amplitude;
382 envoyer_broadcast(force_flt,0);
394 int n_ind_lmn(n_lmn);
406 int ind_moins((n_zero*(2*nm+1) + m_moins) * (2*nl+1) +l_zero);
407 int ind_plus((n_zero*(2*nm+1) + m_plus) * (2*nl+1) +l_zero);
409 int ind_RDImoins((0*n_dir+dir)*n_ind_lmn+ind_moins);
410 int ind_RDIplus((0*n_dir+dir)*n_ind_lmn+ind_plus);
411 force_flt[ind_RDImoins]=amplitude;
412 force_flt[ind_RDIplus]=amplitude;
415 force[0][dir][ind_moins]=amplitude;
416 force[0][dir][ind_plus]=amplitude;
418 envoyer_broadcast(force_flt,0);
434 int n_ind_lmn(n_lmn);
439 int m_moins(nm-2*roc);
441 int m_plus(nm+2*roc);
447 int ind_moins((n_zero*(2*nm+1) + m_moins) * (2*nl+1) +l_zero);
448 int ind_plus((n_zero*(2*nm+1) + m_plus) * (2*nl+1) +l_zero);
450 int ind_RDImoins((0*n_dir+dir)*n_ind_lmn+ind_moins);
451 int ind_RDIplus((0*n_dir+dir)*n_ind_lmn+ind_plus);
453 force_flt[ind_RDImoins]=0.5*amplitude;
454 force_flt[ind_RDIplus]=0.5*amplitude;
456 force[0][dir][ind_moins]=0.5*amplitude;
457 force[0][dir][ind_plus]=0.5*amplitude;
461 int ind_zero((n_zero*(2*nm+1) + m_zero) * (2*nl+1) +l_zero);
463 int ind_RDIzero((0*n_dir+dir)*n_ind_lmn+ind_zero);
465 force_flt[ind_RDIzero]=amplitude;
467 force[0][dir][ind_zero]=amplitude;
470 envoyer_broadcast(force_flt,0);
486 int n_ind_lmn(n_lmn);
491 int m_moins(nm-2*roc);
493 int m_plus(nm+2*roc);
499 int ind_moins((n_zero*(2*nm+1) + m_moins) * (2*nl+1) +l_zero);
500 int ind_plus((n_zero*(2*nm+1) + m_plus) * (2*nl+1) +l_zero);
502 int ind_RDImoins((0*n_dir+dir)*n_ind_lmn+ind_moins);
503 int ind_RDIplus((0*n_dir+dir)*n_ind_lmn+ind_plus);
505 force_flt[ind_RDImoins]=time*0.5*amplitude;
506 force_flt[ind_RDIplus]=time*0.5*amplitude;
508 force[0][dir][ind_moins]=time*0.5*amplitude;
509 force[0][dir][ind_plus]=time*0.5*amplitude;
513 int ind_zero((n_zero*(2*nm+1) + m_zero) * (2*nl+1) +l_zero);
515 int ind_RDIzero((0*n_dir+dir)*n_ind_lmn+ind_zero);
517 force_flt[ind_RDIzero]=time*amplitude;
519 force[0][dir][ind_zero]=time*amplitude;
522 envoyer_broadcast(force_flt,0);
533 int n_ind_lmn(n_lmn);
546 int ind_moins((n_zero*(2*nm+1) + m_zero) * (2*nl+1) +l_moins);
547 int ind_plus((n_zero*(2*nm+1) + m_zero) * (2*nl+1) +l_plus);
548 std::cout <<
"ind_moins : " << ind_moins << std::endl;
549 std::cout <<
"ind_plus : " << ind_plus << std::endl;
550 std::cout <<
"in force_sp : " <<
Process::me() << std::endl;
551 int ind_RDImoins((0*n_dir+dir)*n_ind_lmn+ind_moins);
552 int ind_RDIplus((0*n_dir+dir)*n_ind_lmn+ind_plus);
553 force_flt[ind_RDImoins]=amplitude;
554 force_flt[ind_RDIplus]=amplitude;
556 force[0][dir][ind_moins]=amplitude;
557 force[0][dir][ind_plus]=amplitude;
559 envoyer_broadcast(force_flt,0);
570 int n_ind_lmn(n_lmn);
583 int ind_moins((n_zero*(2*nm+1) + m_zero) * (2*nl+1) +l_moins);
584 int ind_plus((n_zero*(2*nm+1) + m_zero) * (2*nl+1) +l_plus);
585 std::cout <<
"ind_moins : " << ind_moins << std::endl;
586 std::cout <<
"ind_plus : " << ind_plus << std::endl;
587 std::cout <<
"in force_sp : " <<
Process::me() << std::endl;
588 int ind_RDImoins((0*n_dir+dir)*n_ind_lmn+ind_moins);
589 int ind_RDIplus((0*n_dir+dir)*n_ind_lmn+ind_plus);
590 force_flt[ind_RDImoins]=amplitude;
591 force_flt[ind_RDIplus]=amplitude;
593 force[0][dir][ind_moins]=amplitude;
594 force[0][dir][ind_plus]=amplitude;
596 envoyer_broadcast(force_flt,0);
608 int dir, l, m, n, ind;
612 int fsp_m1(nm-roc), fsp_m2(nm+roc);
613 int n1(nn-roc), n2(nn+roc);
619 for (n=n1; n<n2+1; n++)
620 for (m=fsp_m1; m<fsp_m2+1; m++)
621 for (l=l1; l<l2+1; l++)
623 ind = (n*(2*nm+1) + m) * (2*nl+1) +l;
624 for (dir=0; dir<3; dir++)
626 force[0][dir][ind] = amplitude;
627 force[1][dir][ind] = 0.0;
631 envoyer_broadcast(force_flt,0);
639 int cpx, dir, l, m, n, ind;
643 int l1(nl-roc), l2(nl+roc);
645 int n1(nn-roc), n2(nn+roc);
648 int fsp_m1(nm), fsp_m2(nm);
651 for (n=n1; n<n2+1; n++)
652 for (m=fsp_m1; m<fsp_m2+1; m++)
653 for (l=l1; l<l2+1; l++)
655 ind = (n*(2*nm+1) + m) * (2*nl+1) +l;
656 for (dir=0; dir<3; dir++)
658 for (cpx=0; cpx<2; cpx++)
660 force[0][dir][ind] = amplitude;
661 force[1][dir][ind] = 0;
666 envoyer_broadcast(force_flt,0);
681 for (
int n=0; n<2*nn+1; n++)
682 for (
int m=0; m<2*nm+1; m++)
683 for (
int l=nl; l<2*nl+1; l++)
685 int ind_lmn = (n*(2*nm+1) + m) * (2*nl+1) +l;
686 int ind_lmn_moins = (n*(2*nm+1) + m) * (2*nl+1) + (2*nl-l);
689 kappa[0] = - kmax + (l)*(2*kmax)/(2*nl);
690 kappa[1] = - kmax + (m)*(2*kmax)/(2*nm);
691 kappa[2] = - kmax + (n)*(2*kmax)/(2*nn);
693 if (std::fabs(kappa[0])<kmin && std::fabs(kappa[1])<kmin && std::fabs(kappa[2])<kmin)
696 for (
int cpx=0; cpx<2; cpx++)
698 for (
int dir=0; dir<3; dir++)
700 int ind_CDI((cpx*n_dir+dir)*n_lmn+ind_lmn);
701 force_flt[ind_CDI] = 0;
702 force_flt[(0*n_dir+dir)*n_lmn+(ind_lmn_moins)] = force_flt[(0*n_dir+dir)*n_lmn+(ind_lmn)];
703 force_flt[(1*n_dir+dir)*n_lmn+(ind_lmn_moins)] = - force_flt[(1*n_dir+dir)*n_lmn+(ind_lmn)];
710 double norme_kappa = sqrt(kappa[0]*kappa[0] + kappa[1]*kappa[1] + kappa[2]*kappa[2]);
711 for (
int cpx=0; cpx<2; cpx++)
713 terme[cpx] = kappa[0]*process_flt[(cpx*n_dir+0)*n_lmn+ind_lmn];
714 terme[cpx] += kappa[1]*process_flt[(cpx*n_dir+1)*n_lmn+ind_lmn];
715 terme[cpx] += kappa[2]*process_flt[(cpx*n_dir+2)*n_lmn+ind_lmn];
716 terme[cpx] /= pow(norme_kappa,2);
717 for (
int dir=0; dir<3; dir++)
719 int ind_CDI((cpx*n_dir+dir)*n_lmn+ind_lmn);
720 force_flt[ind_CDI] = process_flt[ind_CDI] - kappa[dir]*terme[cpx];
722 force_flt[(0*n_dir+dir)*n_lmn+(ind_lmn_moins)] = force_flt[(0*n_dir+dir)*n_lmn+(ind_lmn)];
723 force_flt[(1*n_dir+dir)*n_lmn+(ind_lmn_moins)] = - force_flt[(1*n_dir+dir)*n_lmn+(ind_lmn)];
729 envoyer_broadcast(force_flt,0);
736 std::ofstream Spectral_flux(nom_fichier_sortie.c_str(), std::ios::app);
742 Spectral_flux << std::endl <<
"time : " << t << std::endl << std::endl;
743 for (n=0; n<2*nn+1; n++)
744 for (m=0; m<2*nm+1; m++)
745 for (l=0; l<2*nl+1; l++)
747 ind = (n*(2*nm+1) + m) * (2*nl+1) +l;
748 kappa[0] = - kmax + (l)*(2*kmax)/(2*nl);
749 kappa[1] = - kmax + (m)*(2*kmax)/(2*nm);
750 kappa[2] = - kmax + (n)*(2*kmax)/(2*nn);
751 norme_kappa = sqrt(kappa[0]*kappa[0] + kappa[1]*kappa[1] + kappa[2]*kappa[2]);
752 if (norme_kappa >= kmin)
754 Spectral_flux << l<<
","<<m<<
","<<n<<
"\t : ";
755 Spectral_flux << force[0][0][ind] <<
" + i" << force[1][0][ind]<<
", \t";
756 Spectral_flux << force[0][1][ind] <<
" + i" << force[1][1][ind]<<
", \t";
757 Spectral_flux << force[0][2][ind] <<
" + i" << force[1][2][ind]<<
", \t";
758 Spectral_flux << std::endl;
766 std::ofstream Spectral_flux(nom_fichier_sortie.c_str());
770 Spectral_flux << std::endl <<
"l,m,n, \t kx,ky,kz, \t rf_x, \t cf_x, \t\t rf_y, \t cf_y, \t\t rf_z, \t cf_z \t";
771 Spectral_flux << std::endl;
773 for (
int n=0; n<2*nn+1; n++)
774 for (
int m=0; m<2*nm+1; m++)
776 for (
int l=0; l<2*nl+1; l++)
778 int ind = (n*(2*nm+1) + m) * (2*nl+1) +l;
780 kappa[0] = - kmax + (l)*(2*kmax)/(2*nl);
781 kappa[1] = - kmax + (m)*(2*kmax)/(2*nm);
782 kappa[2] = - kmax + (n)*(2*kmax)/(2*nn);
783 double norme_kappa = sqrt(kappa[0]*kappa[0] + kappa[1]*kappa[1] + kappa[2]*kappa[2]);
784 if (norme_kappa >= kmin)
786 Spectral_flux << l<<
","<<m<<
","<<n<<
"\t,";
787 Spectral_flux << kappa[0] <<
",\t" << kappa[1] <<
",\t" << kappa[2] <<
", \t\t";
788 Spectral_flux << force[0][0][ind] <<
",\t" << force[1][0][ind]<<
", \t\t";
789 Spectral_flux << force[0][1][ind] <<
",\t" << force[1][1][ind]<<
", \t\t";
790 Spectral_flux << force[0][2][ind] <<
",\t" << force[1][2][ind]<<
"\t";
791 Spectral_flux << std::endl;
805 for (n=0; n<2*nn+1; n++)
806 for (m=0; m<2*nm+1; m++)
807 for (l=0; l<2*nl+1; l++)
809 ind = (n*(2*nm+1) + m) * (2*nl+1) +l;
810 for (dir=0; dir<3; dir++)
811 energie += force[0][dir][ind]*force[0][dir][ind] + force[1][dir][ind]*force[1][dir][ind];
823 return force[cpx][dir][ind];
Class defining operators and methods for all reading operation in an input flow (file,...
void compute_dirac_point_div_nulle()
void initialise(int nl, int nn, int nm, int momin, int momax, double kmin, double kmax, std::string nom_fichier)
void compute_force_kappa()
void compute_dirac_point_uniX_alongY()
ArrOfDouble & get_coeff_flt()
std::vector< std::vector< std::vector< double > > > get_coeff()
double get_force(int cpx, int dir, int ind)
void compute_diracs_for_t_times_cos_squarred(double time)
void compute_diracs_for_cos_squarred()
void compute_dirac_board()
void compute_dirac_point_uniX_alongX()
void compute_step2(ArrOfDouble &process_flt)
void write(std::string nom_fichier_sortie, double time)
void compute_dirac_point_uniY()
void field_advection(const ArrOfDouble &advection_length, const double dt, const int it)
void write_separate(std::string nom_fichier_sortie, double t)
void compute_dirac_point()
void compute_dirac_point_uniZ()
classe Objet_U Cette classe est la classe de base des Objets de TRUST
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
static int me()
renvoie mon rang dans le groupe de communication courant.
static int je_suis_maitre()
renvoie 1 si on est sur le processeur maitre du groupe courant (c'est a dire me() == 0),...
Classe de base des flux de sortie.