358 const Domaine& le_dom = mon_pb_.valeur().
domaine();
359 const MEDCouplingUMesh* le_mc_mesh = le_dom.get_mc_mesh();
361 DoubleTab& normalArray = champ_normal_->valeurs();
363 DoubleTab& isNodeDirichletArray = isNodeDirichlet_->valeurs();
364 DoubleTab& baryArray = champ_bary_->valeurs();
368 assert(nbElemVol==le_mc_mesh->getNumberOfCells());
373 DoubleTrav t1Arr(nbElemSur, dim_esp), t2Arr(nbElemSur, dim_esp);
374 Sous_Domaine sdom_mesh3D_loc;
376 std::vector<mcIdType> numNodes, numNodes2D, numNodes3D;
377 ArrOfDouble mesh2DBBox(2*dim_esp);
378 Octree_Double octree_mesh3D;
380 MCAuto<MEDCouplingFieldDouble> measure_aSkinUMesh(
aSkinUMesh_->getMeasureField(
true));
381 assert(measure_aSkinUMesh->getNumberOfComponents()==1);
382 double mesure_tot_aSkinUMesh = measure_aSkinUMesh->accumulate(0);
384 Cerr <<
"<<<<<<<<<<<<<<<< Prepro_IBM: BEGINNING OF AREA COMPUTATION..." << finl;
385 Cerr <<
"Prepro_IBM: Computing intersection... with " << nbElemSur <<
" elements (Lagrangien) and " << nbElemVol <<
" / " << nbPtsDom <<
" elements/nodes (Eulerian)" << finl;
386 if (idebug) Cerr <<
"Domaine 3D : "<< le_dom.
nb_som() <<
" nodes and "<< le_dom.
nb_som_elem() <<
" per element (Eulerian)" << finl;
393 isNodeDirichletArray = -1.;
394 double aire_tot_calcul = 0.;
395 double mesure_sig_aSkinUMesh = 0.;
399 for (
int e = 0; e < nbElemSur; e++)
402 Cerr<<
">>>> surface element number: "<< e <<finl;
405 int nbNodesSur = int(numNodes.size());
406 Cerr<<
"nbNodesSur = "<< nbNodesSur <<finl;
410 for (
int cc = 1; cc <dim_esp; cc++) Cerr <<
" ,"<<
normalArr_(e,cc);
413 Cerr <<
"t1Arr[e]_ (" << t1Arr(e,0);
414 for (
int cc = 1; cc <dim_esp; cc++) Cerr <<
" ," << t1Arr(e,cc);
415 Cerr <<
" )" << finl;
416 Cerr <<
"t2Arr[e]_ (" << t2Arr(e,0);
417 for (
int cc = 1; cc <dim_esp; cc++) Cerr <<
" ," << t2Arr(e,cc);
422 MCAuto<MEDCouplingUMesh> mesh2DSurf(MEDCouplingUMesh::New(
"surf_"+std::to_string(e),2));
423 DoubleTrav surfCoords2D(nbNodesSur, 2);
424 for (
int node =0; node < nbNodesSur; node++)
426 int numNode = int(numNodes[node]);
427 surfCoords2D(node,0) = (
coordsSur3D_(numNode,0)-
barySurf_(e,0))*t1Arr(e,0) + (
coordsSur3D_(numNode,1)-
barySurf_(e,1))*t1Arr(e,1) + (
coordsSur3D_(numNode,2)-
barySurf_(e,2))*t1Arr(e,2);
428 surfCoords2D(node,1) = (
coordsSur3D_(numNode,0)-
barySurf_(e,0))*t2Arr(e,0) + (
coordsSur3D_(numNode,1)-
barySurf_(e,1))*t2Arr(e,1) + (
coordsSur3D_(numNode,2)-
barySurf_(e,2))*t2Arr(e,2);
430 MCAuto<MEDCoupling::DataArrayDouble> array(MEDCoupling::DataArrayDouble::New());
431 array->alloc(nbNodesSur, 2);
432 std::copy(surfCoords2D.
addr(), surfCoords2D.
addr() + surfCoords2D.
size_array(), array->getPointer());
433 array->declareAsNew();
434 mesh2DSurf->setCoords(array);
435 mesh2DSurf->allocateCells(1);
436 IntTrav mesh2DSurf_conect(1, nbNodesSur);
437 for (
int node =0; node < nbNodesSur; node++) mesh2DSurf_conect(0,node) = node;
438 auto ptr = mesh2DSurf_conect.
addr();
439 std::vector<mcIdType> tmp(ptr, ptr+nbNodesSur);
440 INTERP_KERNEL::NormalizedCellType typ_fac_mc = INTERP_KERNEL::NORM_POLYGON;
441 mesh2DSurf->insertNextCell(typ_fac_mc, nbNodesSur, tmp.data());
442 mesh2DSurf->finishInsertingCells();
447 mesh2DSurf->getNodeIdsOfCell(0, numNodes2D);
448 const double *mesh2DSurf_coords = mesh2DSurf->getCoords()->begin();
449 DoubleTab Surf2DCoordonnes;
450 Surf2DCoordonnes.
resize(
int(mesh2DSurf->getNumberOfNodes()), 2);
451 std::copy(mesh2DSurf_coords, mesh2DSurf_coords+Surf2DCoordonnes.
size_array(), Surf2DCoordonnes.
addr());
452 Cerr <<
"mesh2DSurf : "<<mesh2DSurf->getNumberOfCells()<<
" cells and "<<mesh2DSurf->getNumberOfNodes()<<
" nodes in 2D space"<<finl;
453 for (
int n = 0; n <mesh2DSurf->getNumberOfNodes(); n++)
455 for (
int cc = 0; cc <2; cc++) Cerr <<Surf2DCoordonnes(n, cc) <<
" ";
458 Cerr <<
"mesh2DSurf : nb nodes cell #1 = "<<int(numNodes2D.size())<<finl;
459 for (
int n = 0; n <int(numNodes2D.size()); n++)
461 Cerr <<int(numNodes2D[n]) <<
" ";
467 for (
int c =0; c < dim_esp; c++)
470 int index1 = index0 + 1;
471 mesh2DBBox(index0) = 1.e+30;
472 mesh2DBBox(index1) = -1.e+30;
473 for (
int k =0; k < nbNodesSur; k++)
475 int numNode = int(numNodes[k]);
483 Cerr<<
"mesh2DBBox = ";
484 for (
int cc = 0; cc <dim_esp; cc++) Cerr<<
"["<<mesh2DBBox(2*cc)<<
", "<<mesh2DBBox(2*cc+1)<<
"] ";
488 const double bbox[] = {mesh2DBBox(0), mesh2DBBox(1), mesh2DBBox(2), mesh2DBBox(3), mesh2DBBox(4), mesh2DBBox(5)};
489 MCAuto<MEDCoupling::DataArrayIdType> cellIdsArr(le_mc_mesh->getCellsInBoundingBox(bbox, 0.));
490 const mcIdType *daP = cellIdsArr->begin();
491 int NbCellsInBB = int(cellIdsArr->getNumberOfTuples());
492 int NbCompsInBB = int(cellIdsArr->getNumberOfComponents());
493 Cerr<<
"getCellsInBoundingBox cellIdsArr : Nb Cells, Nb comp = "<< NbCellsInBB <<
" "<< NbCompsInBB<< finl;
495 for (
int k = 0; k <NbCellsInBB ; k++) Cerr<< (
int)daP[k] <<
" " ;
499 double aire_elem_calcul = 0.;
503 for (
int k = 0; k < NbCellsInBB; k++)
505 int my_elem = (int)daP[k];
506 if (idebug) Cerr<<
"**** num elem = "<<my_elem<<
" ****"<<finl ;
509 const mcIdType cellIds[1]= {my_elem};
510 MCAuto<MEDCouplingUMesh> mesh3D(le_mc_mesh->buildPartOfMySelf(cellIds,cellIds+1,
false));
511 assert(mesh3D->getNumberOfCells()==1);
512 int NumberOfNodes3D = int(mesh3D->getNumberOfNodes());
515 const double *crd3D = mesh3D->getCoords()->begin();
517 coord3D.
resize(NumberOfNodes3D, dim_esp);
521 for (
int node3D = 0; node3D <NumberOfNodes3D ; node3D++)
524 for (
int cc = 0; cc <dim_esp; cc++) ps3D += (coord3D(node3D,cc) -
barySurf_(e,cc)) *
normalArr_(e,cc);
525 if (node3D == 0) {signmult0 = ps3D;}
526 else if (signmult0 * ps3D < 0.) istop = 0;
530 if (idebug) Cerr<<
"Element not intercepted " <<finl;
539 Cerr<<
"origin element surfacique "<<e<<
" = ";
540 for (
int cc = 0; cc <dim_esp; cc++) Cerr<< origin[cc]<<
" ";
542 Cerr<<
"vec normal element surfacique "<<e<<
" = ";
543 for (
int cc = 0; cc <dim_esp; cc++) Cerr<< vec[cc]<<
" ";
546 MEDCoupling::DataArrayIdType * polycellIds =
nullptr;
550 MCAuto<MEDCouplingUMesh> interPoly3D(mesh3D->buildSlice3D(origin, vec, 0., polycellIds));
551 MCAuto<MEDCoupling::DataArrayIdType> polycellIdsAuto(polycellIds);
552 int nbCellsPoly3D = int(interPoly3D->getNumberOfCells());
553 int NumberOfNodes = int(interPoly3D->getNumberOfNodes());
554 const double *interCoords3D = interPoly3D->getCoords()->begin();
555 DoubleTrav interCoordonnes3D;
556 interCoordonnes3D.
resize(NumberOfNodes, dim_esp);
557 std::copy(interCoords3D, interCoords3D+interCoordonnes3D.
size_array(), interCoordonnes3D.
addr());
561 interPoly3D->getNodeIdsOfCell(0, numNodes3D);
562 int nbNodesCell1 = int(numNodes3D.size());
563 if (nbCellsPoly3D != 1)
565 Cerr<<
"<Nb cells> interPoly3D = "<<nbCellsPoly3D<<
" <> 1. Exit"<<finl;
571 Cerr <<
"<Nb cells> interPoly3D = "<<nbCellsPoly3D<<finl;
572 Cerr <<
"<Nb nodes> mesh3D, interPoly3D and Cell#1 = "<<NumberOfNodes3D<<
" "<<NumberOfNodes<<
" "<<nbNodesCell1<<finl;
574 assert((NumberOfNodes - NumberOfNodes3D) == nbNodesCell1);
575 MCAuto<MEDCouplingUMesh> interPoly2D(MEDCouplingUMesh::New(
"interPoly2D_"+std::to_string(my_elem),2));
576 DoubleTrav interPolyCoords2D(nbNodesCell1, (dim_esp - 1));
577 for (
int node = 0; node <nbNodesCell1 ; node++)
579 int numNode = int(numNodes3D[node]);
580 interPolyCoords2D(node,0) = (interCoordonnes3D(numNode,0)-
barySurf_(e,0))*t1Arr(e,0) + (interCoordonnes3D(numNode,1)-
barySurf_(e,1))*t1Arr(e,1) + (interCoordonnes3D(numNode,2)-
barySurf_(e,2))*t1Arr(e,2);
581 interPolyCoords2D(node,1) = (interCoordonnes3D(numNode,0)-
barySurf_(e,0))*t2Arr(e,0) + (interCoordonnes3D(numNode,1)-
barySurf_(e,1))*t2Arr(e,1) + (interCoordonnes3D(numNode,2)-
barySurf_(e,2))*t2Arr(e,2);
583 MCAuto<MEDCoupling::DataArrayDouble> interPolyarray2D(MEDCoupling::DataArrayDouble::New());
584 interPolyarray2D->alloc(nbNodesCell1, 2);
585 std::copy(interPolyCoords2D.
addr(), interPolyCoords2D.
addr() + interPolyCoords2D.
size_array(), interPolyarray2D->getPointer());
586 interPolyarray2D->declareAsNew();
587 interPoly2D->setCoords(interPolyarray2D);
588 interPoly2D->allocateCells(1);
589 IntTrav Poly2D_conect(1, nbNodesCell1);
590 for (
int node =0; node < nbNodesCell1; node++) Poly2D_conect(0,node) = node;
591 auto Poly2D_ptr = Poly2D_conect.
addr();
592 std::vector<mcIdType> Poly2D_tmp(Poly2D_ptr, Poly2D_ptr+ nbNodesCell1);
593 typ_fac_mc = INTERP_KERNEL::NORM_POLYGON;
594 interPoly2D->insertNextCell(typ_fac_mc, nbNodesCell1, Poly2D_tmp.data());
595 interPoly2D->finishInsertingCells();
600 interPoly2D->getNodeIdsOfCell(0, numNodes2D);
601 const double *interPoly2D_coords = interPoly2D->getCoords()->begin();
602 DoubleTab interPoly2DCoordonnes;
603 interPoly2DCoordonnes.
resize(
int(interPoly2D->getNumberOfNodes()), (dim_esp-1));
604 std::copy(interPoly2D_coords, interPoly2D_coords+interPoly2DCoordonnes.
size_array(), interPoly2DCoordonnes.
addr());
605 Cerr <<
"interPoly2D : "<<interPoly2D->getNumberOfCells()<<
" cells and "<<interPoly2D->getNumberOfNodes()<<
" nodes in 2D space"<<finl;
606 for (
int n = 0; n <interPoly2D->getNumberOfNodes(); n++)
608 for (
int cc = 0; cc <(dim_esp-1); cc++) Cerr <<interPoly2DCoordonnes(n, cc) <<
" ";
611 Cerr <<
"interPoly2D : nb nodes cell #1 = "<<int(numNodes2D.size())<<finl;
612 for (
int n = 0; n <int(numNodes2D.size()); n++)
614 Cerr <<int(numNodes2D[n]) <<
" ";
622 int status_polypoly = 0;
623 DoubleTab finalcoords;
626 if (idebug && (status_polypoly != 0)) Cerr<<
"status intersectPolyPoly2D : "<<status_polypoly<<finl;
627 if (status_polypoly != 0)
continue;
629 MCAuto<MEDCouplingUMesh> finalMesh(MEDCouplingUMesh::New(
"output_mesh",(dim_esp-1)));
630 finalMesh->allocateCells(1);
632 MCAuto<MEDCoupling::DataArrayDouble> outputCoords(MEDCoupling::DataArrayDouble::New());
634 std::copy(finalcoords.
addr(), finalcoords.
addr() + finalcoords.
size_array(), outputCoords->getPointer());
635 outputCoords->declareAsNew();
636 finalMesh->setCoords(outputCoords);
637 auto connect_ptr = Tab_conect.
addr();
638 std::vector<mcIdType> finalConnect(connect_ptr, connect_ptr+Tab_conect.
dimension(1) );
639 finalMesh->insertNextCell(typ_fac_mc, Tab_conect.
dimension(1), finalConnect.data());
640 finalMesh->finishInsertingCells();
644 DoubleTab interCoordonnes;
645 interCoordonnes.
resize(
int(finalMesh->getNumberOfNodes()), dim_esp);
646 for (
int node =0; node < interCoordonnes.
dimension(0); node++)
647 for (
int kd=0; kd<dim_esp; kd++)
648 interCoordonnes(node,kd) =
barySurf_(e,kd) + finalcoords(node,0)*t1Arr(e,kd) + finalcoords(node,1)*t2Arr(e,kd);
652 Cerr <<
"finalMesh : "<<int(finalMesh->getNumberOfCells())<<
" cells and "<<int(finalMesh->getNumberOfNodes())<<
" node in 2D space : "<<
" ";
653 for (
int cell=0; cell < finalMesh->getNumberOfCells(); cell++)
656 finalMesh->getNodeIdsOfCell(cell, numNodes2D);
657 for (
int n = 0; n <int(numNodes2D.size()); n++)
659 Cerr <<int(numNodes2D[n]) <<
" ";
663 for (
int n = 0; n <finalMesh->getNumberOfNodes(); n++)
665 for (
int cc = 0; cc <2; cc++) Cerr <<finalcoords(n, cc) <<
" ";
667 for (
int cc = 0; cc <dim_esp; cc++) Cerr <<interCoordonnes(n, cc) <<
" ";
675 int nbpts = interCoordonnes.
dimension(0);
676 double inv_nbpts =1.0 /( double(nbpts));
677 DoubleTab baryMean(dim_esp);
679 for (
int cc = 0; cc <dim_esp; cc++)
680 for (
int n = 0; n <nbpts; n++) baryMean(cc) += interCoordonnes(n, cc);
681 baryMean *= inv_nbpts;
684 Cerr <<
"finalMesh : mean barycenter = ";
685 for (
int cc = 0; cc <dim_esp; cc++) Cerr << baryMean(cc) <<
" ";
688 MCAuto<MEDCouplingFieldDouble> measure(finalMesh->getMeasureField(
true));
689 assert(measure->getNumberOfValues()==1);
690 double aire = measure->accumulate(0);
691 if (idebug) Cerr<<
"Element measure finalMesh = "<<aire<<finl;
692 aire_elem_calcul += aire;
694 aireArray(my_elem) += aire;
695 for (
int cc = 0; cc <dim_esp; cc++) baryArray(my_elem, cc) += aire * baryMean(cc);
696 for (
int cc = 0; cc <dim_esp; cc++) normalArray(my_elem, cc) += aire*
normalArr_(e,cc);
698 le_mc_mesh->getNodeIdsOfCell(my_elem, numNodes);
699 int nbNodesElem = int(numNodes.size()), the_node = 0;
700 for (
int l = 0; l <nbNodesElem; l++)
702 the_node = int(numNodes[l]);
703 isNodeDirichletArray(the_node) = 1.0 ;
708 Cerr<<
"TRUST element aireArray measure = "<<aireArray(my_elem)<<finl;
709 Cerr<<
"TRUST element aire weighted baryArray = ";
710 for (
int cc = 0; cc <dim_esp; cc++) Cerr<<baryArray(my_elem,cc)<<
" ";
712 Cerr<<
"TRUST element aire weighted normalArray = ";
713 for (
int cc = 0; cc <dim_esp; cc++) Cerr<<normalArray(my_elem,cc)<<
" ";
715 Cerr<<
"TRUST isNodeDirichletArray= 1 for nodes = ";
716 for (
int l = 0; l <nbNodesElem; l++) Cerr<< numNodes[l] <<
" ";
720 catch (
const std::runtime_error& err)
722 std::cerr <<
"Erreur : " << err.what() << std::endl;
727 aire_tot_calcul += aire_elem_calcul ;
728 const auto* arrayskin = measure_aSkinUMesh->getArray();
729 if (arrayskin->getNumberOfComponents() != 1)
730 Process::exit(
"measure_aSkinUMesh should have one composant \n");
731 const double val1 = arrayskin->getIJ(e, 0);
733 Cerr<<
"///////////// Measure of surface for element "<<e<<
" = "<<val1<<finl;
734 Cerr<<
"///////////// Measure of computed surface for element "<<e<<
" = "<<aire_elem_calcul <<finl;
737 mesure_sig_aSkinUMesh += val1;
741 DoubleTrav t1EulerArr(nbElemVol, dim_esp), t2EulerArr(nbElemVol, dim_esp);
742 for (
int elem = 0; elem <nbElemVol; elem++)
744 if (aireArray(elem) >0.)
747 for (
int cc = 0; cc <dim_esp; cc++)
749 baryArray(elem, cc) /= aireArray(elem) ;
750 normalArray(elem, cc) /= aireArray(elem) ;
751 norm += normalArray(elem, cc)*normalArray(elem, cc);
754 for (
int cc = 0; cc <dim_esp; cc++) normalArray(elem, cc) /= norm;
763 Cerr<<
"Measure of total surface for Immersed Boundary = "<<mesure_tot_aSkinUMesh<<finl;
764 Cerr<<
"Measure of sum of elementary surfaces for Immersed Boundary = "<<mesure_sig_aSkinUMesh<<finl;
765 Cerr<<
"Measure of total computed surface = "<<aire_tot_calcul<<
" >>>>>>>>>>>>>>>>"<<finl;
770 DoubleTab& rotationArray = champ_rotation_->valeurs();
778 if (status != 0) status = 0;
780 MCAuto<MEDCoupling::DataArrayDouble> outputCoords(MEDCoupling::DataArrayDouble::New());
781 MCAuto<MEDCoupling::DataArrayDouble> MC_p_test(MEDCoupling::DataArrayDouble::New());
782 MCAuto<MEDCoupling::DataArrayDouble> dv_outputCoords(MEDCoupling::DataArrayDouble::New());
785 const double *mc_coords1 = polyMesh1->getCoords()->begin();
786 int nbNodes1 = int(polyMesh1->getNumberOfNodes());
788 coords1.
resize(nbNodes1, (dim_esp-1));
789 std::copy(mc_coords1, mc_coords1+coords1.
size_array(), coords1.
addr());
790 MCAuto<MEDCouplingUMesh> polyEdgeMesh1(polyMesh1->buildBoundaryMesh(
false));
791 int nbEdge1 = int(polyEdgeMesh1->getNumberOfCells());
794 Cerr<<
">>> Prepro_IBM_base::intersectPolyPoly2D: Cell and node nb polyEdgeMesh1 = "<<int(polyEdgeMesh1->getNumberOfCells())<<
" "<<int(polyEdgeMesh1->getNumberOfNodes())<<finl;
798 const double *mc_coords2 = polyMesh2->getCoords()->begin();
799 int nbNodes2 = int(polyMesh2->getNumberOfNodes());
801 coords2.
resize(nbNodes2, (dim_esp-1));
802 std::copy(mc_coords2, mc_coords2+coords2.
size_array(), coords2.
addr());
803 MCAuto<MEDCouplingUMesh> polyEdgeMesh2(polyMesh2->buildBoundaryMesh(
false));
806 Cerr<<
">>> Prepro_IBM_base::intersectPolyPoly2D: Cell and node nb polyEdgeMesh2 = "<<int(polyEdgeMesh2->getNumberOfCells())<<
" "<<int(polyEdgeMesh2->getNumberOfNodes())<<finl;
810 DoubleTrav p_test(dim_esp-1);
811 for (
int i=0; i<nbNodes1; i++)
813 for (
int k=0; k<(dim_esp-1); k++) p_test(k) = coords1(i,k);
814 if (polyMesh2->getCellContainingPoint(p_test.
addr(), eps) != -1)
816 MC_p_test->alloc(1, (dim_esp-1));
817 std::copy(p_test.
addr(), p_test.
addr() + (dim_esp-1), MC_p_test->getPointer());
818 MC_p_test->declareAsNew();
819 if (outputCoords->isAllocated())
821 outputCoords->aggregate(MC_p_test);
825 outputCoords->alloc(1,(dim_esp-1));
826 double * tmp = outputCoords->getPointer();
827 std::copy(p_test.
addr(), p_test.
addr() + (dim_esp-1), tmp);
828 outputCoords->declareAsNew();
833 for (
int i=0; i<nbNodes2; i++)
835 for (
int k=0; k<(dim_esp-1); k++) p_test(k) = coords2(i,k);
836 if (polyMesh1->getCellContainingPoint(p_test.
addr(), eps) != -1)
838 MC_p_test->alloc(1, (dim_esp-1));
839 std::copy(p_test.
addr(), p_test.
addr() + (dim_esp-1), MC_p_test->getPointer());
840 MC_p_test->declareAsNew();
841 if (outputCoords->isAllocated())
843 outputCoords->aggregate(MC_p_test);
847 outputCoords->alloc(1,(dim_esp-1));
848 double * tmp = outputCoords->getPointer();
849 std::copy(p_test.
addr(), p_test.
addr() + (dim_esp-1), tmp);
850 outputCoords->declareAsNew();
854 if (!(outputCoords->isAllocated()))
861 for (
int i=0; i<nbEdge1; i++)
863 std::vector< mcIdType > numNodes;
864 polyEdgeMesh1->getNodeIdsOfCell(i, numNodes);
865 if (numNodes.size() > 2)
867 Cerr<<
">>>Prepro_IBM_base::intersectPolyPoly2D(): node nb = "<<numNodes.size()<<
" for edge "<<i<<
" => CHELOU..."<<finl;
871 DoubleTrav point0(dim_esp-1), point1(dim_esp-1);
872 for (
int k=0; k<(dim_esp-1); k++) point0(k) = coords1(
int(numNodes[0]),k);
873 for (
int k=0; k<(dim_esp-1); k++) point1(k) = coords1(
int(numNodes[1]),k);
876 Cerr<<
">>> Prepro_IBM_base::intersectPolyPoly2D(): polyEdgeMesh1: edge "<<i<<
" nodes ";
877 for (
int ii=0; ii<int(numNodes.size()); ii++) Cerr<<numNodes[ii]<<
" ";
879 Cerr<<
" point0: "<<point0(0)<<
" "<<point0(1)<<finl;
880 Cerr<<
" point1: "<<point1(0)<<
" "<<point1(1)<<finl;
882 int status_segpoly = 0;
885 if (idebug) Cerr<<
">>> Prepro_IBM_base::intersectPolyPoly2D(): outputCoords nodes after intersectSegPoly2D = "<<int(outputCoords->getNumberOfTuples())<<finl;
887 MCAuto<MEDCouplingUMesh> outputMesh(MEDCouplingUMesh::New(
"output_mesh",(dim_esp-1)));
888 outputMesh->allocateCells(1);
890 MEDCoupling::DataArrayIdType *connect = 0, *connInd = 0;
891 outputCoords->findCommonTuples(eps, -1, connect, connInd);
892 MCAuto<MEDCoupling::DataArrayIdType> connectAuto(connect);
893 MCAuto<MEDCoupling::DataArrayIdType> connIndAuto(connInd);
894 if (idebug) Cerr<<
" connect and connInd tuples after findCommonTuples = "<<int(connect->getNumberOfTuples())<<
" "<<int(connInd->getNumberOfTuples())<<finl;
895 if(
int(connect->getNumberOfTuples()) > 0)
897 dv_outputCoords = outputCoords->getDifferentValues(eps);
898 if (idebug) Cerr<<
" nodes nb after getDifferentValues = "<<int(dv_outputCoords->getNumberOfTuples())<<finl;
899 outputMesh->setCoords(dv_outputCoords);
901 else outputMesh->setCoords(outputCoords);
903 const MEDCoupling::DataArrayDouble *finalCoords = outputMesh->getCoords();
904 int finalCoords_len = int(finalCoords->getNumberOfTuples());
905 if (idebug) Cerr<<
" Nb of tuples in finalCoords = "<<finalCoords_len<<finl;
906 if (finalCoords_len < 3)
912 Tab_conect.
resize(1, finalCoords_len);
913 for (
int node =0; node < finalCoords_len; node++) Tab_conect(0,node) = node;
914 auto connect_ptr = Tab_conect.
addr();
915 std::vector<mcIdType> Connect(connect_ptr, connect_ptr+Tab_conect.
dimension(1));
916 INTERP_KERNEL::NormalizedCellType typ_fac_mc = INTERP_KERNEL::NORM_POLYGON;
917 outputMesh->insertNextCell(typ_fac_mc, Tab_conect.
dimension(1), Connect.data());
918 outputMesh->finishInsertingCells();
935 std::vector<mcIdType> numNodes2D;
939 MCAuto<MEDCouplingFieldDouble> measure(outputMesh->getMeasureField(
true));
940 double aire = measure->accumulate(0);
944 coords.
resize(
int(outputMesh->getNumberOfNodes()), outputMesh->getMeshDimension());
945 const double *mc_Coords = outputMesh->getCoords()->begin();
946 std::copy(mc_Coords, mc_Coords+coords.
size_array(), coords.
addr());
947 Cerr <<
"intersectPolyPoly2D: Element measure outputMesh = "<<aire<<
" with tuples : " << finl;
948 for (
int n = 0; n <int(outputMesh->getNumberOfNodes()); n++)
950 for (
int cc = 0; cc < outputMesh->getMeshDimension(); cc++) Cerr <<coords(n, cc) <<
" ";
953 outputMesh->getNodeIdsOfCell(0, numNodes2D);
954 for (
int node =0; node < int(numNodes2D.size()); node++) Cerr <<
int(numNodes2D[node]) <<
" ";
957 if (
int(outputMesh->getCoords()->getNumberOfTuples()) == 4)
960 const mcIdType old2newIds[] = {0, 1, 3, 2};
961 outputMesh->renumberNodesInConn(old2newIds);
963 outputMesh->getNodeIdsOfCell(0, numNodes2D);
964 MCAuto<MEDCouplingFieldDouble> measure_modified(outputMesh->getMeasureField(
true));
965 aire = measure_modified->accumulate(0);
966 Cerr<<
" Element measure outputMesh = "<<aire<<
" with modified cell connectivity => ";
967 for (
int node =0; node < int(numNodes2D.size()); node++) Cerr <<
int(numNodes2D[node]) <<
" ";
973 const mcIdType old2newIds_bis[] = {0, 1, 3, 2};
974 outputMesh->renumberNodesInConn(old2newIds_bis);
975 const mcIdType old2newIds_ter[] = {3, 1, 2, 0};
976 outputMesh->renumberNodesInConn(old2newIds_ter);
978 outputMesh->getNodeIdsOfCell(0, numNodes2D);
979 MCAuto<MEDCouplingFieldDouble> measure_modified_bis(outputMesh->getMeasureField(
true));
980 aire = measure_modified_bis->accumulate(0);
981 Cerr<<
" Element measure outputMesh = "<<aire<<
" with modified cell connectivity => ";
982 for (
int node =0; node < int(numNodes2D.size()); node++) Cerr <<
int(numNodes2D[node]) <<
" ";
987 Cerr<<
"Element measure outputMesh = "<<aire;
988 Cerr<<
" nothing to do :-( "<<finl;
997 Cerr<<
" Element measure outputMesh = 0. Wrong number of nodes <> 4 : "<<int(outputMesh->getCoords()->getNumberOfTuples())<<finl;
1005 const double *mc_finalCoords = outputMesh->getCoords()->begin();
1006 finalcoords.
resize(
int(outputMesh->getNumberOfNodes()), outputMesh->getMeshDimension());
1007 std::copy(mc_finalCoords, mc_finalCoords+finalcoords.
size_array(), finalcoords.
addr());
1010 outputMesh->getNodeIdsOfCell(0, numNodes2D);
1011 for (
int node =0; node < int(numNodes2D.size()); node++) Tab_conect(0,node) = int(numNodes2D[node]);
1127 const Domaine& le_dom = mon_pb_.valeur().
domaine();
1128 int nb_som = le_dom.
nb_som();
1132 Noms nom_rot(dim_esp*dim_esp);
1133 Noms unites_rot(dim_esp*dim_esp);
1134 Noms nom_vect(dim_esp );
1135 Noms unites_vect(dim_esp );
1136 unites_vect[0] =
"m";
1137 unites_vect[1] =
"m";
1138 unites_vect[2] =
"m";
1144 ecr_med.
ecrire_champ(
"CHAMPMAILLE",
"rotation", champ_rotation_->valeurs(), unites_rot, nom_rot, type_elem, 0.);
1148 ecr_med.
ecrire_champ(
"CHAMPMAILLE",
"barycentre", champ_bary_->valeurs(), unites_vect, nom_vect, type_elem, 0.);
1152 ecr_med.
ecrire_champ(
"CHAMPMAILLE",
"normale", champ_normal_->valeurs(), unites_vect, nom_vect, type_elem, 0.);
1153 ecr_med.
ecrire_champ(
"CHAMPMAILLE",
"corresp_elems", corresp_elems_->valeurs(), corresp_elems_->unites(), corresp_elems_->noms_compo(), type_elem, 0.);
1155 ecr_med.
ecrire_champ(
"CHAMPPOINT",
"is_node_dirichlet", isNodeDirichlet_->valeurs(), isNodeDirichlet_->unites(), isNodeDirichlet_->noms_compo(), type_elem, 0.);
1160 ecr_med.
ecrire_champ(
"CHAMPPOINT",
"projection_solide", solid_points_->valeurs(), unites_vect, nom_vect, type_elem, 0.);
1161 ecr_med.
ecrire_champ(
"CHAMPPOINT",
"element_projection_solide", solid_elems_->valeurs(), unites_vect, nom_vect, type_elem, 0.);
1163 ecr_med.
ecrire_champ(
"CHAMPPOINT",
"projection_fluide", fluid_points_->valeurs(), unites_vect, nom_vect, type_elem, 0.);
1164 ecr_med.
ecrire_champ(
"CHAMPPOINT",
"element_projection_fluide", fluid_elems_->valeurs(), fluid_elems_->unites(), fluid_elems_->noms_compo(), type_elem, 0.);
1166 ecr_med.
ecrire_champ(
"CHAMPMAILLE",
"h_max_elem", h_max_elem_->valeurs(), h_max_elem_->unites(), h_max_elem_->noms_compo(), type_elem, 0.);
1167 ecr_med.
ecrire_champ(
"CHAMPPOINT",
"h_max_node", h_max_node_->valeurs(), h_max_node_->unites(), h_max_node_->noms_compo(), type_elem, 0.);
1170 mon_pb_.valeur().discretisation().discretiser_champ(
"champ_sommets",le_dom_dis,
"sommets_voisins",
"",1,0., sommets_voisins);
1171 DoubleTab& sommets_voisinsArray = sommets_voisins->valeurs();
1172 sommets_voisinsArray = 0.0;
1173 for (
int node=0; node<nb_som; node++)
1178 for (
int index=0; index < the_list.
size(); index++) sommets_voisinsArray(the_list[index]) += 1.;
1181 ecr_med.
ecrire_champ(
"CHAMPPOINT",
"sommets_voisins", sommets_voisins->valeurs(), sommets_voisins->unites(), sommets_voisins->noms_compo(), type_elem, 0.);