51#ifdef __MPI_PARALLEL_MODE
56#define ZZNRM_ZERO_VALUE 1.e-12
64ZZNodalRecoveryModel :: ~ZZNodalRecoveryModel()
70 int nnodes =
domain->giveNumberOfDofManagers();
73 std :: set< int >unresolvedDofMans;
83#ifdef __MPI_PARALLEL_MODE
84 if ( this->
domain->giveEngngModel()->isParallel() ) {
102 lhs.
resize(regionDofMans);
106 for (
int i = 1; i <= elements.
giveSize(); i++ ) {
107 int ielem = elements.
at(i);
132 if ( regionValSize == 0 ) {
134 rhs.
resize(regionDofMans, regionValSize);
136 if ( regionValSize == 0 ) {
140 nsig.
resize(regionDofMans, regionValSize);
147 for (
int elementNode = 1; elementNode <= elemNodes; elementNode++ ) {
149 lhs.
at( regionNodalNumbers.
at(node) ) += nn.
at(eq);
150 for (
int j = 1; j <= regionValSize; j++ ) {
151 rhs.
at(regionNodalNumbers.
at(node), j) += nsig.
at(eq, j);
158#ifdef __MPI_PARALLEL_MODE
159 if ( this->
domain->giveEngngModel()->isParallel() ) {
164 sol.
resize(regionDofMans * regionValSize);
167 bool missingDofManContribution =
false;
168 unresolvedDofMans.clear();
170 for (
int i = 1; i <= regionDofMans; i++ ) {
171 int eq = ( i - 1 ) * regionValSize;
172 for (
int j = 1; j <= regionValSize; j++ ) {
175 sol.
at(eq + j) = rhs.
at(i, j) / lhs.
at(i);
177 missingDofManContribution =
true;
178 unresolvedDofMans.insert( regionNodalNumbers.
at(i) );
179 sol.
at(eq + j) = 0.0;
187 if ( missingDofManContribution ) {
188 std :: ostringstream msg;
190 for (
int dman: unresolvedDofMans ) {
191 msg << this->
domain->giveDofManager(dman)->giveLabel() <<
' ';
222 double dV =
element->computeVolumeAround(gp);
224 if ( !
element->giveIPValue(stressVector, gp, type, tStep) ) {
256 int size =
element->giveNumberOfDofManagers();
257 fullAnswer.
resize(size, size);
262 double dV =
element->computeVolumeAround(gp);
272 for (
int i = 1; i <= size; i++ ) {
274 for (
int j = 1; j <= size; j++ ) {
275 sum += fullAnswer.
at(i, j);
283#ifdef __MPI_PARALLEL_MODE
286ZZNodalRecoveryModel :: initCommMaps()
288 #ifdef __MPI_PARALLEL_MODE
295 OOFEM_LOG_INFO(
"ZZNodalRecoveryModel :: initCommMaps: initialized comm maps");
308 communicator->packAllData(
this, & ls, & ZZNodalRecoveryModel :: packSharedDofManData);
310 communicator->unpackAllData(
this, & ls, & ZZNodalRecoveryModel :: unpackSharedDofManData);
322 for (
int inode : toSendMap ) {
328 result &= pcbuff->
write(1);
330 for (
int j = 1; j <= nc; j++ ) {
331 result &= pcbuff->
write( s->
rhs->
at(indx, j) );
338 result &= pcbuff->
write(0);
355 for (
int inode : toRecvMap ) {
359 result &= pcbuff->
read(flag);
362 result &= pcbuff->
read(value);
365 s->
lhs->
at(indx) += value;
368 for (
int j = 1; j <= nc; j++ ) {
369 result &= pcbuff->
read(value);
371 s->
rhs->
at(indx, j) += value;
#define REGISTER_NodalRecoveryModel(class, type)
elementParallelMode giveParallelMode() const
virtual int giveNumberOfDofManagers() const
DofManager * giveDofManager(int i) const
int giveNumberOfProcesses() const
Returns the number of collaborating processes.
int giveRank() const
Returns domain rank in a group of collaborating processes (0..groupSize-1).
virtual void evalN(FloatArray &answer, const FloatArray &lcoords, const FEICellGeometry &cellgeo) const =0
virtual Interface * giveInterface(InterfaceType t)
void zero()
Zeroes all coefficients of receiver.
void resize(Index rows, Index cols)
*Sets size of receiver to be an empty matrix It will have zero rows and zero columns size void clear()
int giveNumberOfColumns() const
Returns number of columns of receiver.
void plusDyadUnsym(const FloatArray &a, const FloatArray &b, double dV)
void zero()
Zeroes all coefficient of receiver.
void plusDyadSymmUpper(const FloatArray &a, double dV)
double at(std::size_t i, std::size_t j) const
bool initCommMap
Communication init flag.
int initRegionNodeNumbering(IntArray ®ionNodalNumbers, int ®ionDofMans, Set ®ion)
int updateRegionRecoveredValues(const IntArray ®ionNodalNumbers, int regionValSize, const FloatArray &rhs)
CommunicatorBuff * commBuff
Common Communicator buffer.
NodalRecoveryModel(Domain *d)
Constructor.
StateCounterType stateCounter
Time stamp of recovered values.
InternalStateType valType
Determines the type of recovered values.
ProblemCommunicator * communicator
Communicator.
int read(int *data, std::size_t count) override
Reads count integer values into array pointed by data.
int write(const int *data, std::size_t count) override
Writes count integer values from array pointed by data.
const IntArray & giveToRecvMap()
ProcessCommunicatorBuff * giveProcessCommunicatorBuff()
Returns communication buffer.
const IntArray & giveToSendMap()
const IntArray & giveElementList()
StateCounterType giveSolutionStateCounter()
virtual bool ZZNodalRecoveryMI_computeNValProduct(FloatMatrix &answer, InternalStateType type, TimeStep *tStep)
virtual void ZZNodalRecoveryMI_computeNNMatrix(FloatArray &answer, InternalStateType type)
void exchangeDofManValues(FloatArray &lhs, FloatMatrix &rhs, IntArray &rn)
#define OOFEM_WARNING(...)
#define OOFEM_LOG_INFO(...)
#define OOFEM_LOG_RELEVANT(...)
const char * __InternalStateTypeToString(InternalStateType _value)
@ Element_local
Element is local, there are no contributions from other domains to this element.
double sum(const FloatArray &x)
@ ZZNodalRecoveryModelInterfaceType
IntArray * regionNodalNumbers