45 for(
int i=0; i<count; i++)
46 for(
int j=0; j<3; j++)
47 nc[i][j] = T(meshCoords[i][j]);
49 _coordField.addArray(nodes,ncPtr);
72 for(
int f=0; f<count; f++)
74 const int numNodes = faceNodes.
getCount(f);
77 fc[f] = nodeCoord[faceNodes(f,0)];
78 for (
int nf=1; nf<numNodes; nf++)
79 fc[f] += nodeCoord[faceNodes(f,nf)];
86 const TArray& faceAreaMag =
87 dynamic_cast<const TArray&
>(_areaMagField[faces]);
90 const T twoThirds(2./3.);
92 for(
int f=0; f<count; f++)
94 const int numNodes = faceNodes.
getCount(f);
97 const VectorT3 en = faceArea[f]/faceAreaMag[f];
101 for (
int nn=0; nn<numNodes; nn++)
103 const int n0 = faceNodes(f,nn);
104 const int n1 = faceNodes(f,(nn+1)%numNodes);
105 const VectorT3 rc0 = nodeCoord[n0] - fc[f];
106 const VectorT3 rc1 = nodeCoord[n1] - fc[f];
108 const T triAreaP =
dot(triArea,en);
109 VectorT3 xm = half*(nodeCoord[n0]+nodeCoord[n1]);
111 cfc += twoThirds*(xm-fc[f])*triAreaP;
119 _coordField.addArray(faces,fcPtr);
142 shared_ptr<VectorT3Array> ccPtr(
new VectorT3Array(cellCount));
144 _coordField.addArray(cells,ccPtr);
151 const int faceCount = faces.
getCount();
155 for(
int f=0; f<faceCount; f++)
157 cellCentroid[f] = faceCentroid[f];
162 cellCentroid[f+faceCount] = faceCentroid[f];
172 const TArray& faceAreaMag =
dynamic_cast<const TArray&
>(_areaMagField[faces]);
173 const int faceCount = faces.
getCount();
181 for(
int f=0; f<faceCount; f++)
183 for(
int nc=0; nc<faceCells.
getCount(f); nc++)
185 const int c = faceCells(f,nc);
186 cellCentroid[c] += faceCentroid[f]*faceAreaMag[f];
187 weight[c] += faceAreaMag[f];
191 for(
int c=0; c<selfCellCount; c++)
192 cellCentroid[c] /= weight[c];
203 const TArray& faceAreaMag =
204 dynamic_cast<const TArray&
>(_areaMagField[faces]);
206 const int faceCount = faces.
getCount();
213 for(
int f=0; f<faceCount; f++)
215 const int c0 = faceCells(f,0);
216 const int c1 = faceCells(f,1);
217 const VectorT3 en = faceArea[f]/faceAreaMag[f];
218 const VectorT3 dr0(faceCentroid[f]-cellCentroid[c0]);
220 const T dr0_dotn =
dot(dr0,en);
221 const VectorT3 dr1 = dr0 - 2.*dr0_dotn*en;
222 cellCentroid[c1] = cellCentroid[c0]+dr0-dr1;
228 for(
int f=0; f<faceCount; f++)
230 const int c1 = faceCells(f,1);
231 cellCentroid[c1] = faceCentroid[f];
254 for(
int f=0; f<count; f++)
256 const int numNodes = faceNodes.
getCount(f);
260 const int n0 = faceNodes(f,0);
261 const int n1 = faceNodes(f,1);
262 VectorT3 dr = nodeCoord[n1]-nodeCoord[n0];
267 else if (numNodes == 3)
269 const int n0 = faceNodes(f,0);
270 const int n1 = faceNodes(f,1);
271 const int n2 = faceNodes(f,2);
272 VectorT3 dr10 = nodeCoord[n1]-nodeCoord[n0];
273 VectorT3 dr20 = nodeCoord[n2]-nodeCoord[n0];
274 fa[f] = half*
cross(dr10,dr20);
276 else if (numNodes == 4)
278 const int n0 = faceNodes(f,0);
279 const int n1 = faceNodes(f,1);
280 const int n2 = faceNodes(f,2);
281 const int n3 = faceNodes(f,3);
282 VectorT3 dr20 = nodeCoord[n2]-nodeCoord[n0];
283 VectorT3 dr31 = nodeCoord[n3]-nodeCoord[n1];
284 fa[f] = half*
cross(dr20,dr31);
286 else if (numNodes > 0)
289 for (
int nn=0; nn<numNodes; nn++)
291 const int n0 = faceNodes(f,nn);
292 const int n1 = faceNodes(f,(nn+1)%numNodes);
293 VectorT3 xm = T(0.5)*(nodeCoord[n1]+nodeCoord[n0]);
294 VectorT3 dr = (nodeCoord[n1]-nodeCoord[n0]);
296 fa[f][0] += xm[1]*dr[2];
297 fa[f][1] += xm[2]*dr[0];
298 fa[f][2] += xm[0]*dr[1];
303 _areaField.addArray(faces,faPtr);
310 const int numMeshes = _meshes.size();
311 for (
int n=0; n<numMeshes; n++)
313 const Mesh& mesh = *_meshes[n];
315 Array<int>& GlobalToLocal = *GlobalToLocalPtr;
317 const int nBoundaryNodes = boundaryNodes.
getCount();
320 shared_ptr<VectorT3Array> nodeNormalPtr(
new VectorT3Array(nBoundaryNodes));
322 TArray number(nBoundaryNodes);
326 for(
int i=0;i<nBoundaryNodes;i++)
327 nodeMarked[i] =
false;
334 const int nFaces = faces.
getCount();
337 const TArray& faceAreaMag =
dynamic_cast<const TArray&
>(_areaMagField[faces]);
338 for(
int i=0;i<nBoundaryNodes;i++)
340 for(
int i=0;i<nFaces;i++)
342 for(
int j=0;j<BoundaryFaceNodes.
getCount(i);j++)
344 const int num = BoundaryFaceNodes(i,j);
345 if(!nodeMark[GlobalToLocal[num]])
346 nodeMark[GlobalToLocal[num]] =
true;
347 if((nodeMark[GlobalToLocal[num]])&&(!(nodeMarked[GlobalToLocal[num]])))
349 nodeNormal[GlobalToLocal[num]] += faceArea[i]/faceAreaMag[i];
350 number[GlobalToLocal[num]] += one;
354 for(
int i=0;i<nBoundaryNodes;i++)
356 if((nodeMark[i])&&(!nodeMarked[i]))
358 nodeNormal[i][0] = nodeNormal[i][0]/number[i];
359 nodeNormal[i][1] = nodeNormal[i][1]/number[i];
360 nodeNormal[i][2] = nodeNormal[i][2]/number[i];
361 nodeMarked[i] =
true;
366 _boundaryNodeNormal.addArray(boundaryNodes,nodeNormalPtr);
380 shared_ptr<TArray> famPtr(
new TArray(count));
383 for(
int f=0; f<count; f++)
385 fam[f] =
mag(faceArea[f]);
388 _areaMagField.addArray(faces,famPtr);
403 shared_ptr<TArray> vPtr(
new TArray(cellCount));
404 TArray& cellVolume = *vPtr;
407 _volumeField.addArray(cells,vPtr);
422 const int faceCount = faces.
getCount();
426 for(
int f=0; f<faceCount; f++)
428 const int c0 = faceCells(f,0);
429 cellVolume[c0] +=
dot(faceCentroid[f]-cellCentroid[c0],faceArea[f])/dim;
430 const int c1 = faceCells(f,1);
431 cellVolume[c1] -=
dot(faceCentroid[f]-cellCentroid[c1],faceArea[f])/dim;
436 volumeSum += cellVolume[c];
450 const int faceCount = faces.
getCount();
452 for(
int f=0; f<faceCount; f++)
454 const int c0 = faceCells(f,0);
455 const int c1 = faceCells(f,1);
456 cellVolume[c1] = cellVolume[c0];
474 typedef map<int,double> IntDoubleMap;
490 dynamic_cast<const VectorT3Array&
>(_coordField[mpmParticles]);
498 const int nIBFaces = ibFaces.
getCount();
502 shared_ptr<IMatrix> cellToIB(
new IMatrix(ibFaceToCells));
503 shared_ptr<IMatrix> particlesToIB(
new IMatrix(ibFaceToParticles));
505 Array<T>& cellToIBCoeff = cellToIB->getCoeff();
506 Array<T>& particlesToIBCoeff = particlesToIB->getCoeff();
542 ofstream debugFileFluid;
543 ofstream debugFileSolid;
544 stringstream ss(stringstream::in | stringstream::out);
545 ss << MPI::COMM_WORLD.Get_rank();
546 string fname1 =
"IBinterpolationFluid_proc" + ss.str() +
".dat";
547 string fname2 =
"IBinterpolationSolid_proc" + ss.str() +
".dat";
548 debugFileFluid.open( fname1.c_str() );
549 debugFileSolid.open( fname2.c_str() );
555 for(
int n=0; n<nIBFaces; n++)
557 const int f = ibFaceIndices[n];
569 for(
int nc=ibFCRow[n]; nc<ibFCRow[n+1]; nc++){
570 const int c = ibFCCol[nc];
571 VectorT3 dr((xCells[c]-xFaces[f])*scale);
581 Q(1,1) += dr[0]*dr[0];
582 Q(1,2) += dr[0]*dr[1];
583 Q(1,3) += dr[0]*dr[2];
584 Q(2,2) += dr[1]*dr[1];
585 Q(2,3) += dr[1]*dr[2];
586 Q(3,3) += dr[2]*dr[2];
590 for(
int np=ibFPRow[n]; np<ibFPRow[n+1]; np++)
592 const int p = ibFPCol[np];
593 VectorT3 dr((xParticles[p]-xFaces[f])*scale);
598 Q(1,1) += dr[0]*dr[0];
599 Q(1,2) += dr[0]*dr[1];
600 Q(1,3) += dr[0]*dr[2];
601 Q(2,2) += dr[1]*dr[1];
602 Q(2,3) += dr[1]*dr[2];
603 Q(3,3) += dr[2]*dr[2];
611 for(
int i=0; i<4; i++){
612 for(
int j=0; j<i; j++){
623 for(
int i=0; i<3; i++){
624 for(
int j=0; j<3; j++){
641 for(
int i=0; i<3; i++){
642 for(
int j=0; j<3; j++){
643 Qinv(i,j)=QQinv(i,j);
653 for(
int nc=ibFCRow[n]; nc<ibFCRow[n+1]; nc++) {
654 const int c = ibFCCol[nc];
655 VectorT3 dr((xCells[c]-xFaces[f])*scale);
657 for (
int i=1; i<=3; i++){
658 wt += Qinv(0,i)*dr[i-1];
660 cellToIBCoeff[nc] = wt;
663 for(
int np=ibFPRow[n]; np<ibFPRow[n+1]; np++) {
664 const int p = ibFPCol[np];
665 VectorT3 dr((xParticles[p]-xFaces[f])*scale);
667 for (
int i=1; i<=3; i++){
668 wt += Qinv(0,i)*dr[i-1];
670 particlesToIBCoeff[np] = wt;
675 if (wtSum > 1.01 || wtSum < 0.99)
676 cout <<
"face " << n <<
" has wrong wtsum " << wtSum << endl;
691 const int cell0 = localToGlobal[ faceCells(f,0) ];
692 const int cell1 = localToGlobal[ faceCells(f,1) ];
693 debugFileFluid <<
"ibface = " << n <<
" " << xFaces[f][0] <<
" " << xFaces[f][1] <<
" " << xFaces[f][2] <<
694 " cell0 = " <<
std::min(cell0,cell1) <<
" cell1 = " <<
std::max(cell0,cell1) << endl;
695 map<int, double> cellToValue;
696 map<int, int> globalToLocal;
698 for(
int nc=ibFCRow[n]; nc<ibFCRow[n+1]; nc++){
699 const int localID = ibFCCol[nc];
700 const int c = localToGlobal[ibFCCol[nc]];
701 globalToLocal[c] = localID;
702 cellToValue[c] = cellToIBCoeff[nc];
706 foreach( IntDoubleMap::value_type& pos, cellToValue){
707 const int c = pos.first;
708 const double value =pos.second;
709 debugFileFluid <<
" glblcellID = " << c <<
" localCellID = " << globalToLocal[c] <<
", cellToIBCoeff[" << n <<
"] = " << value << endl;
712 debugFileSolid <<
"ibface = " << n <<
" " << xFaces[f][0] <<
" " << xFaces[f][1] <<
" " << xFaces[f][2] << endl;
714 for(
int nc=ibFPRow[n]; nc<ibFPRow[n+1]; nc++){
715 cellToValue[ibFPCol[nc]] = particlesToIBCoeff[nc];
717 foreach( IntDoubleMap::value_type& pos, cellToValue){
718 const int c = pos.first;
719 const double value =pos.second;
720 debugFileSolid <<
" GlobalSolidFaceID = " << c <<
", solidToIBCoeff[" << n <<
"] = " << value << endl;
732 for(
int nc=ibFCRow[n]; nc<ibFCRow[n+1]; nc++)
734 const int c = ibFCCol[nc];
736 T wt = 1.0/
dot(dr,dr);
737 cellToIBCoeff[nc] = wt;
743 throw CException(
"no fluid cell for ib face");
744 for(
int np=ibFPRow[n]; np<ibFPRow[n+1]; np++)
746 const int p = ibFPCol[np];
747 VectorT3 dr(xParticles[p]-xFaces[f]);
748 T wt = 1.0/
dot(dr,dr);
749 particlesToIBCoeff[np] = wt;
756 throw CException(
"no solid neighbors for ib face");
758 for(
int nc=ibFCRow[n]; nc<ibFCRow[n+1]; nc++)
760 cellToIBCoeff[nc] /= wtSum;
763 for(
int np=ibFPRow[n]; np<ibFPRow[n+1]; np++)
765 particlesToIBCoeff[np] /= wtSum;
773 debugFileFluid.close();
774 debugFileSolid.close();
801 for(
int n=0; n<nIBFaces; n++)
803 const int f = ibFaceIndices[n];
813 for(
int nc=ibFCRow[n]; nc<ibFCRow[n+1]; nc++) {
814 const int c = ibFCCol[nc];
815 VectorT3 dr((xCells[c]-xFaces[f])*scale);
821 Q(0,3) += dr[0]*dr[0];
822 Q(0,4) += dr[1]*dr[1];
823 Q(0,5) += dr[0]*dr[1];
825 Q(1,1) += dr[0]*dr[0];
826 Q(1,2) += dr[0]*dr[1];
827 Q(1,3) += dr[0]*dr[0]*dr[0];
828 Q(1,4) += dr[0]*dr[1]*dr[1];
829 Q(1,5) += dr[0]*dr[0]*dr[1];
831 Q(2,2) += dr[1]*dr[1];
832 Q(2,3) += dr[1]*dr[0]*dr[0];
833 Q(2,4) += dr[1]*dr[1]*dr[1];
834 Q(2,5) += dr[1]*dr[0]*dr[1];
836 Q(3,3) += dr[0]*dr[0]*dr[0]*dr[0];
837 Q(3,4) += dr[0]*dr[0]*dr[1]*dr[1];
838 Q(3,5) += dr[0]*dr[0]*dr[0]*dr[1];
840 Q(4,4) += dr[1]*dr[1]*dr[1]*dr[1];
841 Q(4,5) += dr[1]*dr[1]*dr[0]*dr[1];
843 Q(5,5) += dr[0]*dr[1]*dr[0]*dr[1];
848 for(
int np=ibFPRow[n]; np<ibFPRow[n+1]; np++) {
849 const int p = ibFPCol[np];
850 VectorT3 dr((xParticles[p]-xFaces[f])*scale);
856 Q(0,3) += dr[0]*dr[0];
857 Q(0,4) += dr[1]*dr[1];
858 Q(0,5) += dr[0]*dr[1];
860 Q(1,1) += dr[0]*dr[0];
861 Q(1,2) += dr[0]*dr[1];
862 Q(1,3) += dr[0]*dr[0]*dr[0];
863 Q(1,4) += dr[0]*dr[1]*dr[1];
864 Q(1,5) += dr[0]*dr[0]*dr[1];
866 Q(2,2) += dr[1]*dr[1];
867 Q(2,3) += dr[1]*dr[0]*dr[0];
868 Q(2,4) += dr[1]*dr[1]*dr[1];
869 Q(2,5) += dr[1]*dr[0]*dr[1];
871 Q(3,3) += dr[0]*dr[0]*dr[0]*dr[0];
872 Q(3,4) += dr[0]*dr[0]*dr[1]*dr[1];
873 Q(3,5) += dr[0]*dr[0]*dr[0]*dr[1];
875 Q(4,4) += dr[1]*dr[1]*dr[1]*dr[1];
876 Q(4,5) += dr[1]*dr[1]*dr[0]*dr[1];
878 Q(5,5) += dr[0]*dr[1]*dr[0]*dr[1];
884 throw CException(
"not enough cell or particle neighbors for ib face to interpolate!");
887 for(
int i=0; i<size; i++){
888 for(
int j=0; j<i; j++){
897 for(
int nc=ibFCRow[n]; nc<ibFCRow[n+1]; nc++) {
898 const int c = ibFCCol[nc];
899 VectorT3 dr((xCells[c]-xFaces[f])*scale);
901 wt += Qinv(0,1)*dr[0];
902 wt += Qinv(0,2)*dr[1];
903 wt += Qinv(0,3)*dr[0]*dr[0];
904 wt += Qinv(0,4)*dr[1]*dr[1];
905 wt += Qinv(0,5)*dr[0]*dr[1];
906 cellToIBCoeff[nc] = wt;
909 for(
int np=ibFPRow[n]; np<ibFPRow[n+1]; np++) {
910 const int p = ibFPCol[np];
911 VectorT3 dr((xParticles[p]-xFaces[f])*scale);
913 wt += Qinv(0,1)*dr[0];
914 wt += Qinv(0,2)*dr[1];
915 wt += Qinv(0,3)*dr[0]*dr[0];
916 wt += Qinv(0,4)*dr[1]*dr[1];
917 wt += Qinv(0,5)*dr[0]*dr[1];
918 particlesToIBCoeff[np] = wt;
928 for(
int nc=ibFCRow[n]; nc<ibFCRow[n+1]; nc++)
930 const int c = ibFCCol[nc];
931 VectorT3 dr((xCells[c]-xFaces[f])*scale);
936 Q(0,4) += dr[0]*dr[0];
937 Q(0,5) += dr[1]*dr[1];
938 Q(0,6) += dr[2]*dr[2];
939 Q(0,7) += dr[0]*dr[1];
940 Q(0,8) += dr[1]*dr[2];
941 Q(0,9) += dr[0]*dr[2];
943 Q(1,1) += dr[0]*dr[0];
944 Q(1,2) += dr[0]*dr[1];
945 Q(1,3) += dr[0]*dr[2];
946 Q(1,4) += dr[0]*dr[0]*dr[0];
947 Q(1,5) += dr[0]*dr[1]*dr[1];
948 Q(1,6) += dr[0]*dr[2]*dr[2];
949 Q(1,7) += dr[0]*dr[0]*dr[1];
950 Q(1,8) += dr[0]*dr[1]*dr[2];
951 Q(1,9) += dr[0]*dr[0]*dr[2];
953 Q(2,2) += dr[1]*dr[1];
954 Q(2,3) += dr[1]*dr[2];
955 Q(2,4) += dr[1]*dr[0]*dr[0];
956 Q(2,5) += dr[1]*dr[1]*dr[1];
957 Q(2,6) += dr[1]*dr[2]*dr[2];
958 Q(2,7) += dr[1]*dr[0]*dr[1];
959 Q(2,8) += dr[1]*dr[1]*dr[2];
960 Q(2,9) += dr[1]*dr[0]*dr[2];
962 Q(3,3) += dr[2]*dr[2];
963 Q(3,4) += dr[2]*dr[0]*dr[0];
964 Q(3,5) += dr[2]*dr[1]*dr[1];
965 Q(3,6) += dr[2]*dr[2]*dr[2];
966 Q(3,7) += dr[2]*dr[0]*dr[1];
967 Q(3,8) += dr[2]*dr[1]*dr[2];
968 Q(3,8) += dr[2]*dr[0]*dr[2];
970 Q(4,4) += dr[0]*dr[0]*dr[0]*dr[0];
971 Q(4,5) += dr[0]*dr[0]*dr[1]*dr[1];
972 Q(4,6) += dr[0]*dr[0]*dr[2]*dr[2];
973 Q(4,7) += dr[0]*dr[0]*dr[0]*dr[1];
974 Q(4,8) += dr[0]*dr[0]*dr[1]*dr[2];
975 Q(4,9) += dr[0]*dr[0]*dr[0]*dr[2];
977 Q(5,5) += dr[1]*dr[1]*dr[1]*dr[1];
978 Q(5,6) += dr[1]*dr[1]*dr[2]*dr[2];
979 Q(5,7) += dr[1]*dr[1]*dr[0]*dr[1];
980 Q(5,8) += dr[1]*dr[1]*dr[1]*dr[2];
981 Q(5,9) += dr[1]*dr[1]*dr[0]*dr[2];
983 Q(6,6) += dr[2]*dr[2]*dr[2]*dr[2];
984 Q(6,7) += dr[2]*dr[2]*dr[0]*dr[1];
985 Q(6,8) += dr[2]*dr[2]*dr[1]*dr[2];
986 Q(6,9) += dr[2]*dr[2]*dr[0]*dr[2];
988 Q(7,7) += dr[0]*dr[1]*dr[0]*dr[1];
989 Q(7,8) += dr[0]*dr[1]*dr[1]*dr[2];
990 Q(7,9) += dr[0]*dr[1]*dr[0]*dr[2];
992 Q(8,8) += dr[1]*dr[2]*dr[1]*dr[2];
993 Q(8,9) += dr[1]*dr[2]*dr[0]*dr[2];
995 Q(9,9) += dr[0]*dr[2]*dr[0]*dr[2];
999 for(
int np=ibFPRow[n]; np<ibFPRow[n+1]; np++)
1001 const int p = ibFPCol[np];
1002 VectorT3 dr((xParticles[p]-xFaces[f])*scale);
1007 Q(0,4) += dr[0]*dr[0];
1008 Q(0,5) += dr[1]*dr[1];
1009 Q(0,6) += dr[2]*dr[2];
1010 Q(0,7) += dr[0]*dr[1];
1011 Q(0,8) += dr[1]*dr[2];
1012 Q(0,9) += dr[0]*dr[2];
1014 Q(1,1) += dr[0]*dr[0];
1015 Q(1,2) += dr[0]*dr[1];
1016 Q(1,3) += dr[0]*dr[2];
1017 Q(1,4) += dr[0]*dr[0]*dr[0];
1018 Q(1,5) += dr[0]*dr[1]*dr[1];
1019 Q(1,6) += dr[0]*dr[2]*dr[2];
1020 Q(1,7) += dr[0]*dr[0]*dr[1];
1021 Q(1,8) += dr[0]*dr[1]*dr[2];
1022 Q(1,9) += dr[0]*dr[0]*dr[2];
1024 Q(2,2) += dr[1]*dr[1];
1025 Q(2,3) += dr[1]*dr[2];
1026 Q(2,4) += dr[1]*dr[0]*dr[0];
1027 Q(2,5) += dr[1]*dr[1]*dr[1];
1028 Q(2,6) += dr[1]*dr[2]*dr[2];
1029 Q(2,7) += dr[1]*dr[0]*dr[1];
1030 Q(2,8) += dr[1]*dr[1]*dr[2];
1031 Q(2,9) += dr[1]*dr[0]*dr[2];
1033 Q(3,3) += dr[2]*dr[2];
1034 Q(3,4) += dr[2]*dr[0]*dr[0];
1035 Q(3,5) += dr[2]*dr[1]*dr[1];
1036 Q(3,6) += dr[2]*dr[2]*dr[2];
1037 Q(3,7) += dr[2]*dr[0]*dr[1];
1038 Q(3,8) += dr[2]*dr[1]*dr[2];
1039 Q(3,8) += dr[2]*dr[0]*dr[2];
1041 Q(4,4) += dr[0]*dr[0]*dr[0]*dr[0];
1042 Q(4,5) += dr[0]*dr[0]*dr[1]*dr[1];
1043 Q(4,6) += dr[0]*dr[0]*dr[2]*dr[2];
1044 Q(4,7) += dr[0]*dr[0]*dr[0]*dr[1];
1045 Q(4,8) += dr[0]*dr[0]*dr[1]*dr[2];
1046 Q(4,9) += dr[0]*dr[0]*dr[0]*dr[2];
1048 Q(5,5) += dr[1]*dr[1]*dr[1]*dr[1];
1049 Q(5,6) += dr[1]*dr[1]*dr[2]*dr[2];
1050 Q(5,7) += dr[1]*dr[1]*dr[0]*dr[1];
1051 Q(5,8) += dr[1]*dr[1]*dr[1]*dr[2];
1052 Q(5,9) += dr[1]*dr[1]*dr[0]*dr[2];
1054 Q(6,6) += dr[2]*dr[2]*dr[2]*dr[2];
1055 Q(6,7) += dr[2]*dr[2]*dr[0]*dr[1];
1056 Q(6,8) += dr[2]*dr[2]*dr[1]*dr[2];
1057 Q(6,9) += dr[2]*dr[2]*dr[0]*dr[2];
1059 Q(7,7) += dr[0]*dr[1]*dr[0]*dr[1];
1060 Q(7,8) += dr[0]*dr[1]*dr[1]*dr[2];
1061 Q(7,9) += dr[0]*dr[1]*dr[0]*dr[2];
1063 Q(8,8) += dr[1]*dr[2]*dr[1]*dr[2];
1064 Q(8,9) += dr[1]*dr[2]*dr[0]*dr[2];
1066 Q(9,9) += dr[0]*dr[2]*dr[0]*dr[2];
1072 throw CException(
"not enough cell or particle neighbors for ib face to interpolate!");
1075 for(
int i=0; i<size; i++){
1076 for(
int j=0; j<i; j++){
1086 for(
int nc=ibFCRow[n]; nc<ibFCRow[n+1]; nc++)
1088 const int c = ibFCCol[nc];
1089 VectorT3 dr((xCells[c]-xFaces[f])*scale);
1091 wt += Qinv(0,1)*dr[0];
1092 wt += Qinv(0,2)*dr[1];
1093 wt += Qinv(0,3)*dr[2];
1094 wt += Qinv(0,4)*dr[0]*dr[0];
1095 wt += Qinv(0,5)*dr[1]*dr[1];
1096 wt += Qinv(0,6)*dr[2]*dr[2];
1097 wt += Qinv(0,7)*dr[0]*dr[1];
1098 wt += Qinv(0,8)*dr[1]*dr[2];
1099 wt += Qinv(0,9)*dr[0]*dr[2];
1100 cellToIBCoeff[nc] = wt;
1103 for(
int np=ibFPRow[n]; np<ibFPRow[n+1]; np++)
1105 const int p = ibFPCol[np];
1106 VectorT3 dr((xParticles[p]-xFaces[f])*scale);
1108 wt += Qinv(0,1)*dr[0];
1109 wt += Qinv(0,2)*dr[1];
1110 wt += Qinv(0,3)*dr[2];
1111 wt += Qinv(0,4)*dr[0]*dr[0];
1112 wt += Qinv(0,5)*dr[1]*dr[1];
1113 wt += Qinv(0,6)*dr[2]*dr[2];
1114 wt += Qinv(0,7)*dr[0]*dr[1];
1115 wt += Qinv(0,8)*dr[1]*dr[2];
1116 wt += Qinv(0,9)*dr[0]*dr[2];
1117 particlesToIBCoeff[np] = wt;
1124 this->_geomFields._interpolationMatrices[key1] = cellToIB;
1127 this->_geomFields._interpolationMatrices[key2] = particlesToIB;
1140 typedef map<int,double> IntDoubleMap;
1156 const int nIBFaces = ibFaces.
getCount();
1160 shared_ptr<IMatrix> cellToIB(
new IMatrix(ibFaceToCells));
1162 Array<T>& cellToIBCoeff = cellToIB->getCoeff();
1198 ofstream debugFileFluid;
1199 ofstream debugFileSolid;
1200 stringstream ss(stringstream::in | stringstream::out);
1201 ss << MPI::COMM_WORLD.Get_rank();
1202 string fname1 =
"IBinterpolationFluid_proc" + ss.str() +
".dat";
1203 string fname2 =
"IBinterpolationSolid_proc" + ss.str() +
".dat";
1204 debugFileFluid.open( fname1.c_str() );
1205 debugFileSolid.open( fname2.c_str() );
1211 for(
int n=0; n<nIBFaces; n++)
1213 const int f = ibFaceIndices[n];
1225 for(
int nc=ibFCRow[n]; nc<ibFCRow[n+1]; nc++){
1226 const int c = ibFCCol[nc];
1227 VectorT3 dr((xCells[c]-xFaces[f])*scale);
1237 Q(1,1) += dr[0]*dr[0];
1238 Q(1,2) += dr[0]*dr[1];
1239 Q(1,3) += dr[0]*dr[2];
1240 Q(2,2) += dr[1]*dr[1];
1241 Q(2,3) += dr[1]*dr[2];
1242 Q(3,3) += dr[2]*dr[2];
1251 for(
int i=0; i<4; i++){
1252 for(
int j=0; j<i; j++){
1263 for(
int i=0; i<3; i++){
1264 for(
int j=0; j<3; j++){
1277 if (
fabs(det) > 1.0 ){
1280 for(
int i=0; i<3; i++){
1281 for(
int j=0; j<3; j++){
1282 Qinv(i,j)=QQinv(i,j);
1292 for(
int nc=ibFCRow[n]; nc<ibFCRow[n+1]; nc++) {
1293 const int c = ibFCCol[nc];
1294 VectorT3 dr((xCells[c]-xFaces[f])*scale);
1296 for (
int i=1; i<=3; i++){
1297 wt += Qinv(0,i)*dr[i-1];
1299 cellToIBCoeff[nc] = wt;
1303 if (wtSum > 1.01 || wtSum < 0.99){
1304 cout <<
"face " << n <<
" has wrong wtsum " << wtSum << endl;
1306 cout <<
"ibface " << xFaces[f][0] <<
" " << xFaces[f][1] <<
" " << xFaces[f][2] <<
" " << endl;
1307 for(
int nc=ibFCRow[n]; nc<ibFCRow[n+1]; nc++) {
1308 const int c = ibFCCol[nc];
1309 cout <<
"fluid cells " << xCells[c][0] <<
" " << xCells[c][1] <<
" " << xCells[c][2] <<
" " <<cellToIBCoeff[nc] << endl;
1318 for(
int nc=ibFCRow[n]; nc<ibFCRow[n+1]; nc++)
1320 const int c = ibFCCol[nc];
1322 T wt = 1.0/
dot(dr,dr);
1323 cellToIBCoeff[nc] = wt;
1330 throw CException(
"no cell or particle neighbors for ib face");
1332 for(
int nc=ibFCRow[n]; nc<ibFCRow[n+1]; nc++)
1334 cellToIBCoeff[nc] /= wtSum;
1342 debugFileFluid.close();
1343 debugFileSolid.close();
1370 for(
int n=0; n<nIBFaces; n++)
1372 const int f = ibFaceIndices[n];
1382 for(
int nc=ibFCRow[n]; nc<ibFCRow[n+1]; nc++) {
1383 const int c = ibFCCol[nc];
1384 VectorT3 dr((xCells[c]-xFaces[f])*scale);
1390 Q(0,3) += dr[0]*dr[0];
1391 Q(0,4) += dr[1]*dr[1];
1392 Q(0,5) += dr[0]*dr[1];
1394 Q(1,1) += dr[0]*dr[0];
1395 Q(1,2) += dr[0]*dr[1];
1396 Q(1,3) += dr[0]*dr[0]*dr[0];
1397 Q(1,4) += dr[0]*dr[1]*dr[1];
1398 Q(1,5) += dr[0]*dr[0]*dr[1];
1400 Q(2,2) += dr[1]*dr[1];
1401 Q(2,3) += dr[1]*dr[0]*dr[0];
1402 Q(2,4) += dr[1]*dr[1]*dr[1];
1403 Q(2,5) += dr[1]*dr[0]*dr[1];
1405 Q(3,3) += dr[0]*dr[0]*dr[0]*dr[0];
1406 Q(3,4) += dr[0]*dr[0]*dr[1]*dr[1];
1407 Q(3,5) += dr[0]*dr[0]*dr[0]*dr[1];
1409 Q(4,4) += dr[1]*dr[1]*dr[1]*dr[1];
1410 Q(4,5) += dr[1]*dr[1]*dr[0]*dr[1];
1412 Q(5,5) += dr[0]*dr[1]*dr[0]*dr[1];
1418 throw CException(
"not enough cell or particle neighbors for ib face to interpolate!");
1421 for(
int i=0; i<size; i++){
1422 for(
int j=0; j<i; j++){
1431 for(
int nc=ibFCRow[n]; nc<ibFCRow[n+1]; nc++) {
1432 const int c = ibFCCol[nc];
1433 VectorT3 dr((xCells[c]-xFaces[f])*scale);
1435 wt += Qinv(0,1)*dr[0];
1436 wt += Qinv(0,2)*dr[1];
1437 wt += Qinv(0,3)*dr[0]*dr[0];
1438 wt += Qinv(0,4)*dr[1]*dr[1];
1439 wt += Qinv(0,5)*dr[0]*dr[1];
1440 cellToIBCoeff[nc] = wt;
1446 const int size = 10;
1450 for(
int nc=ibFCRow[n]; nc<ibFCRow[n+1]; nc++)
1452 const int c = ibFCCol[nc];
1453 VectorT3 dr((xCells[c]-xFaces[f])*scale);
1458 Q(0,4) += dr[0]*dr[0];
1459 Q(0,5) += dr[1]*dr[1];
1460 Q(0,6) += dr[2]*dr[2];
1461 Q(0,7) += dr[0]*dr[1];
1462 Q(0,8) += dr[1]*dr[2];
1463 Q(0,9) += dr[0]*dr[2];
1465 Q(1,1) += dr[0]*dr[0];
1466 Q(1,2) += dr[0]*dr[1];
1467 Q(1,3) += dr[0]*dr[2];
1468 Q(1,4) += dr[0]*dr[0]*dr[0];
1469 Q(1,5) += dr[0]*dr[1]*dr[1];
1470 Q(1,6) += dr[0]*dr[2]*dr[2];
1471 Q(1,7) += dr[0]*dr[0]*dr[1];
1472 Q(1,8) += dr[0]*dr[1]*dr[2];
1473 Q(1,9) += dr[0]*dr[0]*dr[2];
1475 Q(2,2) += dr[1]*dr[1];
1476 Q(2,3) += dr[1]*dr[2];
1477 Q(2,4) += dr[1]*dr[0]*dr[0];
1478 Q(2,5) += dr[1]*dr[1]*dr[1];
1479 Q(2,6) += dr[1]*dr[2]*dr[2];
1480 Q(2,7) += dr[1]*dr[0]*dr[1];
1481 Q(2,8) += dr[1]*dr[1]*dr[2];
1482 Q(2,9) += dr[1]*dr[0]*dr[2];
1484 Q(3,3) += dr[2]*dr[2];
1485 Q(3,4) += dr[2]*dr[0]*dr[0];
1486 Q(3,5) += dr[2]*dr[1]*dr[1];
1487 Q(3,6) += dr[2]*dr[2]*dr[2];
1488 Q(3,7) += dr[2]*dr[0]*dr[1];
1489 Q(3,8) += dr[2]*dr[1]*dr[2];
1490 Q(3,8) += dr[2]*dr[0]*dr[2];
1492 Q(4,4) += dr[0]*dr[0]*dr[0]*dr[0];
1493 Q(4,5) += dr[0]*dr[0]*dr[1]*dr[1];
1494 Q(4,6) += dr[0]*dr[0]*dr[2]*dr[2];
1495 Q(4,7) += dr[0]*dr[0]*dr[0]*dr[1];
1496 Q(4,8) += dr[0]*dr[0]*dr[1]*dr[2];
1497 Q(4,9) += dr[0]*dr[0]*dr[0]*dr[2];
1499 Q(5,5) += dr[1]*dr[1]*dr[1]*dr[1];
1500 Q(5,6) += dr[1]*dr[1]*dr[2]*dr[2];
1501 Q(5,7) += dr[1]*dr[1]*dr[0]*dr[1];
1502 Q(5,8) += dr[1]*dr[1]*dr[1]*dr[2];
1503 Q(5,9) += dr[1]*dr[1]*dr[0]*dr[2];
1505 Q(6,6) += dr[2]*dr[2]*dr[2]*dr[2];
1506 Q(6,7) += dr[2]*dr[2]*dr[0]*dr[1];
1507 Q(6,8) += dr[2]*dr[2]*dr[1]*dr[2];
1508 Q(6,9) += dr[2]*dr[2]*dr[0]*dr[2];
1510 Q(7,7) += dr[0]*dr[1]*dr[0]*dr[1];
1511 Q(7,8) += dr[0]*dr[1]*dr[1]*dr[2];
1512 Q(7,9) += dr[0]*dr[1]*dr[0]*dr[2];
1514 Q(8,8) += dr[1]*dr[2]*dr[1]*dr[2];
1515 Q(8,9) += dr[1]*dr[2]*dr[0]*dr[2];
1517 Q(9,9) += dr[0]*dr[2]*dr[0]*dr[2];
1522 throw CException(
"not enough cell or particle neighbors for ib face to interpolate!");
1525 for(
int i=0; i<size; i++){
1526 for(
int j=0; j<i; j++){
1536 for(
int nc=ibFCRow[n]; nc<ibFCRow[n+1]; nc++)
1538 const int c = ibFCCol[nc];
1539 VectorT3 dr((xCells[c]-xFaces[f])*scale);
1541 wt += Qinv(0,1)*dr[0];
1542 wt += Qinv(0,2)*dr[1];
1543 wt += Qinv(0,3)*dr[2];
1544 wt += Qinv(0,4)*dr[0]*dr[0];
1545 wt += Qinv(0,5)*dr[1]*dr[1];
1546 wt += Qinv(0,6)*dr[2]*dr[2];
1547 wt += Qinv(0,7)*dr[0]*dr[1];
1548 wt += Qinv(0,8)*dr[1]*dr[2];
1549 wt += Qinv(0,9)*dr[0]*dr[2];
1550 cellToIBCoeff[nc] = wt;
1557 this->_geomFields._interpolationMatrices[key1] = cellToIB;
1583 dynamic_cast<const VectorT3Array&
>(_coordField[solidFaces]);
1588 const int nSolidFaces = solidFaces.
getCount();
1590 shared_ptr<IMatrix> cellToSolidFaces(
new IMatrix(solidFacesToCells));
1592 Array<T>& cellToSBCoeff = cellToSolidFaces->getCoeff();
1597 for(
int f=0; f<nSolidFaces; f++)
1610 for(
int nc=sFCRow[f]; nc<sFCRow[f+1]; nc++)
1612 const int c = sFCCol[nc];
1618 VectorT3 dr((xCells[c]-xFaces[f])*scale);
1623 Q(1,1) += dr[0]*dr[0];
1624 Q(1,2) += dr[0]*dr[1];
1625 Q(1,3) += dr[0]*dr[2];
1626 Q(2,2) += dr[1]*dr[1];
1627 Q(2,3) += dr[1]*dr[2];
1628 Q(3,3) += dr[2]*dr[2];
1635 for(
int i=0; i<4; i++)
1636 for(
int j=0; j<i; j++)
1640 for(
int i=0; i<3; i++){
1641 for(
int j=0; j<3; j++){
1653 if (
fabs(det) > 1.0){
1656 for(
int i=0; i<3; i++){
1657 for(
int j=0; j<3; j++){
1658 Qinv(i,j)=QQinv(i,j);
1668 for(
int nc=sFCRow[f]; nc<sFCRow[f+1]; nc++)
1670 const int c = sFCCol[nc];
1671 VectorT3 dr((xCells[c]-xFaces[f])*scale);
1673 for (
int i=1; i<=3; i++)
1674 wt += Qinv(0,i)*dr[i-1];
1676 cellToSBCoeff[nc] = wt;
1685 for(
int nc=sFCRow[f]; nc<sFCRow[f+1]; nc++)
1687 const int c = sFCCol[nc];
1689 T wt = 1.0/
dot(dr,dr);
1690 cellToSBCoeff[nc] = wt;
1702 throw CException(
"no cell or particle neighbors for ib face");
1704 for(
int nc=sFCRow[f]; nc<sFCRow[f+1]; nc++)
1706 cellToSBCoeff[nc] /= wtSum;
1737 for(
int f=0; f<nSolidFaces; f++)
1748 for(
int nc=sFCRow[f]; nc<sFCRow[f+1]; nc++) {
1749 const int c = sFCCol[nc];
1750 VectorT3 dr((xCells[c]-xFaces[f])*scale);
1754 Q(0,3) += dr[0]*dr[0];
1755 Q(0,4) += dr[1]*dr[1];
1756 Q(0,5) += dr[0]*dr[1];
1758 Q(1,1) += dr[0]*dr[0];
1759 Q(1,2) += dr[0]*dr[1];
1760 Q(1,3) += dr[0]*dr[0]*dr[0];
1761 Q(1,4) += dr[0]*dr[1]*dr[1];
1762 Q(1,5) += dr[0]*dr[0]*dr[1];
1764 Q(2,2) += dr[1]*dr[1];
1765 Q(2,3) += dr[1]*dr[0]*dr[0];
1766 Q(2,4) += dr[1]*dr[1]*dr[1];
1767 Q(2,5) += dr[1]*dr[0]*dr[1];
1769 Q(3,3) += dr[0]*dr[0]*dr[0]*dr[0];
1770 Q(3,4) += dr[0]*dr[0]*dr[1]*dr[1];
1771 Q(3,5) += dr[0]*dr[0]*dr[0]*dr[1];
1773 Q(4,4) += dr[1]*dr[1]*dr[1]*dr[1];
1774 Q(4,5) += dr[1]*dr[1]*dr[0]*dr[1];
1776 Q(5,5) += dr[0]*dr[1]*dr[0]*dr[1];
1782 cout << nnb << endl;
1783 throw CException(
"not enough fluid neighbors for solid to interpolate!");
1787 for(
int i=0; i<size; i++){
1788 for(
int j=0; j<i; j++){
1798 for(
int nc=sFCRow[f]; nc<sFCRow[f+1]; nc++)
1800 const int c = sFCCol[nc];
1801 VectorT3 dr((xCells[c]-xFaces[f])*scale);
1803 wt += Qinv(0,1)*dr[0];
1804 wt += Qinv(0,2)*dr[1];
1805 wt += Qinv(0,3)*dr[0]*dr[0];
1806 wt += Qinv(0,4)*dr[1]*dr[1];
1807 wt += Qinv(0,5)*dr[0]*dr[1];
1809 cellToSBCoeff[nc] = wt;
1816 const int size = 10;
1820 for(
int nc=sFCRow[f]; nc<sFCRow[f+1]; nc++) {
1821 const int c = sFCCol[nc];
1822 VectorT3 dr((xCells[c]-xFaces[f])*scale);
1827 Q(0,4) += dr[0]*dr[0];
1828 Q(0,5) += dr[1]*dr[1];
1829 Q(0,6) += dr[2]*dr[2];
1830 Q(0,7) += dr[0]*dr[1];
1831 Q(0,8) += dr[1]*dr[2];
1832 Q(0,9) += dr[0]*dr[2];
1834 Q(1,1) += dr[0]*dr[0];
1835 Q(1,2) += dr[0]*dr[1];
1836 Q(1,3) += dr[0]*dr[2];
1837 Q(1,4) += dr[0]*dr[0]*dr[0];
1838 Q(1,5) += dr[0]*dr[1]*dr[1];
1839 Q(1,6) += dr[0]*dr[2]*dr[2];
1840 Q(1,7) += dr[0]*dr[0]*dr[1];
1841 Q(1,8) += dr[0]*dr[1]*dr[2];
1842 Q(1,9) += dr[0]*dr[0]*dr[2];
1844 Q(2,2) += dr[1]*dr[1];
1845 Q(2,3) += dr[1]*dr[2];
1846 Q(2,4) += dr[1]*dr[0]*dr[0];
1847 Q(2,5) += dr[1]*dr[1]*dr[1];
1848 Q(2,6) += dr[1]*dr[2]*dr[2];
1849 Q(2,7) += dr[1]*dr[0]*dr[1];
1850 Q(2,8) += dr[1]*dr[1]*dr[2];
1851 Q(2,9) += dr[1]*dr[0]*dr[2];
1853 Q(3,3) += dr[2]*dr[2];
1854 Q(3,4) += dr[2]*dr[0]*dr[0];
1855 Q(3,5) += dr[2]*dr[1]*dr[1];
1856 Q(3,6) += dr[2]*dr[2]*dr[2];
1857 Q(3,7) += dr[2]*dr[0]*dr[1];
1858 Q(3,8) += dr[2]*dr[1]*dr[2];
1859 Q(3,8) += dr[2]*dr[0]*dr[2];
1861 Q(4,4) += dr[0]*dr[0]*dr[0]*dr[0];
1862 Q(4,5) += dr[0]*dr[0]*dr[1]*dr[1];
1863 Q(4,6) += dr[0]*dr[0]*dr[2]*dr[2];
1864 Q(4,7) += dr[0]*dr[0]*dr[0]*dr[1];
1865 Q(4,8) += dr[0]*dr[0]*dr[1]*dr[2];
1866 Q(4,9) += dr[0]*dr[0]*dr[0]*dr[2];
1868 Q(5,5) += dr[1]*dr[1]*dr[1]*dr[1];
1869 Q(5,6) += dr[1]*dr[1]*dr[2]*dr[2];
1870 Q(5,7) += dr[1]*dr[1]*dr[0]*dr[1];
1871 Q(5,8) += dr[1]*dr[1]*dr[1]*dr[2];
1872 Q(5,9) += dr[1]*dr[1]*dr[0]*dr[2];
1874 Q(6,6) += dr[2]*dr[2]*dr[2]*dr[2];
1875 Q(6,7) += dr[2]*dr[2]*dr[0]*dr[1];
1876 Q(6,8) += dr[2]*dr[2]*dr[1]*dr[2];
1877 Q(6,9) += dr[2]*dr[2]*dr[0]*dr[2];
1879 Q(7,7) += dr[0]*dr[1]*dr[0]*dr[1];
1880 Q(7,8) += dr[0]*dr[1]*dr[1]*dr[2];
1881 Q(7,9) += dr[0]*dr[1]*dr[0]*dr[2];
1883 Q(8,8) += dr[1]*dr[2]*dr[1]*dr[2];
1884 Q(8,9) += dr[1]*dr[2]*dr[0]*dr[2];
1886 Q(9,9) += dr[0]*dr[2]*dr[0]*dr[2];
1891 throw CException(
"not enough cell or particle neighbors for solid to interpolate!");
1894 for(
int i=0; i<size; i++){
1895 for(
int j=0; j<i; j++){
1903 for(
int nc=sFCRow[f]; nc<sFCRow[f+1]; nc++)
1905 const int c = sFCCol[nc];
1906 VectorT3 dr((xCells[c]-xFaces[f])*scale);
1908 wt += Qinv(0,1)*dr[0];
1909 wt += Qinv(0,2)*dr[1];
1910 wt += Qinv(0,3)*dr[2];
1911 wt += Qinv(0,4)*dr[0]*dr[0];
1912 wt += Qinv(0,5)*dr[1]*dr[1];
1913 wt += Qinv(0,6)*dr[2]*dr[2];
1914 wt += Qinv(0,7)*dr[0]*dr[1];
1915 wt += Qinv(0,8)*dr[1]*dr[2];
1916 wt += Qinv(0,9)*dr[0]*dr[2];
1917 cellToSBCoeff[nc] = wt;
1924 this->_geomFields._interpolationMatrices[key1] = cellToSolidFaces;
1931 _geomFields(geomFields),
1932 _coordField(geomFields.coordinate),
1933 _areaField(geomFields.area),
1934 _areaMagField(geomFields.areaMag),
1935 _volumeField(geomFields.volume),
1936 _nodeDisplacement(geomFields.nodeDisplacement),
1937 _boundaryNodeNormal(geomFields.boundaryNodeNormal),
1938 _transient(transient)
1948 const int numMeshes = _meshes.size();
1949 for (
int n=0; n<numMeshes; n++)
1951 const Mesh& mesh = *_meshes[n];
1953 calculateNodeCoordinates(mesh);
1956 for (
int n=0; n<numMeshes; n++)
1958 const Mesh& mesh = *_meshes[n];
1961 calculateFaceAreas(mesh);
1962 calculateFaceAreaMag(mesh);
1963 calculateFaceCentroids(mesh);
1966 for (
int n=0; n<numMeshes; n++)
1968 const Mesh& mesh = *_meshes[n];
1969 calculateCellCentroids(mesh);
1971 _coordField.syncLocal();
1976 for (
int n=0; n<numMeshes; n++)
1978 const Mesh& mesh = *_meshes[n];
1981 if (periodicFacePairs.size() == 0)
1996 for(Mesh::PeriodicFacePairs::const_iterator pos = periodicFacePairs.begin();
1997 pos!=periodicFacePairs.end();
2000 const int lf = pos->first;
2001 const int rf = pos->second;
2002 const VectorT3 dr = faceCoord[rf] - faceCoord[lf];
2003 cellCoord[faceCells(lf,1)] += dr;
2004 cellCoord[faceCells(rf,1)] -= dr;
2008 for (
int n=0; n<numMeshes; n++)
2010 const Mesh& mesh = *_meshes[n];
2011 calculateCellVolumes(mesh);
2014 for (
int n=0; n<numMeshes; n++)
2016 const Mesh& mesh = *_meshes[n];
2021 if ( (cellCount > 0) )
2025 _geomFields.ibType.addArray(cells,ibTypePtr);
2028 *ibFaceIndexPtr = -1;
2029 _geomFields.ibFaceIndex.addArray(faces,ibFaceIndexPtr);
2035 _geomFields.ibTypeN1.addArray(cells,ibTypeN1Ptr);
2040 _volumeField.syncLocal();
2048 const int numMeshes = _meshes.size();
2049 for (
int n=0; n<numMeshes; n++)
2051 const Mesh& mesh = *_meshes[n];
2054 calculateFaceAreas(mesh);
2055 calculateFaceAreaMag(mesh);
2056 calculateFaceCentroids(mesh);
2057 calculateCellCentroids(mesh);
2061 _volumeField.syncLocal();
2062 _coordField.syncLocal();
2071 const int numMeshes = _meshes.size();
2072 for (
int n=0; n<numMeshes; n++)
2074 const Mesh& mesh = *_meshes[n];
2081 dynamic_cast<const IntArray&
>(_geomFields.ibType[cells]);
2082 for(
int c=0; c<cellCount; c++)
2083 ibTypeN1[c] = ibType[c];
2089 throw CException(
"MeshMetricsCalculator: not transient");
2100 const int numMeshes = _meshes.size();
2101 for (
int n=0; n<numMeshes; n++)
2103 const Mesh& mesh = *_meshes[n];
2106 calculateFaceAreas(mesh);
2107 calculateFaceAreaMag(mesh);
2108 calculateFaceCentroids(mesh);
2112 for (
int n=0; n<numMeshes; n++)
2114 const Mesh& mesh = *_meshes[n];
2116 calculateCellCentroids(mesh);
2119 _coordField.syncLocal();
2121 for (
int n=0; n<numMeshes; n++)
2123 const Mesh& mesh = *_meshes[n];
2125 calculateCellVolumes(mesh);
2128 _volumeField.syncLocal();
2146 shared_ptr<IMatrix> gridToFaces (
new IMatrix(faceToGrids));
2150 for(
int n=0; n<nFaces; n++)
2156 for(
int nc = FGRow[n]; nc < FGRow[n+1]; nc ++)
2159 const int c = FGCol[nc ];
2161 T wt = 1.0/
dot(dr,dr);
2162 gridToFaceCoeff[nc ] = wt;
2169 for(
int nc=FGRow[n]; nc<FGRow[n+1]; nc++)
2171 gridToFaceCoeff[nc] /= wtSum;
2186 for(
int n=0; n<nFaces; n++)
2191 for(
int i=0; i<3; i++){
2192 for(
int j=0; j<3; j++){
2193 Q[i][j]=Qinv[i][j]=0;
2199 for(
int nc=FGRow[n]; nc<FGRow[n+1]; nc++)
2201 const int c = FGCol[nc];
2211 matrix.Inverse3x3(Q, Qinv);
2213 for(
int nc=FGRow[n]; nc<FGRow[n+1]; nc++)
2217 gridToFaceCoeff[nc] = wt;
2232 for(
int n=0; n<nFaces; n++)
2234 const int ncSize = FGRow[n+1] - FGRow[n];
2240 for(
int nc=FGRow[n]; nc<FGRow[n+1]; nc++)
2242 const int c = FGCol[nc];
2244 dX[count] =
fabs(dr[0]);
2245 dY[count] =
fabs(dr[1]);
2246 dZ[count] =
fabs(dr[2]);
2249 const T u = dX[0]/(dX[0]+dX[2]);
2250 const T v = dY[0]/(dY[0]+dY[1]);
2254 wt[0] = (1.-u)*(1.-v);
2256 for(
int nc=FGRow[n]; nc<FGRow[n+1]; nc++)
2258 gridToFaceCoeff[nc] = wt[count];
2268 this->_geomFields._interpolationMatrices[key1] = gridToFaces;
2284 shared_ptr<IMatrix> particlesToCell(
new IMatrix(cellToParticles));
2364 this->_geomFields._interpolationMatrices[key2] = particlesToCell;
2373 const int numMeshes = _meshes.size();
2374 for (
int n=0; n<numMeshes; n++)
2376 const Mesh& mesh = *_meshes[n];
2377 computeIBInterpolationMatrices(mesh,p, option);
2384 const int numMeshes = _meshes.size();
2385 for (
int n=0; n<numMeshes; n++)
2387 const Mesh& mesh = *_meshes[n];
2388 computeIBInterpolationMatricesCells(mesh);
2395 const int numMeshes = _meshes.size();
2396 for (
int n=0; n<numMeshes; n++)
2398 const Mesh& mesh = *_meshes[n];
2403 this->_geomFields._interpolationMatrices.erase(key1);
2407 this->_geomFields._interpolationMatrices.erase(key2);
2411 this->_geomFields._interpolationMatrices.erase(key3);
2420 const int numMeshes = _meshes.size();
2421 for (
int n=0; n<numMeshes; n++)
2423 const Mesh& mesh = *_meshes[n];
2424 computeSolidInterpolationMatrices(mesh,p);
2432 const int numMeshes = _meshes.size();
2433 for (
int n=0; n<numMeshes; n++)
2435 const Mesh& mesh = *_meshes[n];
2436 computeIBandSolidInterpolationMatrices(mesh,p);
2444 const int numMeshes = _meshes.size();
2445 for (
int n=0; n<numMeshes; n++)
2447 const Mesh& mesh = *_meshes[n];
2448 computeGridInterpolationMatrices(mesh,g, f);
2459 #ifdef USING_ATYPE_TANGENT
2465 const Mesh& mesh = *_meshes[meshID];
2474 if (fg.
id == faceGroupID)
2478 const int nFaces = faces.
getCount();
2479 for(
int f=0; f<nFaces; f++)
2481 const int nFaceNodes = faceNodes.
getCount(f);
2482 for(
int nf=0; nf<nFaceNodes; nf++)
2484 VectorT3& xn = nodeCoords[faceNodes(f,nf)];
2494 throw CException(
"setTangentCoords: invalid faceGroupID");
2496 const int numMeshes = _meshes.size();
2497 for (
int n=0; n<numMeshes; n++)
2499 const Mesh& mesh = *_meshes[n];
2500 calculateFaceAreas(mesh);
2501 calculateFaceAreaMag(mesh);
2502 calculateFaceCentroids(mesh);
2503 calculateCellCentroids(mesh);
2504 calculateCellVolumes(mesh);
const CRConnectivity & getAllFaceNodes() const
const FaceGroupList & getBoundaryFaceGroups() const
const Array< int > & getCol() const
int getCount(const int i) const
bool isDoubleShell() const
const Array< int > & getRow() const
shared_ptr< FaceGroup > FaceGroupPtr
virtual void calculateCellVolumes(const Mesh &mesh)
const StorageSite & getIBFaces() const
const CRConnectivity & getConnectivity(const StorageSite &from, const StorageSite &to) const
void computeGridInterpolationMatrices(const StorageSite &grids, const StorageSite &faces)
const StorageSite & getParentFaceGroupSite() const
void eraseConnectivity(const StorageSite &rowSite, const StorageSite &colSite) const
void eraseIBInterpolationMatrices(const StorageSite &particles)
PeriodicFacePairs & getPeriodicFacePairs()
const FaceGroupList & getAllFaceGroups() const
const StorageSite & getNodes() const
const Array< int > & getIBFaceList() const
double max(double x, double y)
const CRConnectivity & getFaceNodes(const StorageSite &site) const
T mag(const Vector< T, 3 > &a)
map< int, int > PeriodicFacePairs
void recalculate_deform()
Array< Vector< double, 3 > > VectorT3Array
virtual void calculateFaceCentroids(const Mesh &mesh)
const CRConnectivity & getAllFaceCells() const
const StorageSite & getBoundaryNodes() const
virtual ~MeshMetricsCalculator()
MeshMetricsCalculator(GeomFields &geomFields, const MeshList &meshes, bool transient=false)
const Array< VecD3 > & getNodeCoordinates() const
virtual void calculateNodeCoordinates(const Mesh &mesh)
void computeSolidInterpolationMatrices(const StorageSite &particles)
Array< int > & getLocalToGlobal()
void computeIBInterpolationMatricesCells()
const StorageSite & getFaces() const
virtual void calculateCellCentroids(const Mesh &mesh)
void computeIBandSolidInterpolationMatrices(const StorageSite &particles)
const StorageSite & getCells() const
Vector< T, 3 > cross(const Vector< T, 3 > &a, const Vector< T, 3 > &b)
virtual void calculateFaceAreas(const Mesh &mesh)
virtual void calculateFaceAreaMag(const Mesh &mesh)
int getCountLevel1() const
const CRConnectivity & getFaceCells(const StorageSite &site) const
SquareMatrix< T, 2 > inverse(SquareMatrix< T, 2 > &a)
Tangent fabs(const Tangent &a)
void computeIBInterpolationMatrices(const StorageSite &particles, const int option=0)
shared_ptr< Array< int > > createAndGetBNglobalToLocal() const
double min(double x, double y)
void calculateBoundaryNodeNormal()
T dot(const Vector< T, 3 > &a, const Vector< T, 3 > &b)
pair< const StorageSite *, const StorageSite * > SSPair
vector< Mesh * > MeshList
T determinant(SquareMatrix< T, 2 > &a)