37 template<
class X,
class Diag,
class OffDiag>
88 const X fluxB = -
_r[c1];
90 const X dXC1 = bValue -
_x[c1];
116 const X& specifiedFlux)
const
120 const X fluxB = -
_r[c1];
126 dFlux[0]= (-(specifiedFlux[0]*
_faceArea[f][0] +
127 specifiedFlux[1]*
_faceArea[f][1])*dzeta1[0])
129 dFlux[1]= (-(specifiedFlux[0]*
_faceArea[f][0] +
130 specifiedFlux[1]*
_faceArea[f][1])*dzeta1[1])
132 dFlux[2]= (specifiedFlux[0]*
_faceArea[f][0] +
148 const X& specifiedFlux)
const
152 const X fluxB = -
_r[c1];
185 const X fluxB = -
_r[c1];
247 const X xB = this->
_x[c0] - 2.*xC0_dotn * en;
249 Diag dxBdxC0(Diag::getZero());
250 dxBdxC0(0,0) = 1.0 - 2.*en[0]*en[0];
251 dxBdxC0(0,1) = - 2.*en[0]*en[1];
252 dxBdxC0(0,2) = - 2.*en[0]*en[2];
254 dxBdxC0(1,0) = - 2.*en[1]*en[0];
255 dxBdxC0(1,1) = 1.0 - 2.*en[1]*en[1];
256 dxBdxC0(1,2) = - 2.*en[1]*en[2];
258 dxBdxC0(2,0) = - 2.*en[2]*en[0];
259 dxBdxC0(2,1) = - 2.*en[2]*en[1];
260 dxBdxC0(2,2) = 1.0 - 2.*en[2]*en[2];
263 const X xc1mxB = xB-this->
_x[c1];
271 this->
_r[c1] = xc1mxB;
324 _geomFields(geomFields),
325 _plateFields(plateFields),
326 _deformationGradientModel(
_meshes,_plateFields.deformation,
327 _plateFields.deformationGradient,_geomFields),
328 _initialDeformationNorm(),
331 const int numMeshes =
_meshes.size();
332 for (
int n=0; n<numMeshes; n++)
338 _vcMap[mesh.
getID()] = vc;
342 if ((_bcMap.find(fg.
id) == _bcMap.end())&&(fg.
groupType !=
"interior"))
349 bc->
bcType =
"SpecifiedTraction";
359 else if ((fg.
groupType ==
"velocity-inlet") ||
362 bc->
bcType =
"SpecifiedDeformation";
364 else if (fg.
groupType ==
"pressure-outlet")
366 bc->
bcType =
"SpecifiedForce";
369 throw CException(
"PlateModel: unknown face group type "
378 const int numMeshes =
_meshes.size();
379 for (
int n=0; n<numMeshes; n++)
391 initialDeformation[0] = _options[
"initialXRotation"];
392 initialDeformation[1] = _options[
"initialYRotation"];
393 initialDeformation[2] = _options[
"initialZDeformation"];
394 *sCell = initialDeformation;
396 _plateFields.deformation.addArray(cells,sCell);
397 _plateFields.deformation.syncLocal();
399 if (_options.transient)
401 _plateFields.volume0.addArray(cells,
402 dynamic_pointer_cast<ArrayBase>
403 (_geomFields.volume[cells].newCopy()));
404 _plateFields.volume0.syncLocal();
406 _plateFields.deformationN1.addArray(cells,
407 dynamic_pointer_cast<ArrayBase>(sCell->newCopy()));
408 _plateFields.deformationN1.syncLocal();
410 _plateFields.deformationN2.addArray(cells,
411 dynamic_pointer_cast<ArrayBase>(sCell->newCopy()));
412 _plateFields.deformationN2.syncLocal();
414 if (_options.timeDiscretizationOrder > 1)
415 _plateFields.deformationN3.addArray(cells,
416 dynamic_pointer_cast<ArrayBase>(sCell->newCopy()));
417 _plateFields.deformationN3.syncLocal();
419 if(_options.variableTimeStep)
421 _options.timeStepN1 = _options[
"timeStep"];
422 _options.timeStepN2 = _options[
"timeStep"];
428 _plateFields.stress.addArray(cells,stressField);
429 _plateFields.stress.syncLocal();
432 devStressField->zero();
433 _plateFields.devStress.addArray(cells,devStressField);
434 _plateFields.devStress.syncLocal();
437 VMStressField->zero();
438 _plateFields.VMStress.addArray(cells,VMStressField);
439 _plateFields.VMStress.syncLocal();
442 VMStressOutField->zero();
443 _plateFields.VMStressOut.addArray(cells,VMStressOutField);
444 _plateFields.VMStressOut.syncLocal();
448 _plateFields.strain.addArray(cells,strainField);
449 _plateFields.strain.syncLocal();
452 plasticStrainField->zero();
453 _plateFields.plasticStrain.addArray(cells,plasticStrainField);
454 _plateFields.plasticStrain.syncLocal();
457 plasticStrainOutField->zero();
458 _plateFields.plasticStrainOut.addArray(cells,plasticStrainOutField);
459 _plateFields.plasticStrainOut.syncLocal();
462 plasticStrainN1Field->zero();
463 _plateFields.plasticStrainN1.addArray(cells,plasticStrainN1Field);
464 _plateFields.plasticStrainN1.syncLocal();
467 plasticMomentField->zero();
468 _plateFields.plasticMoment.addArray(cells,plasticMomentField);
469 _plateFields.plasticMoment.syncLocal();
472 *rhoCell = vc[
"density"];
473 _plateFields.density.addArray(cells,rhoCell);
474 _plateFields.density.syncLocal();
478 _plateFields.ym.addArray(cells,ymCell);
479 _plateFields.ym.syncLocal();
483 _plateFields.nu.addArray(cells,nuCell);
484 _plateFields.nu.syncLocal();
488 _plateFields.force.addArray(cells,forceCell);
489 _plateFields.force.syncLocal();
492 thicknessCell->zero();
493 _plateFields.thickness.addArray(cells,thicknessCell);
494 _plateFields.thickness.syncLocal();
497 accelerationCell->zero();
498 _plateFields.acceleration.addArray(cells,accelerationCell);
499 _plateFields.acceleration.syncLocal();
503 _plateFields.velocity.addArray(cells,velCell);
504 _plateFields.velocity.syncLocal();
509 residualStress[0][0] = _options[
"residualStressXX"];
510 residualStress[0][1] = _options[
"residualStressXY"];
511 residualStress[0][2] = _options[
"residualStressXZ"];
512 residualStress[1][0] = _options[
"residualStressXY"];
513 residualStress[1][1] = _options[
"residualStressYY"];
514 residualStress[1][2] = _options[
"residualStressYZ"];
515 residualStress[2][0] = _options[
"residualStressXZ"];
516 residualStress[2][1] = _options[
"residualStressYZ"];
517 residualStress[2][2] = _options[
"residualStressZZ"];
518 *rCell = residualStress;
519 _plateFields.residualStress.addArray(cells,rCell);
520 _plateFields.residualStress.syncLocal();
542 deformationFlux->zero();
545 _plateFields.deformationFlux.addArray(faces,deformationFlux);
552 _initialDeformationNorm =
MFRPtr();
561 const int numMeshes =
_meshes.size();
562 for (
int n=0; n<numMeshes; n++)
568 dynamic_cast<VectorT3Array&
>(_plateFields.deformation[cells]);
570 dynamic_cast<VectorT3Array&
>(_plateFields.deformationN1[cells]);
572 dynamic_cast<VectorT3Array&
>(_plateFields.deformationN2[cells]);
573 if (_options.timeDiscretizationOrder > 1)
576 dynamic_cast<VectorT3Array&
>(_plateFields.deformationN3[cells]);
581 if(_options.variableTimeStep)
583 if (_options.timeDiscretizationOrder > 1)
585 _options.timeStepN2 = _options.timeStepN1;
587 _options.timeStepN1 = _options[
"timeStep"];
590 dynamic_cast<VectorT4Array&
>(_plateFields.plasticStrain[cells]);
592 dynamic_cast<VectorT4Array&
>(_plateFields.plasticStrainN1[cells]);
600 const int numMeshes =
_meshes.size();
601 for (
int n=0; n<numMeshes; n++)
608 ls.
getX().
addArray(wIndex,_plateFields.deformation.getArrayPtr(cells));
621 _deformationGradientModel.compute();
625 if(!_options.constForce)
627 shared_ptr<Discretization>
630 _plateFields.deformation,
633 _plateFields.deformationGradient,
634 _plateFields.residualStress,
635 _plateFields.thickness,
638 _plateFields.devStress,
639 _plateFields.VMStress,
640 _plateFields.plasticStrain,
641 _plateFields.plasticStrainOut,
642 _plateFields.plasticStrainN1,
643 _plateFields.plasticMoment,
650 _options[
"timeStep"],
660 discretizations.push_back(sd);
663 if (_options.transient)
665 shared_ptr<Discretization>
669 _plateFields.deformation,
670 _plateFields.deformationN1,
671 _plateFields.deformationN2,
672 _plateFields.deformationN3,
673 _plateFields.density,
674 _plateFields.thickness,
675 _plateFields.acceleration,
676 _plateFields.volume0,
677 _options.variableTimeStep,
678 _options[
"timeStep"],
680 _options.timeStepN2));
682 discretizations.push_back(td);
696 bool allNeumann =
true;
697 const int numMeshes =
_meshes.size();
698 for (
int n=0; n<numMeshes; n++)
708 const int nFaces = faces.
getCount();
709 const TArray& faceAreaMag =
710 dynamic_cast<const TArray&
>(_geomFields.areaMag[faces]);
716 _plateFields.deformation,
721 if (bc.
bcType ==
"Clamped")
724 bDeformation(bc.
getVal(
"specifiedXRotation"),
725 bc.
getVal(
"specifiedYRotation"),
726 bc.
getVal(
"specifiedZDeformation"),
732 else if (bc.
bcType ==
"Symmetry")
734 gbc.applySymmetryBC();
737 else if (bc.
bcType ==
"ZeroDerivative")
739 gbc.applyZeroDerivativeBC();
741 else if (bc.
bcType ==
"SpecifiedTraction")
743 for(
int f=0; f<nFaces; f++)
750 else if (bc.
bcType ==
"SpecifiedForce")
753 bForce(bc.
getVal(
"specifiedXForce"),
754 bc.
getVal(
"specifiedYForce"),
755 bc.
getVal(
"specifiedZForce"),
757 for(
int f=0; f<nFaces; f++)
764 else if (bc.
bcType ==
"SpecifiedShear")
767 bShear(bc.
getVal(
"specifiedXShear"),
768 bc.
getVal(
"specifiedYShear"),
769 bc.
getVal(
"specifiedZShear"),
771 for(
int f=0; f<nFaces; f++)
778 else if (bc.
bcType !=
"Interface")
802 int allNeumannInt = int( allNeumann);
803 MPI::COMM_WORLD.Allreduce(MPI::IN_PLACE, &allNeumannInt, count, MPI::INT, MPI::PROD);
804 allNeumann = bool(allNeumannInt);
809 if(allNeumann && !_options.transient)
818 (_plateFields.deformation[cells]);
827 shared_ptr<Discretization>
829 (
_meshes,_structureFields.deformation,
830 _options[
"deformationURF"]));
833 discretizations2.push_back(ud);
845 initDeformationLinearization(ls);
847 linearizeDeformation(ls);
851 MFRPtr rNorm = _options.getDeformationLinearSolver().solve(ls);
852 if (!_initialDeformationNorm) _initialDeformationNorm = rNorm;
854 _options.getDeformationLinearSolver().cleanup();
858 if (_options.transient){
859 calculatePlateVelocity();
860 calculatePlateAcceleration();
867 const int numMeshes =
_meshes.size();
868 for(
int n=0;n<numMeshes;n++)
874 dynamic_cast<const VectorT3Array&
>(_plateFields.deformation[cells]);
876 dynamic_cast<const VectorT3Array&
>(_plateFields.deformationN1[cells]);
879 const T timeStep = _options[
"timeStep"];
880 for (
int c=0; c<nCells; c++){
881 velocity[c] = (w[c]-wN1[c])/timeStep;
900 const int numMeshes =
_meshes.size();
901 for(
int n=0;n<numMeshes;n++)
908 dynamic_cast<TArray&
>(_plateFields.acceleration[cells]);
910 dynamic_cast<const VectorT3Array&
>(_plateFields.deformation[cells]);
912 dynamic_cast<const VectorT3Array&
>(_plateFields.deformationN1[cells]);
914 dynamic_cast<const VectorT3Array&
>(_plateFields.deformationN2[cells]);
916 dynamic_cast<const TArray&
> (_plateFields.density[cells]);
918 if(!_options.variableTimeStep)
920 if (_options.timeDiscretizationOrder > 1)
923 dynamic_cast<const VectorT3Array&
>(_plateFields.deformationN3[cells]);
924 for(
int c=0; c<nCells; c++)
926 const T_Scalar rhobydT2 = density[c]/dT2;
927 acceleration[c] = rhobydT2*(two*w[c][2] - five*wN1[c][2] + four*wN2[c][2]
933 for(
int c=0; c<nCells; c++)
935 const T_Scalar rhobydT2 = density[c]/dT2;
936 acceleration[c] = rhobydT2*(w[c][2]- two*wN1[c][2] + wN2[c][2]);
943 T_Scalar dTN1 = _options.timeStepN1;
944 T_Scalar dTN2 = _options.timeStepN2;
948 if (_options.timeDiscretizationOrder > 1)
951 dynamic_cast<const VectorT3Array&
>(_plateFields.deformationN3[cells]);
952 T_Scalar c1 = (two*a*b*(pow(a,two)-pow(b,two))+two*b*(pow(b,two)-one)-two*a*(pow(a,two)-one))/
953 (a*b*(a-one)*(b-one)*(a-b));
954 T_Scalar c2 = -two*(a+b)/((a-1)*(b-1));
955 T_Scalar c3 = -two*(b+one)/(a*(a-b)*(a-one));
956 T_Scalar c4 = two*(a+one)/(b*(a-b)*(b-one));
957 for(
int c=0; c<nCells; c++)
959 const T_Scalar rhobydT2 = density[c]/dT2;
960 acceleration[c] = rhobydT2*(c1*w[c][2] + c2*wN1[c][2] + c3*wN2[c][2]
969 for(
int c=0; c<nCells; c++)
971 const T_Scalar rhobydT2 = density[c]/dT2;
972 acceleration[c] = rhobydT2*(c1*w[c][2] + c2*wN1[c][2]
984 const int numMeshes =
_meshes.size();
985 for(
int n=0;n<numMeshes;n++)
993 (_plateFields.deformation[cells]);
999 for(
int c=0;c<nCells;c++)
1009 for(
int n=0; n<niter; n++)
1011 MFRPtr dNorm = solveDeformation();
1015 _initialDeformationNorm->setMax(*dNorm);
1018 MFRPtr dNormRatio(dNorm->normalize(*_initialDeformationNorm));
1020 if (_options.printNormalizedResiduals)
1021 cout << _niters <<
": " << *dNormRatio << endl;
1023 cout << _niters <<
": " << *dNorm << endl;
1026 if (*dNormRatio < _options.deformationTolerance)
1034 foreach(
typename PlateBCMap::value_type& pos, _bcMap)
1036 cout <<
"Face Group " << pos.first <<
":" << endl;
1037 cout <<
" bc type " << pos.second->bcType << endl;
1040 cout <<
" " << vp.first <<
" " << vp.second.constant << endl;
1051 shared_ptr<VectorT3Array> momentPtr(
new VectorT3Array(nCells));
1053 _plateFields.moment.addArray(cells,momentPtr);
1056 _deformationGradientModel.compute();
1059 dynamic_cast<const VGradArray&
>(_plateFields.deformationGradient[cells]);
1061 const TArray& ym =
dynamic_cast<const TArray&
>(_plateFields.ym[cells]);
1062 const TArray& nu =
dynamic_cast<const TArray&
>(_plateFields.nu[cells]);
1064 const TArray& thickness =
dynamic_cast<const TArray&
>(_plateFields.thickness[cells]);
1066 TArray& VMStress =
dynamic_cast<TArray&
>(_plateFields.VMStress[cells]);
1067 TArray& VMStressOut =
dynamic_cast<TArray&
>(_plateFields.VMStressOut[cells]);
1071 dynamic_cast<VectorT4Array&
>(_plateFields.devStress[cells]);
1073 dynamic_cast<VectorT4Array&
>(_plateFields.plasticStrain[cells]);
1076 dynamic_cast<VectorT3Array&
>(_plateFields.plasticMoment[cells]);
1081 const T onethird(1.0/3.0);
1086 const T twelve(12.0);
1089 for(
int n=0; n<nCells; n++)
1091 T cellD = ym[n]*pow(thickness[n],three)/(twelve*(one - pow(nu[n],two)));
1095 moment[n][0] = cellD*(wg[0][0]+nu[n]*wg[1][1]);
1096 moment[n][1] = cellD*(wg[1][1]+nu[n]*wg[0][0]);
1097 moment[n][2] = cellD*((one-nu[n])/two)*(wg[1][0]+wg[0][1]);
1099 moment[n] = moment[n] - plasticMoment[n];
1101 cellStress[n][0] = six*moment[n][0]/pow(thickness[n],two);
1102 cellStress[n][1] = six*moment[n][1]/pow(thickness[n],two);
1103 cellStress[n][2] = six*moment[n][2]/pow(thickness[n],two);
1105 cellStrain[n][0] = (thickness[n]/two)*wg[0][0];
1106 cellStrain[n][1] = (thickness[n]/two)*wg[1][1];
1107 cellStrain[n][2] = (thickness[n]/two)*(wg[1][0]+wg[0][1]);
1109 T cellE = ym[n]/(one - pow(nu[n],two));
1111 int nn = n*(_options.nz+1);
1112 for(
int k=0; k<=_options.nz; k++)
1114 T zz(thickness[n]*(T(k)-T(_options.nz)/T(2))/T(_options.nz));
1115 stress[0] = (twelve*zz/pow(thickness[n],three))*cellD*(wg[0][0]+nu[n]*wg[1][1])-
1116 cellE*(pg[nn+k][0]+nu[n]*pg[nn+k][1]);
1117 stress[1] = (twelve*zz/pow(thickness[n],three))*cellD*(wg[1][1]+nu[n]*wg[0][0])-
1118 cellE*(pg[nn+k][1]+nu[n]*pg[nn+k][0]);
1119 stress[2] = (twelve*zz/pow(thickness[n],three))*cellD*((one-nu[n])/two)*(wg[1][0]+wg[0][1])-
1120 cellE*(one-nu[n])*(pg[nn+k][3]);
1122 T trace = stress[0] + stress[1];
1123 devStress[nn+k][0] = stress[0];
1124 devStress[nn+k][1] = stress[1];
1125 devStress[nn+k][2] = zero;
1126 devStress[nn+k][3] = stress[2];
1127 devStress[nn+k][0] = devStress[nn+k][0] - onethird*trace;
1128 devStress[nn+k][1] = devStress[nn+k][1] - onethird*trace;
1129 devStress[nn+k][2] = devStress[nn+k][2] - onethird*trace;
1130 VMStress[nn+k] =
sqrt(pow(stress[0],2.0) + pow(stress[1],2.0) -
1131 stress[0]*stress[1] + three*pow(stress[2],2.0));
1134 VMStressOut[n] = VMStress[nn+_options.nz];
1138 map<string,shared_ptr<ArrayBase> >&
1144 (*niterArray)[0] = _niters;
1147 if (_initialDeformationNorm)
1150 _initialDeformationNorm->getArrayPtr(_plateFields.deformation);
1168 _niters = niterArray[0];
1174 _initialDeformationNorm->addArray(_plateFields.deformation,r);
1178 #if !(defined(USING_ATYPE_TANGENT) || defined(USING_ATYPE_PC))
1183 initDeformationLinearization(ls);
1185 linearizeDeformation(ls);
1211 const int dimension = 3;
1213 const int dim2 = dimension*dimension;
1215 int nFlatRows = dimension*nCells;
1217 int nFlatCoeffs = nCells*dim2;
1219 for(
int i=0; i<nCells; i++)
1220 for(
int jp=row[i]; jp<row[i+1]; jp++)
1222 const int j = col[jp];
1223 if (j<nCells) nFlatCoeffs += dim2;
1226 string matFileName = fileBase +
".mat";
1227 FILE *matFile = fopen(matFileName.c_str(),
"wb");
1229 fprintf(matFile,
"%%%%MatrixMarket matrix coordinate real general\n");
1230 fprintf(matFile,
"%d %d %d\n", nFlatRows,nFlatRows,nFlatCoeffs);
1232 for(
int i=0; i<nCells; i++)
1234 for(
int ndr=0; ndr<dimension; ndr++)
1235 for(
int ndc=0; ndc<dimension; ndc++)
1237 const int nfr = i*dimension + ndr;
1238 const int nfc = i*dimension + ndc;
1239 T ap = diag[i](ndr,ndc);
1241 fprintf(matFile,
"%d %d %22.15le\n", nfr+1, nfc+1, ap);
1244 for(
int jp=row[i]; jp<row[i+1]; jp++)
1246 const int j = col[jp];
1249 for(
int ndr=0; ndr<dimension; ndr++)
1250 for(
int ndc=0; ndc<dimension; ndc++)
1252 const int nfr = i*dimension + ndr;
1253 const int nfc = j*dimension + ndc;
1254 T anb = coeff[jp](ndr,ndc);
1256 fprintf(matFile,
"%d %d %22.15le\n", nfr+1, nfc+1, anb);
1264 string rhsFileName = fileBase +
".rhs";
1265 FILE *rhsFile = fopen(rhsFileName.c_str(),
"wb");
1267 for(
int i=0; i<nCells; i++)
1268 for(
int nd=0; nd < dimension; nd++)
1269 fprintf(rhsFile,
"%22.15le\n",-rCell[i][nd]);
1298 _impl(new
Impl(geomFields,plateFields,meshes))
1341 return _impl->advance(niter);
1348 _impl->updateTime();
1355 return _impl->getMoment(mesh);
1362 _impl->dumpMatrix(fileBase);
1367 map<string,shared_ptr<ArrayBase> >&
1370 return _impl->getPersistenceData();
const Array< int > & getCol() const
PlateModel(const GeomFields &geomFields, PlateFields &plateFields, const MeshList &meshes)
const Array< int > & getRow() const
GradientModel< VectorT3 > _deformationGradientModel
Matrix & getMatrix(const Index &rowIndex, const Index &colIndex)
X applyNeumannBC(const int f, const X &specifiedFlux) const
shared_ptr< FaceGroup > FaceGroupPtr
void applyInterfaceBC(const int f) const
void initDeformationLinearization(LinearSystem &ls)
X applyCantileverBC(const int f, const X &specifiedFlux) const
Gradient< VectorT3 > VGradType
VVMatrix::DiagArray VVDiagArray
Array< VectorT3 > VectorT3Array
const StorageSite & _cells
const VectorT3Array & _cellCoord
CRMatrix< Diag, OffDiag, X > CCMatrix
Array< Gradient< VectorT3 > > VGradArray
const FaceGroupList & getAllFaceGroups() const
PlateFields & _plateFields
VectorTranspose< T, 3 > VectorT3T
const VectorT3Array & _faceCoord
void applyInterfaceBC() const
std::map< int, PlateBC< T > * > PlateBCMap
map< string, shared_ptr< ArrayBase > > _persistenceData
void getMoment(const Mesh &mesh)
map< string, shared_ptr< ArrayBase > > _persistenceData
NumTypeTraits< X >::T_Scalar T_Scalar
OffDiag & getCoeff10(const int np)
Array< Diag > & getDiag()
PlateModelOptions< T > & getOptions()
virtual map< string, shared_ptr< ArrayBase > > & getPersistenceData()
const TArray & _faceAreaMag
FluxJacobianMatrix< Diag, X > FMatrix
void applySymmetryBC() const
virtual const CRConnectivity & getConnectivity() const
X applyNeumannBC(const X &bFlux) const
const VectorT3Array & _faceArea
FloatVal< T > getVal(const string varName) const
void linearizeDeformation(LinearSystem &ls)
Array< Vector< double, 3 > > VectorT3Array
SquareTensor< T, 3 > DiagTensorT3
Array< OffDiag > & getOffDiag()
Tangent sqrt(const Tangent &a)
std::map< int, PlateVC< T > * > PlateVCMap
const MultiField::ArrayIndex _xIndex
Vector< T_Scalar, 3 > VectorT3
X applyZeroDerivativeBC() const
Array< OffDiag > OffDiagArray
PlateModelOptions< T > & getOptions()
X applyNeumannBC(const FloatValEvaluator< X > &bFlux) const
bool advance(const int niter)
pair< const Field *, const StorageSite * > ArrayIndex
map< string, shared_ptr< ArrayBase > > & getPersistenceData()
MFRPtr solveDeformation()
vector< shared_ptr< Discretization > > DiscrList
X applyDirichletBC(const X &bValue) const
const CRConnectivity & _faceCells
Array< VectorT4 > VectorT4Array
MFRPtr _initialDeformationNorm
const StorageSite & getCells() const
CCMatrix::PairWiseAssembler CCAssembler
X applyDirichletBC(const FloatValEvaluator< X > &bValue) const
int getCountLevel1() const
OffDiag & getCoeff01(const int np)
PlateModelOptions< T > _options
void calculatePlateAcceleration()
void postPlateSolve(LinearSystem &ls)
Array< VectorT3 > VectorT3Array
Impl(const GeomFields &geomFields, PlateFields &plateFields, const MeshList &meshes)
void addMatrix(const Index &rowI, const Index &colI, shared_ptr< Matrix > m)
void setBoundary(const int nr)
void calculatePlateVelocity()
const CRConnectivity & getCellCells2() const
DiagonalMatrix< Diag, X > BBMatrix
CRMatrix< DiagTensorT3, DiagTensorT3, VectorT3 > VVMatrix
void dumpMatrix(const string fileBase)
void getMoment(const Mesh &mesh)
X applyDirichletBC(int f, const X &bValue) const
shared_ptr< MultiFieldReduction > MFRPtr
void addArray(const ArrayIndex &aIndex, shared_ptr< ArrayBase > a)
void dumpMatrix(const string fileBase)
void setDirichlet(const int nr)
const StorageSite & _faces
T dot(const Vector< T, 3 > &a, const Vector< T, 3 > &b)
const GeomFields & _geomFields
PlateBCS(const StorageSite &faces, const Mesh &mesh, const GeomFields &geomFields, Field &varField, MultiFieldMatrix &matrix, MultiField &xField, MultiField &rField)
bool advance(const int niter)
void eliminateDirichlet(const int j, Array< X > &b, const X &delta_j, const bool explicitMode=false)
virtual void linearize(DiscrList &discretizations, const MeshList &meshes, MultiFieldMatrix &matrix, MultiField &x, MultiField &b)
MultiFieldMatrix & getMatrix()
vector< Mesh * > MeshList
const Field & _areaMagField