50LevelSetPCS :: initialize()
54 OOFEM_ERROR(
"size of levelSetValues does not match number of dof managers");
58 int nnodes =
domain->giveNumberOfDofManagers();
60 for (
int i = 1; i <= nnodes; i++ ) {
62 domain->giveNode(i)->giveCoordinate(
ci2) );
89 for (
int i = 1; i <= nvert; i++ ) {
123 OOFEM_ERROR(
"giveInputRecord not implemented yet");
131 int i, j, l, inodes, inode;
132 int ndofman =
domain->giveNumberOfDofManagers();
133 bool twostage =
true;
135 double help, dt, volume, gfi_norm;
146 int __step = 0, __nstep = 10;
157 for ( inode = 1; inode <= ndofman; inode++ ) {
158 if ( fabs( w.
at(inode) ) > 0.0 ) {
171 }
else if (
nsd == 3 ) {
172 mask = {V_u, V_v, V_w};
180 for ( l = 1; l <= elems->
giveSize(); l++ ) {
182 ielem =
domain->giveElement( elems->
at(l) );
189 for ( i = 1; i <= inodes; i++ ) {
194 for ( j = 1; j <=
nsd; j++ ) {
196 for ( i = 1; i <= inodes; i++ ) {
197 gfi.at(j) += dN.
at(i, j) * fi.at(i);
202 gfi_norm = gfi.computeNorm();
203 if ( gfi_norm > 1.e-6 ) {
216 for ( inode = 1; inode <= ndofman; inode++ ) {
217 if ( w.
at(inode) > 0.0 ) {
221 0.5 *dt *fs.at(inode) / w.
at(inode);
227 }
while ( ++__step < __nstep );
245LevelSetPCS :: computeCriticalTimeStep(
TimeStep *tStep)
258 Element *elem =
domain->giveSpatialLocalizer()->giveElementContainingPoint(position);
264 for (
int i = 1; i <= inodes; i++ ) {
285LevelSetPCS :: giveElementMaterialMixture(
FloatArray &answer,
int ie)
287#ifdef LevelSetPCS_CACHE_ELEMENT_VOF
296 for (
int _ie = 1; _ie <=
domain->giveNumberOfElements(); _ie++ ) {
301 for (
int i = 1; i <= inodes; i++ ) {
320 for (
int i = 1; i <= inodes; i++ ) {
324 interface->LS_PCS_computeVOFFractions(answer, fi);
349 int ndofman =
domain->giveNumberOfDofManagers();
350 int nelem =
domain->giveNumberOfElements();
351 bool twostage =
false;
369 for (
int ie = 1; ie <= nelem; ie++ ) {
374 for (
int i = 1; i <= inodes; i++ ) {
384 for (
int i = 1; i <= inodes; i++ ) {
386 _boundary.
at(_node) = 1;
401 for (
int inode = 1; inode <= ndofman; inode++ ) {
402 if ( _boundary.
at(inode) ) {
406 if ( fabs( w.at(inode) ) > 0.0 ) {
407 c = dt * fs.at(inode) / w.at(inode);
418 for (
int inode = 1; inode <= ndofman; inode++ ) {
419 if ( _boundary.
at(inode) ) {
423 if ( fabs( w.at(inode) ) > 0.0 ) {
426 d.
at(inode) = 0.5 * ( d_old.
at(inode) + d.
at(inode) ) -
427 0.5 *dt *fs.at(inode) / w.at(inode);
428 cm =
max( cm, fabs( ( d.
at(inode) - d_old.
at(inode) ) / d_old.
at(inode) ) );
432 }
while ( ( cm > this->
reinit_err ) && ( ++nite < 2000 ) );
435 OOFEM_LOG_INFO(
"LevelSetPCS :: redistance - error %le in %d iterations", cm, nite);
444 int ndofman =
domain->giveNumberOfDofManagers(), nelem =
domain->giveNumberOfElements();
445 double alpha, dfi, help, sumkn, F, f, volume, gfi_norm;
456 for (
int ie = 1; ie <= nelem; ie++ ) {
470 for (
int i = 1; i <= inodes; i++ ) {
480 for (
int i = 1; i <= inodes; i++ ) {
481 if ( gfi_norm > 1.e-12 ) {
483 for (
int j = 1; j <=
nsd; j++ ) {
484 n.at(j) =
nsd * dN.
at(i, j) * volume;
489 OOFEM_LOG_INFO(
"LevelSetPCS :: pcs_stage1 - zero gfi_norm for %d node", i);
494 dfi = fi.dotProduct(k);
495 for (
int i = 1; i <= inodes; i++ ) {
498 for (
int l = 1; l <= inodes; l++ ) {
499 help +=
negbra( k.at(l) ) * ( fi.at(i) - fi.at(l) );
500 sumkn +=
negbra( k.at(l) );
503 if ( fabs(sumkn) > 1.e-12 ) {
504 dfii.
at(i) =
macbra( k.at(i) ) * help / sumkn;
506 OOFEM_LOG_INFO(
"LevelSetPCS :: pcs_stage1 - zero sumkn for %d node", i);
513 for (
int l = 1; l <= inodes; l++ ) {
514 help +=
max(0.0, dfii.
at(l) / dfi);
517 for (
int i = 1; i <= inodes; i++ ) {
519 if ( fabs(help) > 0.0 ) {
520 alpha =
max(0.0, dfii.
at(i) / dfi) / help;
521 fs.
at(_ig) += alpha * ( dfi - f * volume );
522 w.
at(_ig) += alpha * volume;
526 OOFEM_ERROR(
"element %d does not implement LevelSetPCSElementInterfaceType", ie);
538 return interface->LS_PCS_computeF(
this, tStep);
540 return interface->LS_PCS_computeS(
this, tStep);
555 return interface->LS_PCS_computeS(
this, tStep);
568 int jnode, enodes, __pos, __neg, nelem =
domain->giveNumberOfElements();
570 std :: list< int >bcDofMans;
575 for (
int i = 1; i <= nelem; i++ ) {
580 for (
int j = 1; j <= enodes; j++ ) {
582 if ( _lsval > 0.0 ) {
586 if ( _lsval < 0.0 ) {
591 if ( ( __pos && __neg ) || ( __pos + __neg < enodes ) ) {
594 for (
int j = 1; j <= enodes; j++ ) {
597 if ( ( dmanValues.
at(jnode) = this->giveLevelSetDofManValue(jnode) ) >= 0. ) {
598 bcDofMans.push_front(jnode);
600 bcDofMans.push_front(-jnode);
608 fmm.
solve(dmanValues, bcDofMans, 1.0);
610 for (
int &node: bcDofMans ) {
615 fmm.
solve(dmanValues, bcDofMans, -1.0);
648#ifdef LevelSetPCS_CACHE_ELEMENT_VOF
const IntArray * giveDofManConnectivityArray(int dofman)
virtual int read(int *data, std::size_t count)=0
Reads count integer values into array pointed by data.
virtual int write(const int *data, std::size_t count)=0
Writes count integer values from array pointed by data.
virtual int giveNumberOfNodes() const
virtual int giveNumberOfDofManagers() const
int giveDofManagerNumber(int i) const
virtual bool computeLocalCoordinates(FloatArray &answer, const FloatArray &gcoords)
virtual Interface * giveInterface(InterfaceType t)
Domain * domain
Link to domain object, useful for communicating with other FEM components.
void solve(FloatArray &dmanValues, const std ::list< int > &bcDofMans, double F)
double computeNorm() const
double dotProduct(const FloatArray &x) const
Index giveSize() const
Returns the size of receiver.
void zero()
Zeroes all coefficients of receiver.
void beTProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
double at(std::size_t i, std::size_t j) const
virtual void LS_PCS_computedN(FloatMatrix &answer)=0
virtual void LS_PCS_computeVOFFractions(FloatArray &answer, FloatArray &fi)=0
virtual double LS_PCS_computeVolume()=0
Returns receiver's volume.
void reinitialization(TimeStep *tStep)
std ::vector< FloatArray > elemVof
int reinit_alg
Type of reinitialization algorithm to use.
int ci1
Indexes of nodal coordinates used to init levelset using initialRefMatVol.
double reinit_err
Reinitialization error limit.
FloatArray previousLevelSetValues
long int elemVofLevelSetVersion
double evalElemFContribution(PCSEqType t, int ie, TimeStep *tStep)
void pcs_stage1(FloatArray &ls, FloatArray &fs, FloatArray &w, TimeStep *tStep, PCSEqType t)
void FMMReinitialization(FloatArray &ls)
double evalElemfContribution(PCSEqType t, int ie, TimeStep *tStep)
long int levelSetVersion
Level set values version.
int nsd
number of spatial dimensions.
FloatArray levelSetValues
Array used to store value of level set function for each node.
void redistance(TimeStep *tStep)
double reinit_dt
Time step used in reinitialization of LS (if apply).
double giveLevelSetDofManValue(int i)
Returns level set value in specific node.
double giveTimeIncrement()
Returns solution step associated time increment.
TimeStep * givePreviousStep()
Returns pointer to previous solution step.
void setCoords(double x, double y)
#define _IFT_LevelSetPCS_ci1
#define _IFT_LevelSetPCS_refmatpoly_y
#define _IFT_LevelSetPCS_ci2
#define _IFT_LevelSetPCS_levelSetValues
#define _IFT_LevelSetPCS_refmatpoly_x
#define _IFT_LevelSetPCS_reinit_alg
#define _IFT_LevelSetPCS_reinit_dt
#define _IFT_LevelSetPCS_reinit_err
#define _IFT_LevelSetPCS_nsd
#define OOFEM_LOG_INFO(...)
double macbra(double x)
Returns the positive part of given float.
FloatArrayF< N > max(const FloatArrayF< N > &a, const FloatArrayF< N > &b)
double negbra(double x)
Returns the negative part of given float.
@ LevelSetPCSElementInterfaceType
@ CIO_IOERR
General IO error.