157typename ErrorEstimation<SC,LO,GO,NO>::MultiVectorPtr_Type
ErrorEstimation<SC,LO,GO,NO>::estimateError(MeshUnstrPtr_Type inputMeshP12, MeshUnstrPtr_Type inputMeshP1, BlockMultiVectorConstPtr_Type valuesSolution, RhsFunc_Type rhsFunc, std::string FETypeV){
160 inputMesh_ = inputMeshP12;
161 inputMeshP1_ = inputMeshP1;
172 if(FEType2_ !=
"P1" && FEType2_ !=
"P2"){
173 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::runtime_error,
"Error Estimation only works for Triangular P1 or P2 Elements");
177 ElementsPtr_Type elements = inputMesh_->getElementsC();
178 EdgeElementsPtr_Type edgeElements = inputMesh_->getEdgeElements();
179 MapConstPtr_Type elementMap = inputMesh_->getElementMap();
180 vec2D_dbl_ptr_Type points = inputMesh_->getPointsRepeated();
181 int myRank = inputMesh_->comm_->getRank();
182 surfaceElements_ = inputMesh_->getSurfaceTriangleElements();
184 this->dim_ = inputMesh_->dim_;
190 MESH_TIMER_START(errorEstimation,
" Error Estimation ");
192 edgeElements->matchEdgesToElements(elementMap);
194 vec2D_GO_Type elementsOfEdgesGlobal = edgeElements->getElementsOfEdgeGlobal();
195 vec2D_LO_Type elementsOfEdgesLocal = edgeElements->getElementsOfEdgeLocal();
198 MultiVectorPtr_Type errorElementMv = Teuchos::rcp(
new MultiVector_Type( elementMap) );
199 Teuchos::ArrayRCP<SC> errorElement = errorElementMv->getDataNonConst(0);
202 double maxErrorElLoc=0.0;
208 vec_int_Type edgeNumbers(3);
217 vec_dbl_Type areaTriangles(elements->numberElements());
218 vec_dbl_Type rho_T(elements->numberElements());
219 vec_dbl_Type C_T(elements->numberElements());
220 vec_dbl_Type h_T =
calcDiamTriangles(elements,points, areaTriangles, rho_T, C_T);
223 double divUElement=0;
226 for(
int k=0; k< elements->numberElements();k++){
227 edgeNumbers = edgeElements->getEdgesOfElement(k);
229 if(problemType_ ==
"Stokes" || problemType_ ==
"NavierStokes"){
233 errorElement[k] = std::sqrt(1./2*(u_Jump[edgeNumbers[0]]+u_Jump[edgeNumbers[1]]+u_Jump[edgeNumbers[2]])+divUElement+ h_T[k]*h_T[k]*resElement );
235 if(maxErrorElLoc < errorElement[k] )
236 maxErrorElLoc = errorElement[k];
239 reduceAll<int, double> (*inputMesh_->getComm(), REDUCE_MAX, maxErrorElLoc, outArg (maxErrorElLoc));
241 if( writeMeshQuality_ ){
243 double maxh_T, minh_T;
244 double maxC_T, minC_T;
245 double maxrho_T, minrho_T;
246 double maxArea_T, minArea_T;
248 auto it = max_element(h_T.begin(), h_T.end());
249 maxh_T = h_T[distance(h_T.begin(), it)];
250 it = min_element(h_T.begin(), h_T.end());
251 minh_T = h_T[distance(h_T.begin(), it)];
252 reduceAll<int, double> (*inputMesh_->getComm(), REDUCE_MAX, maxh_T, outArg (maxh_T));
253 reduceAll<int, double> (*inputMesh_->getComm(), REDUCE_MAX, minh_T, outArg (minh_T));
255 it = max_element(rho_T.begin(), rho_T.end());
256 maxrho_T = rho_T[distance(rho_T.begin(), it)];
257 it = min_element(rho_T.begin(), rho_T.end());
258 minrho_T = rho_T[distance(rho_T.begin(), it)];
259 reduceAll<int, double> (*inputMesh_->getComm(), REDUCE_MAX, maxrho_T, outArg (maxrho_T));
260 reduceAll<int, double> (*inputMesh_->getComm(), REDUCE_MAX, minrho_T, outArg (minrho_T));
262 it = max_element(areaTriangles.begin(), areaTriangles.end());
263 maxArea_T = areaTriangles[distance(areaTriangles.begin(), it)];
264 it = min_element(areaTriangles.begin(), areaTriangles.end());
265 minArea_T = areaTriangles[distance(areaTriangles.begin(), it)];
266 reduceAll<int, double> (*inputMesh_->getComm(), REDUCE_MAX, maxArea_T, outArg (maxArea_T));
267 reduceAll<int, double> (*inputMesh_->getComm(), REDUCE_MAX, minArea_T, outArg (minArea_T));
270 it = max_element(C_T.begin(), C_T.end());
271 maxC_T = C_T[distance(C_T.begin(), it)];
272 it = min_element(C_T.begin(), C_T.end());
273 minC_T = C_T[distance(C_T.begin(), it)];
274 reduceAll<int, double> (*inputMesh_->getComm(), REDUCE_MAX, maxC_T, outArg (maxC_T));
275 reduceAll<int, double> (*inputMesh_->getComm(), REDUCE_MAX, minC_T, outArg (minC_T));
277 if(inputMesh_->getComm()->getRank() == 0){
278 cout <<
"\tMesh Quality Assessment 2D of current mesh" << endl;
279 cout <<
"\t__________________________________________________________________________________________________________ " << endl;
281 cout <<
" \tCircumdiameter h_T: \t\t" <<
"max. = " << setprecision(5) << maxh_T <<
"\tmin. = " << setprecision(5) << minh_T << endl;
282 cout <<
" \tIncircumdiameter rho_T:\t\t" <<
"max. = " << setprecision(5) <<maxrho_T <<
"\tmin. = " <<setprecision(5) << minrho_T << endl;
283 cout <<
" \tArea of Triangles:\t \t" <<
"max. = " << setprecision(5) << maxArea_T <<
"\tmin. = " << setprecision(5) << minArea_T << endl;
284 cout <<
" \tShape parameter:\t \t" <<
"max. = " << setprecision(5) << maxC_T <<
"\tmin. = " << setprecision(5) <<minC_T << endl;
285 cout <<
" \tThe maximal Error of Elements is " << maxErrorElLoc << endl;
286 cout <<
"\t__________________________________________________________________________________________________________ " << endl;
294 else if(this->dim_ == 3){
298 this->surfaceElements_->matchSurfacesToElements(elementMap);
299 SurfaceElementsPtr_Type surfaceElements = this->surfaceElements_;
302 vec_dbl_Type errorSurfacesInterior(4);
304 vec_int_Type surfaceNumbers(4);
306 vec_dbl_Type u1(3),u2(3);
316 vec_dbl_Type areaTriangles(surfaceElements->numberElements());
317 vec_dbl_Type rho_Tri(surfaceElements->numberElements());
318 vec_dbl_Type C_Tri(surfaceElements->numberElements());
319 vec_dbl_Type h_Tri =
calcDiamTriangles3D(surfaceElements,points, areaTriangles, rho_Tri, C_Tri);
322 vec_dbl_Type rho_T =
calcRhoTetraeder(elements,surfaceElements, volTetraeder, areaTriangles);
325 vec_dbl_Type p1(3),p2(3);
337 double divUElement=0;
341 for(
int k=0; k< elements->numberElements();k++){
342 surfaceNumbers = surfaceElements->getSurfacesOfElement(k);
345 if(problemType_ ==
"Stokes" || problemType_ ==
"NavierStokes")
347 errorElement[k] = std::sqrt(1./2*(u_Jump[surfaceNumbers[0]]+u_Jump[surfaceNumbers[1]]+u_Jump[surfaceNumbers[2]]+u_Jump[surfaceNumbers[3]])+divUElement +h_T[k]*h_T[k]*resElement );
348 if(maxErrorElLoc < errorElement[k] )
349 maxErrorElLoc = errorElement[k];
352 reduceAll<int, double> (*inputMesh_->getComm(), REDUCE_MAX, maxErrorElLoc, outArg (maxErrorElLoc));
354 if( writeMeshQuality_ ){
355 double maxh_T, minh_T, maxh_Tri, minh_Tri;
356 double maxC_T, minC_T, maxC_Tri, minC_Tri;
357 double maxrho_T, minrho_T, maxrho_Tri, minrho_Tri;
358 double maxArea_T, minArea_T;
359 double maxVol_T, minVol_T;
362 auto it = max_element(h_Tri.begin(), h_Tri.end());
363 maxh_Tri = h_Tri[distance(h_Tri.begin(), it)];
364 it = min_element(h_Tri.begin(), h_Tri.end());
366 minh_Tri = h_Tri[distance(h_Tri.begin(), it)];
367 reduceAll<int, double> (*inputMesh_->getComm(), REDUCE_MAX, maxh_Tri, outArg (maxh_Tri));
368 reduceAll<int, double> (*inputMesh_->getComm(), REDUCE_MAX, minh_Tri, outArg (minh_Tri));
371 it = max_element(h_T.begin(), h_T.end());
372 maxh_T = h_T[distance(h_T.begin(), it)];
373 it = min_element(h_T.begin(), h_T.end());
375 minh_T = h_T[distance(h_T.begin(), it)];
376 reduceAll<int, double> (*inputMesh_->getComm(), REDUCE_MAX, maxh_T, outArg (maxh_T));
377 reduceAll<int, double> (*inputMesh_->getComm(), REDUCE_MAX, minh_T, outArg (minh_T));
380 it = max_element(rho_Tri.begin(), rho_Tri.end());
381 maxrho_Tri = rho_Tri[distance(rho_Tri.begin(), it)];
382 it = min_element(rho_Tri.begin(), rho_Tri.end());
383 minrho_Tri = rho_Tri[distance(rho_Tri.begin(), it)];
384 reduceAll<int, double> (*inputMesh_->getComm(), REDUCE_MAX, maxrho_Tri, outArg (maxrho_Tri));
385 reduceAll<int, double> (*inputMesh_->getComm(), REDUCE_MAX, minrho_Tri, outArg (minrho_Tri));
388 it = max_element(rho_T.begin(), rho_T.end());
389 maxrho_T = rho_T[distance(rho_T.begin(), it)];
390 it = min_element(rho_T.begin(), rho_T.end());
391 minrho_T = rho_T[distance(rho_T.begin(), it)];
392 reduceAll<int, double> (*inputMesh_->getComm(), REDUCE_MAX, maxrho_T, outArg (maxrho_T));
393 reduceAll<int, double> (*inputMesh_->getComm(), REDUCE_MAX, minrho_T, outArg (minrho_T));
396 it = max_element(areaTriangles.begin(), areaTriangles.end());
397 maxArea_T = areaTriangles[distance(areaTriangles.begin(), it)];
398 it = min_element(areaTriangles.begin(), areaTriangles.end());
399 minArea_T = areaTriangles[distance(areaTriangles.begin(), it)];
400 reduceAll<int, double> (*inputMesh_->getComm(), REDUCE_MAX, maxArea_T, outArg (maxArea_T));
401 reduceAll<int, double> (*inputMesh_->getComm(), REDUCE_MAX, minArea_T, outArg (minArea_T));
404 it = max_element(volTetraeder.begin(), volTetraeder.end());
405 maxVol_T = volTetraeder[distance(volTetraeder.begin(), it)];
407 it = min_element(volTetraeder.begin(), volTetraeder.end());
408 minVol_T = volTetraeder[distance(volTetraeder.begin(), it)];
410 reduceAll<int, double> (*inputMesh_->getComm(), REDUCE_MAX, maxVol_T, outArg (maxVol_T));
411 reduceAll<int, double> (*inputMesh_->getComm(), REDUCE_MAX, minVol_T, outArg (minVol_T));
414 it = max_element(C_Tri.begin(), C_Tri.end());
415 maxC_Tri = C_Tri[distance(C_Tri.begin(), it)];
417 it = min_element(C_Tri.begin(), C_Tri.end());
418 minC_Tri = C_Tri[distance(C_Tri.begin(), it)];
420 reduceAll<int, double> (*inputMesh_->getComm(), REDUCE_MAX, maxC_Tri, outArg (maxC_Tri));
421 reduceAll<int, double> (*inputMesh_->getComm(), REDUCE_MAX, minC_Tri, outArg (minC_Tri));
424 vec_dbl_Type C_T(elements->numberElements());
425 for(
int i=0; i< h_T.size(); i++){
426 C_T[i] = h_T[i] / rho_T[i];
428 it = max_element(C_T.begin(), C_T.end());
429 maxC_T = C_T[distance(C_T.begin(), it)];
431 it = min_element(C_T.begin(), C_T.end());
432 minC_T = C_T[distance(C_T.begin(), it)];
434 reduceAll<int, double> (*inputMesh_->getComm(), REDUCE_MAX, maxC_T, outArg (maxC_T));
435 reduceAll<int, double> (*inputMesh_->getComm(), REDUCE_MAX, minC_T, outArg (minC_T));
438 if(inputMesh_->getComm()->getRank() == 0){
439 cout <<
" \t-- Mesh Quality Assessment 3D of current mesh level -- \t" << endl;
440 cout <<
"\t__________________________________________________________________________________________________________ " << endl;
442 cout <<
" \tCircumdiameter h_T:\t\t\t" <<
"max. = " << setprecision(5) << maxh_T <<
" min. = " << setprecision(5) <<minh_T << endl;
443 cout <<
" \tIncircumdiameter rho_T:\t\t\t" <<
"max. = " <<setprecision(5) << maxrho_T <<
" min. = " << setprecision(5) <<minrho_T << endl;
444 cout <<
" \tCircumdiameter h_Tri:\t\t\t" <<
"max. = " <<setprecision(5) << maxh_Tri <<
" min. = " << setprecision(5) <<minh_Tri << endl;
445 cout <<
" \tIncircumdiameter rho_Tri:\t\t" <<
"max. = " << setprecision(5) <<maxrho_Tri <<
" min. = " << setprecision(5) <<minrho_Tri << endl;
446 cout <<
" \tArea of Triangles: \t\t\t" <<
"max. = " << setprecision(5) <<maxArea_T <<
" min. = " << setprecision(5) <<minArea_T << endl;
447 cout <<
" \tVolume of Tetraeder: \t\t\t" <<
"max. = " << setprecision(5) <<maxVol_T <<
" min. = " << setprecision(5) <<minVol_T << endl;
448 cout <<
" \tShape parameter Tetraeder: \t\t" <<
"max. = " << setprecision(5) << maxC_T <<
" min. = " << setprecision(5) <<minC_T << endl;
449 cout <<
" \tShape parameter Triangles: \t\t" <<
"max. = " << setprecision(5) << maxC_Tri <<
" min. = " << setprecision(5) <<minC_Tri << endl;
450 cout <<
" \tThe maximal Error of Elements is \t" << maxErrorElLoc << endl;
451 cout <<
"\t__________________________________________________________________________________________________________ " << endl;
458 errorEstimation_ = errorElementMv;
460 MESH_TIMER_STOP(errorEstimation);
462 return errorElementMv;
785 int surfaceNumbers = dim_+1 ;
788 vec2D_dbl_ptr_Type points = inputMesh_->pointsRep_;
789 ElementsPtr_Type elements = inputMesh_->getElementsC();
790 EdgeElementsPtr_Type edgeElements = inputMesh_->getEdgeElements();
791 MapConstPtr_Type elementMap = inputMesh_->getElementMap();
792 SurfaceElementsPtr_Type surfaceTriangleElements = this->surfaceElements_;
793 vec_int_Type surfaceElementsIds(surfaceNumbers);
794 MapConstPtr_Type surfaceMap;
797 int numberSurfaceElements=0;
799 numberSurfaceElements = edgeElements->numberElements();
800 surfaceMap= inputMesh_->edgeMap_;
803 numberSurfaceElements = surfaceTriangleElements->numberElements();
804 surfaceMap= this->surfaceTriangleMap_;
809 int numNodes= dim_+1;
812 if(FEType2_ ==
"P2"){
824 vec3D_dbl_Type vec_El(numberSurfaceElements,vec2D_dbl_Type(quadPSize,vec_dbl_Type(dofsSol)));
825 vec3D_dbl_Type vec_El1(numberSurfaceElements,vec2D_dbl_Type(quadPSize,vec_dbl_Type(dofsSol)));
826 vec3D_dbl_Type vec_El2(numberSurfaceElements,vec2D_dbl_Type(quadPSize,vec_dbl_Type(dofsSol)));
828 vec3D_dbl_Type vec_El_Exp(numberSurfaceElements,vec2D_dbl_Type(quadPSize,vec_dbl_Type(dofsSol)));
831 vec_GO_Type elementImportIDs(0);
832 vec_GO_Type elementExportIDs(0);
833 vec_LO_Type surfaceIDsLocal(0);
836 vec_LO_Type kn1(numNodes);
844 edgeElements->matchEdgesToElements(elementMap);
847 vec2D_GO_Type elementsOfSurfaceGlobal;
848 vec2D_LO_Type elementsOfSurfaceLocal;
851 elementsOfSurfaceGlobal = edgeElements->getElementsOfEdgeGlobal();
852 elementsOfSurfaceLocal = edgeElements->getElementsOfEdgeLocal();
855 elementsOfSurfaceGlobal = surfaceTriangleElements->getElementsOfSurfaceGlobal();
856 elementsOfSurfaceLocal = surfaceTriangleElements->getElementsOfSurfaceLocal();
860 vec_dbl_Type v_E(dim_);
865 for(
int k=0; k< numberSurfaceElements;k++){
867 bool interiorElement=
false;
869 if((edgeElements->getElement(k).getFlag() == 10 || edgeElements->getElement(k).getFlag() == 0))
870 interiorElement=
true;
873 if((surfaceTriangleElements->getElement(k).getFlag() == 10 || surfaceTriangleElements->getElement(k).getFlag() == 0))
874 interiorElement=
true;
876 if(interiorElement ==
true && elementsOfSurfaceLocal.at(k).size() > 1){
878 vec_dbl_Type quadWeights(quadPSize);
879 vec2D_dbl_Type quadPoints;
882 quadPoints =
getQuadValues(dim_, FEType2_ ,
"Surface", quadWeights, edgeElements->getElement(k));
883 v_E.at(0) = points->at(edgeElements->getElement(k).getNode(0)).at(1) - points->at(edgeElements->getElement(k).getNode(1)).at(1);
884 v_E.at(1) = -(points->at(edgeElements->getElement(k).getNode(0)).at(0) - points->at(edgeElements->getElement(k).getNode(1)).at(0));
885 norm_v_E = std::sqrt(std::pow(v_E[0],2)+std::pow(v_E[1],2));
888 quadPoints =
getQuadValues(dim_, FEType2_ ,
"Surface", quadWeights, surfaceTriangleElements->getElement(k));
890 vec_dbl_Type p1(3),p2(3);
891 p1[0] = points->at(surfaceTriangleElements->getElement(k).getNode(0)).at(0) - points->at(surfaceTriangleElements->getElement(k).getNode(1)).at(0);
892 p1[1] = points->at(surfaceTriangleElements->getElement(k).getNode(0)).at(1) - points->at(surfaceTriangleElements->getElement(k).getNode(1)).at(1);
893 p1[2] = points->at(surfaceTriangleElements->getElement(k).getNode(0)).at(2) - points->at(surfaceTriangleElements->getElement(k).getNode(1)).at(2);
895 p2[0] = points->at(surfaceTriangleElements->getElement(k).getNode(0)).at(0) - points->at(surfaceTriangleElements->getElement(k).getNode(2)).at(0);
896 p2[1] = points->at(surfaceTriangleElements->getElement(k).getNode(0)).at(1) - points->at(surfaceTriangleElements->getElement(k).getNode(2)).at(1);
897 p2[2] = points->at(surfaceTriangleElements->getElement(k).getNode(0)).at(2) - points->at(surfaceTriangleElements->getElement(k).getNode(2)).at(2);
899 v_E[0] = p1[1]*p2[2] - p1[2]*p2[1];
900 v_E[1] = p1[2]*p2[0] - p1[0]*p2[2];
901 v_E[2] = p1[0]*p2[1] - p1[1]*p2[0];
903 norm_v_E = std::sqrt(std::pow(v_E[0],2)+std::pow(v_E[1],2)+std::pow(v_E[2],2));
906 vec_LO_Type elementsIDs(0);
908 if(elementsOfSurfaceLocal.at(k).at(0) != -1){
909 elementsIDs.push_back(elementsOfSurfaceLocal.at(k).at(0));
911 if(elementsOfSurfaceLocal.at(k).at(1) != -1){
912 elementsIDs.push_back(elementsOfSurfaceLocal.at(k).at(1));
914 for(
int i=0; i<elementsIDs.size(); i++){
918 kn1= elements->getElement(elementsIDs[i]).getVectorNodeListNonConst();
923 for (
int s=0; s<dim_; s++) {
925 for (
int t=0; t<dim_; t++) {
926 B1[t][s] = points->at(index).at(t) -points->at(index0).at(t);
930 detB1 = B1.computeInverse(Binv1);
931 detB1 = std::fabs(detB1);
933 vec2D_dbl_Type quadPointsT1(quadPSize,vec_dbl_Type(dim_));
934 for(
int l=0; l< quadPSize; l++){
935 for(
int p=0; p< dim_ ; p++){
936 for(
int q=0; q< dim_; q++){
937 quadPointsT1[l][p] += Binv1[p][q]* (quadPoints[l][q] - points->at(elements->getElement(elementsIDs[i]).getNode(0)).at(q)) ;
943 for(
int l=0; l< quadPSize; l++){
944 if(phiDerivative ==
"Gradient"){
945 vec2D_dbl_Type deriPhi1 =
gradPhi(dim_, intFE, quadPointsT1[l]);
946 vec2D_dbl_Type deriPhiT1(numNodes,vec_dbl_Type(dim_));
947 for(
int q=0; q<dim_; q++){
948 for(
int p=0;p<numNodes; p++){
949 for(
int s=0; s< dim_ ; s++)
950 deriPhiT1[p][q] += (deriPhi1[p][s]*Binv1[s][q]);
953 vec2D_dbl_Type u1_Tmp(dofsSol, vec_dbl_Type(dim_));
954 Teuchos::ArrayRCP< SC > valuesSolRep;
955 for(
int d =0; d < dofsSol ; d++){
956 valuesSolRep = valuesSolutionRepVel_->getBlock(d)->getDataNonConst(0);
957 for(
int s=0; s<dim_; s++){
958 for(
int t=0; t< numNodes ; t++){
959 u1_Tmp[d][s] += valuesSolRep[kn1[t]]*deriPhiT1[t][s] ;
965 for(
int d =0; d < dofsSol ; d++){
966 for(
int s=0; s<dim_; s++){
967 vec_El1[k][l][d] += (u1_Tmp[d][s])*(v_E[s]/norm_v_E);
969 vec_El1[k][l][d] = std::sqrt(quadWeights[l])* vec_El1[k][l][d];
973 for(
int d =0; d < dofsSol ; d++){
974 for(
int s=0; s<dim_; s++){
975 vec_El2[k][l][d] += (u1_Tmp[d][s])*(v_E[s]/norm_v_E);
977 vec_El2[k][l][d] = std::sqrt(quadWeights[l])* vec_El2[k][l][d];
984 if(phiDerivative ==
"None"){
985 vec_dbl_Type phiV =
phi(dim_, intFE, quadPointsT1[l]);
986 vec_dbl_Type vec_Tmp(dofsSol);
987 Teuchos::ArrayRCP< SC > valuesSolRep;
988 for(
int d =0; d < dofsSol ; d++){
989 valuesSolRep = valuesSolutionRepPre_->getBlock(d)->getDataNonConst(0);
990 for(
int t=0; t< phiV.size() ; t++){
991 vec_Tmp[d] += valuesSolRep[kn1[t]]*phiV[t] ;
995 for(
int d =0; d < dofsSol ; d++){
996 for(
int s=0; s<dim_; s++){
997 vec_El1[k][l][d] += (vec_Tmp[d])*(v_E[s]/norm_v_E);
999 vec_El1[k][l][d] = std::sqrt(quadWeights[l])* vec_El1[k][l][d];
1003 for(
int d =0; d < dofsSol ; d++){
1004 for(
int s=0; s<dim_; s++){
1005 vec_El2[k][l][d] += (vec_Tmp[d])*(v_E[s]/norm_v_E);
1007 vec_El2[k][l][d] = std::sqrt(quadWeights[l])* vec_El2[k][l][d];
1016 if(elementsOfSurfaceLocal.at(k).at(0) == -1 || elementsOfSurfaceLocal.at(k).at(1) == -1){
1018 elementImportIDs.push_back(surfaceMap->getGlobalElement(k));
1020 for(
int l=0; l< vec_El1[k].size() ;l++){
1021 for(
int d =0; d < dofsSol ; d++)
1022 vec_El_Exp[k][l][d] = vec_El1[k][l][d];
1027 inputMesh_->getComm()->barrier();
1031 sort(elementImportIDs.begin(),elementImportIDs.end());
1033 vec_GO_Type::iterator ip = unique( elementImportIDs.begin(), elementImportIDs.end());
1035 elementImportIDs.resize(distance(elementImportIDs.begin(), ip));
1036 Teuchos::ArrayView<GO> globalElementArrayImp = Teuchos::arrayViewFromVector( elementImportIDs);
1039 MapPtr_Type mapElementImport =
1040 Teuchos::rcp(
new Map_Type( Teuchos::OrdinalTraits<GO>::invalid(), globalElementArrayImp, 0, inputMesh_->getComm()) );
1043 int maxRank = std::get<1>(inputMesh_->rankRange_);
1044 MapPtr_Type mapElementsUnique = mapElementImport;
1047 if(maxRank>0 && mapElementsUnique->getMaxAllGlobalIndex() > 0)
1048 mapElementsUnique = mapElementImport->buildUniqueMap( inputMesh_->rankRange_ );
1052 MultiVectorPtr_Type valuesU_x_expU = Teuchos::rcp(
new MultiVector_Type( mapElementsUnique, 1 ) );
1053 MultiVectorPtr_Type valuesU_y_expU = Teuchos::rcp(
new MultiVector_Type( mapElementsUnique, 1 ) );
1054 MultiVectorPtr_Type valuesU_z_expU = Teuchos::rcp(
new MultiVector_Type( mapElementsUnique, 1 ) );
1056 MultiVectorPtr_Type valuesU_x_impU = Teuchos::rcp(
new MultiVector_Type( mapElementsUnique, 1 ) );
1057 MultiVectorPtr_Type valuesU_y_impU = Teuchos::rcp(
new MultiVector_Type( mapElementsUnique, 1 ) );
1058 MultiVectorPtr_Type valuesU_z_impU = Teuchos::rcp(
new MultiVector_Type( mapElementsUnique, 1 ) );
1061 MultiVectorPtr_Type valuesU_x_imp = Teuchos::rcp(
new MultiVector_Type( mapElementImport, 1 ) );
1062 MultiVectorPtr_Type valuesU_y_imp = Teuchos::rcp(
new MultiVector_Type( mapElementImport, 1 ) );
1063 MultiVectorPtr_Type valuesU_z_imp = Teuchos::rcp(
new MultiVector_Type( mapElementImport, 1 ) );
1065 MultiVectorPtr_Type valuesU_x_impF = Teuchos::rcp(
new MultiVector_Type( mapElementImport, 1 ) );
1066 MultiVectorPtr_Type valuesU_y_impF = Teuchos::rcp(
new MultiVector_Type( mapElementImport, 1 ) );
1067 MultiVectorPtr_Type valuesU_z_impF = Teuchos::rcp(
new MultiVector_Type( mapElementImport, 1 ) );
1070 Teuchos::ArrayRCP< SC > entriesU_x_imp = valuesU_x_imp->getDataNonConst(0);
1071 Teuchos::ArrayRCP< SC > entriesU_y_imp = valuesU_y_imp->getDataNonConst(0);
1072 Teuchos::ArrayRCP< SC > entriesU_z_imp = valuesU_z_imp->getDataNonConst(0);
1074 Teuchos::ArrayRCP< SC > entriesU_x_impF = valuesU_x_impF->getDataNonConst(0);
1075 Teuchos::ArrayRCP< SC > entriesU_y_impF = valuesU_y_impF->getDataNonConst(0);
1076 Teuchos::ArrayRCP< SC > entriesU_z_impF = valuesU_z_impF->getDataNonConst(0);
1079 for(
int i=0; i<quadPSize; i++){
1080 for(
int j=0; j<elementImportIDs.size(); j++){
1081 entriesU_x_imp[j] = vec_El_Exp[surfaceMap->getLocalElement(elementImportIDs[j])][i][0] ;
1083 entriesU_y_imp[j] = vec_El_Exp[surfaceMap->getLocalElement(elementImportIDs[j])][i][1] ;
1084 else if(dofsSol == 3)
1085 entriesU_z_imp[j] = vec_El_Exp[surfaceMap->getLocalElement(elementImportIDs[j])][i][2] ;
1088 valuesU_x_impU->importFromVector(valuesU_x_imp,
false,
"Insert");
1089 valuesU_y_impU->importFromVector(valuesU_y_imp,
false,
"Insert");
1090 valuesU_z_impU->importFromVector(valuesU_z_imp,
false,
"Insert");
1092 valuesU_x_expU->exportFromVector(valuesU_x_imp,
false,
"Insert");
1093 valuesU_y_expU->exportFromVector(valuesU_y_imp,
false,
"Insert");
1094 valuesU_z_expU->exportFromVector(valuesU_z_imp,
false,
"Insert");
1096 valuesU_x_impF->importFromVector(valuesU_x_impU,
false,
"Insert");
1097 valuesU_y_impF->importFromVector(valuesU_y_impU,
false,
"Insert");
1098 valuesU_z_impF->importFromVector(valuesU_z_impU,
false,
"Insert");
1100 valuesU_x_impF->exportFromVector(valuesU_x_expU,
false,
"Insert");
1101 valuesU_y_impF->exportFromVector(valuesU_y_expU,
false,
"Insert");
1102 valuesU_z_impF->exportFromVector(valuesU_z_expU,
false,
"Insert");
1104 for(
int j=0; j<elementImportIDs.size(); j++){
1105 vec_El2[surfaceMap->getLocalElement(elementImportIDs[j])][i][0] =entriesU_x_impF[j];
1107 vec_El2[surfaceMap->getLocalElement(elementImportIDs[j])][i][1] =entriesU_y_impF[j];
1108 else if(dofsSol ==3)
1109 vec_El2[surfaceMap->getLocalElement(elementImportIDs[j])][i][2] = entriesU_z_impF[j];
1112 for(
int i=0; i< numberSurfaceElements ; i++){
1113 for(
int j=0; j<quadPSize; j++){
1114 for(
int k=0; k< dofsSol ; k++){
1115 vec_El[i][j][k] = std::fabs(vec_El1[i][j][k]) - std::fabs(vec_El2[i][j][k]);
1324 vec_dbl_Type resElement(dofs_);
1326 int dim = this->dim_;
1335 vec_dbl_Type QuadW(t);
1336 vec2D_dbl_Type QuadPts =
getQuadValues(dim, FEType2_,
"Element", QuadW, element);
1339 if(this->FEType2_ ==
"P2")
1342 vec2D_dbl_ptr_Type points = inputMesh_->getPointsRepeated();
1346 vec_LO_Type nodeList = element.getVectorNodeListNonConst();
1353 int index0 = nodeList[0];
1354 for (
int s=0; s<dim; s++) {
1355 int index = nodeList[s+1];
1356 for (
int t=0; t<dim; t++) {
1357 B1[t][s] = points->at(index).at(t) - points->at(index0).at(t);
1362 detB1 = B1.computeInverse(Binv1);
1363 detB1 = std::fabs(detB1);
1365 vec_dbl_Type valueFunc(dofs_);
1367 vec2D_dbl_Type quadPointsTrans(QuadW.size(),vec_dbl_Type(dim));
1369 for(
int i=0; i< QuadW.size(); i++){
1370 for(
int j=0; j< dim; j++){
1371 for(
int k=0; k< dim; k++){
1372 quadPointsTrans[i][j] += B1[j][k]* QuadPts[i].at(k) ;
1374 quadPointsTrans[i][j] += points->at(element.getNode(0)).at(j);
1378 vec_dbl_Type nablaP(dim);
1379 if(problemType_ ==
"Stokes" || problemType_ ==
"NavierStokes"){
1380 Teuchos::ArrayRCP<SC> valuesSolutionRepPre = valuesSolutionRepPre_->getBlock(0)->getDataNonConst(0);
1381 vec2D_dbl_Type deriPhi =
gradPhi(dim, 1, QuadPts[0]);
1382 vec2D_dbl_Type deriPhiT(dim+1,vec_dbl_Type(dim));
1383 for(
int q=0; q<dim; q++){
1384 for(
int p=0;p<dim+1; p++){
1385 for(
int s=0; s< dim ; s++)
1386 deriPhiT[p][q] += (deriPhi[p][s]*Binv1[s][q]);
1390 for(
int s=0; s<dim; s++){
1391 for(
int t=0; t< dim+1 ; t++){
1392 nablaP[s] += valuesSolutionRepPre[nodeList[t]]*deriPhiT[t][s] ;
1397 vec2D_dbl_Type nablaU(dim,vec_dbl_Type(QuadW.size()));
1398 if(problemType_ ==
"NavierStokes"){
1399 for (UN w=0; w< QuadW.size(); w++){
1400 vec2D_dbl_Type deriPhi =
gradPhi(dim, intFE, QuadPts[w]);
1401 vec2D_dbl_Type deriPhiT(nodeList.size(),vec_dbl_Type(dim));
1402 for(
int q=0; q<dim; q++){
1403 for(
int p=0;p<nodeList.size(); p++){
1404 for(
int s=0; s< dim ; s++)
1405 deriPhiT[p][q] += (deriPhi[p][s]*Binv1[s][q]);
1409 Teuchos::ArrayRCP< SC > valuesSolRep;
1410 vec2D_dbl_Type vec_Tmp(nodeList.size(),vec_dbl_Type(dofs_));
1411 for(
int d =0; d < dofs_ ; d++){
1412 valuesSolRep = valuesSolutionRepVel_->getBlock(d)->getDataNonConst(0);
1413 for(
int t=0; t< nodeList.size() ; t++){
1414 vec_Tmp[t][d] = valuesSolRep[nodeList[t]];
1418 vec2D_dbl_Type u1_Tmp(dofs_, vec_dbl_Type(dim_));
1420 for(
int d =0; d < dofs_ ; d++){
1421 valuesSolRep = valuesSolutionRepVel_->getBlock(d)->getDataNonConst(0);
1422 for(
int s=0; s<dim; s++){
1423 for(
int t=0; t< nodeList.size() ; t++){
1424 u1_Tmp[d][s] += valuesSolRep[nodeList[t]]*deriPhiT[t][s] ;
1428 vec_dbl_Type phiV =
phi(dim, intFE, QuadPts[w]);
1429 for(
int d =0; d < dofs_ ; d++){
1430 for(
int t=0; t< nodeList.size() ; t++){
1431 for(
int s=0; s<dim; s++){
1432 nablaU[d][w] += vec_Tmp[t][s]*phiV[t]*u1_Tmp[s][d];
1440 vec_dbl_Type deltaU(dofs_);
1441 if(this->FEType2_ ==
"P2"){
1442 vec_dbl_Type deltaPhi(nodeList.size());
1443 if(this->dim_ == 2){
1444 deltaPhi={8, 4, 4, -8, 0, -8 };
1446 else if(this->dim_ == 3)
1447 deltaPhi={12, 4, 4, 4, -8, 0, -8, -8, 0, 0};
1449 for(
int j=0 ; j< dofs_; j++){
1450 Teuchos::ArrayRCP<SC> valuesSolutionRep = valuesSolutionRepVel_->getBlock(j)->getDataNonConst(0);
1451 for(
int i=0; i< nodeList.size() ; i++){
1452 deltaU[j] += deltaPhi[i]*valuesSolutionRep[nodeList[i]];
1456 for (UN w=0; w< QuadW.size(); w++){
1457 rhsFunc(&quadPointsTrans[w][0], &valueFunc[0] ,paras);
1458 for(
int j=0 ; j< dofs_; j++){
1459 resElement[j] += QuadW[w] * std::pow(valueFunc[j] + deltaU[j] - nablaU[j][w] - nablaP[j] ,2);
1462 double resElementValue =0.;
1463 for(
int j=0; j< dofs_ ; j++)
1464 resElementValue += resElement[j] *detB1;
1466 return resElementValue;
2035 int maxRank = std::get<1>(inputMesh_->rankRange_);
2036 const int myRank = inputMesh_->getComm()->getRank();
2038 vec_GO_Type globalProcs(0);
2039 for (
int i=0; i<= maxRank; i++)
2040 globalProcs.push_back(i);
2042 Teuchos::ArrayView<GO> globalProcArray = Teuchos::arrayViewFromVector( globalProcs);
2044 vec_GO_Type localProc(0);
2045 localProc.push_back(inputMesh_->getComm()->getRank());
2046 Teuchos::ArrayView<GO> localProcArray = Teuchos::arrayViewFromVector( localProc);
2048 MapPtr_Type mapGlobalProc =
2049 Teuchos::rcp(
new Map_Type( Teuchos::OrdinalTraits<GO>::invalid(), globalProcArray, 0, inputMesh_->getComm()) );
2051 MapPtr_Type mapProc =
2052 Teuchos::rcp(
new Map_Type( Teuchos::OrdinalTraits<GO>::invalid(), localProcArray, 0, inputMesh_->getComm()) );
2056 vec2D_int_Type interfaceSurfacesLocalId(1,vec_int_Type(1));
2059 MultiVectorLOPtr_Type exportLocalEntry = Teuchos::rcp(
new MultiVectorLO_Type( mapProc, 1 ) );
2063 int numSurfaces= surfaceElements_->numberElements();
2064 vec2D_GO_Type inzidenzIndices(0,vec_GO_Type(2));
2065 vec_LO_Type localSurfaceIndex(0);
2067 int surfacesUnique=0;
2069 vec2D_dbl_ptr_Type points = inputMesh_->getPointsRepeated();
2071 vec2D_GO_Type elementsOfSurfaceGlobal = surfaceElements_->getElementsOfSurfaceGlobal();
2073 vec_GO_Type elementRep(0);
2076 for(
int i=0; i<numSurfaces; i++ ){
2077 if(surfaceElements_->getElement(i).isInterfaceElement()){
2079 id[0] = elementsOfSurfaceGlobal[i][0];
2080 id[1] = elementsOfSurfaceGlobal[i][1];
2084 sort(
id.begin(),
id.end());
2085 inzidenzIndices.push_back(
id);
2087 localSurfaceIndex.push_back(i);
2096 for(
int j=0; j < elementsOfSurfaceGlobal[i].size() ; j++)
2097 elementRep.push_back(elementsOfSurfaceGlobal[i][j]);
2101 sort(elementRep.begin(),elementRep.end());
2102 vec_GO_Type::iterator ip = unique( elementRep.begin(), elementRep.end());
2103 elementRep.resize(distance(elementRep.begin(), ip));
2105 Teuchos::ArrayView<GO> elementRepArray = Teuchos::arrayViewFromVector( elementRep);
2107 MapPtr_Type elementMapRep =
2108 Teuchos::rcp(
new Map_Type( Teuchos::OrdinalTraits<GO>::invalid(), elementRepArray, 0, inputMesh_->getComm()) );
2114 MatrixPtr_Type inzidenzMatrix = Teuchos::rcp(
new Matrix_Type(inputMesh_->getElementMap(), 40 ) );
2115 Teuchos::Array<GO> index(1);
2116 Teuchos::Array<GO> col(1);
2117 Teuchos::Array<SC> value(1, Teuchos::ScalarTraits<SC>::one() );
2119 for(
int i=0; i<inzidenzIndices.size(); i++ ){
2120 index[0] = inzidenzIndices[i][0];
2121 col[0] = inzidenzIndices[i][1];
2122 inzidenzMatrix->insertGlobalValues(index[0], col(), value());
2124 inzidenzMatrix->fillComplete();
2132 exportLocalEntry->putScalar( (LO) surfacesUnique );
2134 MultiVectorLOPtr_Type newSurfacesUniqueGlobal= Teuchos::rcp(
new MultiVectorLO_Type( mapGlobalProc, 1 ) );
2135 newSurfacesUniqueGlobal->putScalar( (LO) 0 );
2136 newSurfacesUniqueGlobal->importFromVector( exportLocalEntry,
false,
"Insert");
2139 Teuchos::ArrayRCP< const LO > newSurfacesList = newSurfacesUniqueGlobal->getData(0);
2141 GO procOffsetSurface=0;
2142 for(
int i=0; i< myRank; i++)
2143 procOffsetSurface= procOffsetSurface + newSurfacesList[i];
2146 vec_GO_Type vecGlobalIDsSurfaces(numSurfaces);
2150 for(
int i=0; i< numSurfaces; i++){
2151 if(!surfaceElements_->getElement(i).isInterfaceElement()){
2152 vecGlobalIDsSurfaces.at(i) = procOffsetSurface+count;
2159 GO offsetInterface=0;
2160 for(
int i=0; i< maxRank+1; i++)
2161 offsetInterface= offsetInterface + newSurfacesList[i];
2165 Teuchos::ArrayView<const LO> indices;
2166 Teuchos::ArrayView<const SC> values;
2167 vec2D_GO_Type inzidenzIndicesUnique(0,vec_GO_Type(2));
2168 MapConstPtr_Type colMap = inzidenzMatrix->getMap(
"col");
2169 MapConstPtr_Type rowMap = inzidenzMatrix->getMap(
"row");
2170 int numRows = rowMap->getNodeNumElements();
2171 int uniqueSurfaces =0;
2172 for(
int i=0; i<numRows; i++ ){
2173 inzidenzMatrix->getLocalRowView(i, indices,values);
2174 uniqueSurfaces = uniqueSurfaces+indices.size();
2175 vec_GO_Type surfaceTmp(2);
2176 for(
int j=0; j<indices.size(); j++){
2177 surfaceTmp[0] = rowMap->getGlobalElement(i);
2178 surfaceTmp[1] = colMap->getGlobalElement(indices[j]);
2179 inzidenzIndicesUnique.push_back(surfaceTmp);
2183 exportLocalEntry->putScalar( uniqueSurfaces);
2184 MultiVectorLOPtr_Type newSurfaceInterfaceGlobal= Teuchos::rcp(
new MultiVectorLO_Type( mapGlobalProc, 1 ) );
2185 newSurfaceInterfaceGlobal->putScalar( (LO) 0 );
2186 newSurfaceInterfaceGlobal->importFromVector( exportLocalEntry,
true,
"Insert");
2189 Teuchos::ArrayRCP< const LO > numUniqueInterface = newSurfaceInterfaceGlobal->getData(0);
2191 procOffsetSurface=0;
2192 for(
int i=0; i< myRank; i++)
2193 procOffsetSurface= procOffsetSurface + numUniqueInterface[i];
2195 int numInterfaceSurface=0;
2197 vec_GO_Type uniqueInterfaceIDsList_(inzidenzIndicesUnique.size());
2198 for(
int i=0; i< uniqueInterfaceIDsList_.size(); i++)
2199 uniqueInterfaceIDsList_[i] = procOffsetSurface + i;
2201 MatrixPtr_Type indMatrix = Teuchos::rcp(
new Matrix_Type(inputMesh_->getElementMap(), 40 ) );
2203 for(
int i=0; i<inzidenzIndicesUnique.size(); i++ ){
2204 index[0] = inzidenzIndicesUnique[i][0];
2205 col[0] = inzidenzIndicesUnique[i][1];
2206 Teuchos::Array<SC> value2(1,uniqueInterfaceIDsList_[i]);
2207 indMatrix->insertGlobalValues(index[0], col(), value2());
2209 indMatrix->fillComplete();
2211 MatrixPtr_Type importMatrix = Teuchos::rcp(
new Matrix_Type(elementMapRep, 40 ) );
2213 importMatrix->importFromVector(indMatrix,
false,
"Insert");
2214 importMatrix->fillComplete();
2218 colMap = importMatrix->getMap(
"col");
2219 rowMap = importMatrix->getMap(
"row");
2223 for(
int i=0; i<inzidenzIndices.size(); i++ ){
2225 importMatrix->getLocalRowView(rowMap->getLocalElement(inzidenzIndices[i][0]), indices,values);
2229 vec2D_GO_Type indicesTmp(indices.size(),vec_GO_Type(2));
2230 vec_GO_Type indTmp(2);
2231 for(
int j=0; j<indices.size(); j++){
2232 indTmp[0] = colMap->getGlobalElement(indices[j]);
2233 indTmp[1] = values[j];
2234 indicesTmp.push_back(indTmp);
2238 for(
int k=0; k<indicesTmp.size();k++){
2239 if(inzidenzIndices[i][1] == indicesTmp[k][0]){
2241 k = indicesTmp.size();
2242 surfaceID = indicesTmp[entry][1];
2243 vecGlobalIDsSurfaces.at(localSurfaceIndex[i]) = offsetInterface + surfaceID;
2248 cout <<
" Asking for row " << rowMap->getLocalElement(inzidenzIndices[i][0]) <<
" for Edge [" << inzidenzIndices[i][0] <<
", " << inzidenzIndices[i][1] <<
"], on Proc " << myRank <<
" but no Value found " <<endl;
2252 Teuchos::RCP<std::vector<GO>> surfacesGlobMapping = Teuchos::rcp(
new std::vector<GO>( vecGlobalIDsSurfaces ) );
2253 Teuchos::ArrayView<GO> surfacesGlobMappingArray = Teuchos::arrayViewFromVector( *surfacesGlobMapping);
2255 this->surfaceTriangleMap_.reset(
new Map<LO,GO,NO>(Teuchos::OrdinalTraits<GO>::invalid(), surfacesGlobMappingArray, 0, inputMesh_->getComm()) );