284 const Domaine_VF& domaine_VF = ref_cast(
Domaine_VF, mon_equation->inconnue().domaine_dis_base());
285 int nb_faces=la_surface_libre_->nb_faces();
286 int nb_elem=domaine_VF.
nb_elem();
288 IntVect elements_surface_libre(nb_faces);
289 elements_surface_libre=-1;
290 IntVect vortex_potentiel(nb_elem);
297 const DoubleTab& critereQ = mon_equation->get_champ(
"critere_Q").valeurs();
298 double t1 = 0. , t2=0. , t3=0.;
302 for (
int ind_face=0; ind_face<nb_faces; ind_face++)
304 int face = la_surface_libre_->num_face(ind_face);
309 if (critereQ(elem)>0)
311 elements_surface_libre(ind_face)=elem;
312 vortex_potentiel(elem)=1;
318 using Kokkos::numbers::pi;
319 DoubleTab Critere(nb_vortex,3);
320 DoubleTab Centre(nb_vortex,3);
321 ArrOfDouble Rayon(nb_vortex);
322 ArrOfDouble Max_Critere_Q(nb_vortex);
323 ArrOfInt Taille(nb_vortex);
324 ArrOfDouble centre_vortex(3);
327 double dtheta=2*pi/nb_dtheta;
328 ArrOfInt elements(nb_dtheta);
329 DoubleTab points(nb_dtheta,3);
330 DoubleTab u(nb_dtheta,3);
333 statistics().create_custom_counter(
"m1",2,
"TrioCFD");
336 statistics().begin_count(
"m1",statistics().get_last_opened_counter_level()+1);
337 double critereQ_max=0;
338 int ind_face_centre_vortex=-1;
340 for (
int ind_face=0; ind_face<nb_faces; ind_face++)
342 int elem=elements_surface_libre(ind_face);
343 if (elem>=0 && critereQ(elem)>critereQ_max)
345 critereQ_max=critereQ(elem);
346 ind_face_centre_vortex=ind_face;
350 double critereQ_mp_max=
mp_max(critereQ_max);
352 int pe=(critereQ_mp_max==critereQ_max?
Process::me():-1);
353 int pe_mp_max=(int)
mp_max(pe);
359 int face_centre_fortex = la_surface_libre_->num_face(ind_face_centre_vortex);
360 int elem_centre_vortex = elements_surface_libre(ind_face_centre_vortex);
361 vortex_potentiel(elem_centre_vortex)=0;
369 const DoubleTab& coord=mon_equation->probleme().domaine().coord_sommets();
370 int nb_sommet_face=domaine_VF.
face_sommets().dimension(1);
372 for (
int i=0; i<nb_sommet_face; i++)
374 int som1 = domaine_VF.
face_sommets(face_centre_fortex,i);
375 int som2 = (i!=nb_sommet_face-1 ? domaine_VF.
face_sommets(face_centre_fortex,i+1) : domaine_VF.
face_sommets(face_centre_fortex,0));
376 double dx=coord(som2,0)-coord(som1,0);
377 double dy=coord(som2,1)-coord(som1,1);
378 perimetre+=sqrt(dx*dx+dy*dy);
381 R0 = 0.6*0.75*(2*surface/perimetre);
384 for (
int i=0; i<3; i++) centre_vortex[i]=domaine_VF.
xp(elem_centre_vortex,i);
386 for (
int p=0; p<
nproc(); p++)
389 envoyer(centre_vortex,pe_mp_max,p,p);
390 envoyer(R0,pe_mp_max,p,p);
396 recevoir(centre_vortex,pe_mp_max,
me(),
me());
397 recevoir(R0,pe_mp_max,
me(),
me());
405 t1 = statistics().get_time_since_last_open(
"m1");
406 statistics().end_count(
"m1");
410 int limite_vortex_atteinte=0;
411 int points_trouves=0;
412 statistics().create_custom_counter(
"m2",2,
"TrioCFD");
413 statistics().begin_count(
"m2",statistics().get_last_opened_counter_level()+1);
416 double inside_vortex=1;
418 for (
int i_theta=0; i_theta<nb_dtheta; i_theta++)
420 double theta=i_theta*dtheta;
421 points(i_theta,0)=centre_vortex[0]+R*cos(theta);
422 points(i_theta,1)=centre_vortex[1]+R*sin(theta);
423 points(i_theta,2)=centre_vortex[2];
426 mon_equation->domaine_dis().domaine().chercher_elements(points,elements);
427 for (
int i_theta=0; i_theta<nb_dtheta; i_theta++)
429 int elem=elements[i_theta];
431 if (niter==0 && pe==pe_mp_max)
433 int elem_centre_vortex=elements_surface_libre(ind_face_centre_vortex);
434 if (elem!=elem_centre_vortex)
435 error(
"Error, R0 is too large. Algorithm problem, contact pierre.ledac@c-s.fr");
437 if (elem>=0 && elem<nb_elem)
450 inside_vortex=
mp_min(inside_vortex);
453 if (limite_vortex_atteinte) dR*=0.5;
457 for (
int i_theta=0; i_theta<nb_dtheta; i_theta++)
459 int elem=elements[i_theta];
460 if (elem>=0 && elem<nb_elem)
462 if (vortex_potentiel(elem)!=0) taille_vortex++;
463 vortex_potentiel(elem)=0;
469 limite_vortex_atteinte=1;
477 t2 = statistics().get_time_since_last_open(
"m2");
478 statistics().end_count(
"m2");
479 statistics().create_custom_counter(
"m3",2,
"TrioCFD");
480 statistics().begin_count(
"m3",statistics().get_last_opened_counter_level()+1);
485 taille_maxi = (taille_vortex_mailles > taille_maxi ? taille_vortex_mailles : taille_maxi);
491 Cerr <<
"-> CEA_JAEA criterion : Vortex " << nb_vortex <<
" de " << taille_vortex_mailles <<
" elements ";
492 Cerr <<
"in (x,y,z)=(" << centre_vortex[0] <<
"," << centre_vortex[1] <<
"," << centre_vortex[2] <<
") ";
493 Cerr <<
"Radius=" << R <<
" std::max(critere_Q)=" << critereQ_mp_max;
498 mon_equation->inconnue().valeur_aux(points,u);
502 for (
int i_theta=0; i_theta<nb_dtheta; i_theta++)
504 double theta=i_theta*dtheta;
505 int elem=elements[i_theta];
506 if (elem>=0 && elem<nb_elem)
508 alpha+=(u(i_theta,0)*cos(theta)+u(i_theta,1)*sin(theta))*R*dtheta;
509 gamma+=(u(i_theta,1)*cos(theta)-u(i_theta,0)*sin(theta))*R*dtheta;
513 alpha=
mp_sum(alpha)/(pi*R*R);
518 double nu = ref_cast(
Fluide_Incompressible,mon_equation->milieu()).viscosite_cinematique().valeurs()(0,0);
519 double gz = mon_equation->milieu().gravite().valeurs()(0,2);
524 Critere.
resize(nb_vortex+1,3);
525 Centre.
resize(nb_vortex+1,3);
526 Rayon.
resize(nb_vortex+1);
527 Max_Critere_Q.
resize(nb_vortex+1);
528 Taille.
resize(nb_vortex+1);
530 Critere(nb_vortex,0)=alpha;
531 Critere(nb_vortex,1)=Critere(nb_vortex,0)*gamma*gamma;
532 Critere(nb_vortex,2)=alpha*Critere(nb_vortex,1);
534 Max_Critere_Q[nb_vortex]=critereQ_mp_max;
535 Taille[nb_vortex]=taille_vortex_mailles;
536 for (
int i=0; i<3; i++) Centre(nb_vortex,i)=centre_vortex[i];
537 if (
debug_) Cerr <<
" alpha=" << Critere(nb_vortex,0) <<
" alpha*gamma^2=" << Critere(nb_vortex,1) <<
" (alpha*gamma)^2=" << Critere(nb_vortex,2) << finl;
542 for (
int ind_face=0; ind_face<nb_faces; ind_face++)
544 int elem=elements_surface_libre(ind_face);
545 if (elem>=0 && vortex_potentiel(elem)==0) elements_surface_libre(ind_face)=-1;
547 t3 = statistics().get_time_since_last_open(
"m3");
548 statistics().end_count(
"m3");
549 if (
debug_) Cout <<
"CPU AREVA criterion m1= " << t1 <<
" s m2= " << t2 <<
" s m3= " << t3 << finl;
554 Cerr <<
"-> CEA_JAEA criterion : No vortex detected of size larger than " <<
nb_mailles_mini_ <<
" elements. A potential vortex was " << taille_maxi <<
" elements large." << finl;
558 Cerr <<
"-> CEA_JAEA criterion : we found " << nb_vortex <<
" vortices near the free surface." << finl;
560 ArrOfDouble Critere_max(3);
561 ArrOfInt Vortex_max(3);
563 for (
int critere=0; critere<3; critere++)
564 for (
int vortex=0; vortex<nb_vortex; vortex++)
565 if (Critere(vortex,critere)>Critere_max[critere])
567 Critere_max[critere]=Critere(vortex,critere);
568 Vortex_max[critere]=vortex;
572 int vortex_principal = Vortex_max[1];
573 if (vortex_principal>=0)
582 Critere_nom[0]=
"CEA_JAEA_alpha";
583 Critere_nom[1]=
"CEA_JAEA_alphaXgamma2";
584 Critere_nom[2]=
"CEA_JAEA_alpha2Xgamma2";
586 for (
int critere=0; critere<3; critere++)
589 for (
int i=0; i<3; i++) centre_vortex[i]=Centre(vortex_principal,i);
591 imprimer(Critere(vortex_principal,critere), Critere_nom[critere], centre_vortex, Rayon[vortex_principal]);
596 Nom filename(
"Vortex_");
597 filename+=Critere_nom[critere];
604 file <<
"# " << filename << finl;
606 for (
int i_theta=0; i_theta<nb_dtheta; i_theta++)
608 double theta=i_theta*dtheta;
609 double x=centre_vortex[0]+Rayon[vortex_principal]*cos(theta);
610 double y=centre_vortex[1]+Rayon[vortex_principal]*sin(theta);
611 double z=centre_vortex[2]+2*R0;
612 file <<
" x= " << x <<
" y= " << y <<
" z= " << z;
615 file <<
"# OWN_PTR(Champ_base) CRITERE" << finl;
616 file <<
"# Type POINTS" << finl;
619 for (
int i_theta=0; i_theta<nb_dtheta; i_theta++) file <<
" " << Critere(vortex_principal,critere);
626 Nom filename(
"Centres_vortex.");
630 file <<
"# " << filename << finl;
632 for (
int vortex=0; vortex<nb_vortex; vortex++) file <<
" x= " << Centre(vortex,0) <<
" y= " << Centre(vortex,1) <<
" z= " << Centre(vortex,2)+2*R0;
634 file <<
"# OWN_PTR(Champ_base) RAYON" << finl;
635 file <<
"# Type POINTS" << finl;
637 for (
int vortex=0; vortex<nb_vortex; vortex++) file <<
" " << Rayon[vortex];
641 Cerr <<
"-> CEA_JAEA criterion : The main vortex (largest alpha*gamma^2) was vortex number " << vortex_principal << finl;