OOFEM 3.0
Loading...
Searching...
No Matches
levelsetpcs.C
Go to the documentation of this file.
1/*
2 *
3 * ##### ##### ###### ###### ### ###
4 * ## ## ## ## ## ## ## ### ##
5 * ## ## ## ## #### #### ## # ##
6 * ## ## ## ## ## ## ## ##
7 * ## ## ## ## ## ## ## ##
8 * ##### ##### ## ###### ## ##
9 *
10 *
11 * OOFEM : Object Oriented Finite Element Code
12 *
13 * Copyright (C) 1993 - 2025 Borek Patzak
14 *
15 *
16 *
17 * Czech Technical University, Faculty of Civil Engineering,
18 * Department of Structural Mechanics, 166 29 Prague, Czech Republic
19 *
20 * This library is free software; you can redistribute it and/or
21 * modify it under the terms of the GNU Lesser General Public
22 * License as published by the Free Software Foundation; either
23 * version 2.1 of the License, or (at your option) any later version.
24 *
25 * This program is distributed in the hope that it will be useful,
26 * but WITHOUT ANY WARRANTY; without even the implied warranty of
27 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
28 * Lesser General Public License for more details.
29 *
30 * You should have received a copy of the GNU Lesser General Public
31 * License along with this library; if not, write to the Free Software
32 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
33 */
34
35#include "levelsetpcs.h"
36#include "mathfem.h"
37#include "timestep.h"
38#include "node.h"
39#include "element.h"
40#include "datastream.h"
41#include "connectivitytable.h"
42#include "spatiallocalizer.h"
43#include "geotoolbox.h"
44#include "fastmarchingmethod.h"
45#include "error.h"
46#include "contextioerr.h"
47
48namespace oofem {
49void
50LevelSetPCS :: initialize()
51{
52 if ( 0 ) {
53 if ( previousLevelSetValues.giveSize() != domain->giveNumberOfDofManagers() ) {
54 OOFEM_ERROR("size of levelSetValues does not match number of dof managers");
55 }
56 } else {
57 if ( initialRefMatFlag ) {
58 int nnodes = domain->giveNumberOfDofManagers();
59 previousLevelSetValues.resize(nnodes);
60 for ( int i = 1; i <= nnodes; i++ ) {
61 previousLevelSetValues.at(i) = ( -1.0 ) * initialRefMatVol.pointDistance( domain->giveNode(i)->giveCoordinate(ci1),
62 domain->giveNode(i)->giveCoordinate(ci2) );
63 }
64 }
65
67 //previousLevelSetValues.printYourself();
68 }
69
71}
72
73
74void
75LevelSetPCS :: initializeFrom(InputRecord &ir)
76{
78 if ( !previousLevelSetValues.giveSize() ) {
79 FloatArray refmatpoly_x, refmatpoly_y;
82 ci1 = 1, ci2 = 2;
85
86 int nvert = refmatpoly_x.giveSize();
87 if ( nvert ) {
88 Vertex v;
89 for ( int i = 1; i <= nvert; i++ ) {
90 // create polygonal representation
91 v.setCoords( refmatpoly_x.at(i), refmatpoly_y.at(i) );
92 initialRefMatVol.addVertex(v);
93 }
94
95 // close polygon (add first vertex at the end
96 v.setCoords( refmatpoly_x.at(1), refmatpoly_y.at(1) );
97 initialRefMatVol.addVertex(v);
98 }
99
100 initialRefMatFlag = true;
101 }
102
103 reinit_alg = 1;
105
106 reinit_dt = 0.0;
108 if ( reinit_dt > 0. ) {
109 reinit_dt_flag = true;
110 }
111
112 reinit_err = 1.e-6;
114
115 nsd = 2;
117}
118
119
120void
121LevelSetPCS :: giveInputRecord(DynamicInputRecord &input)
122{
123 OOFEM_ERROR("giveInputRecord not implemented yet");
124 //input.setField(this->..., _IFT_..._...);
125}
126
127
128void
129LevelSetPCS :: updatePosition(TimeStep *tStep)
130{
131 int i, j, l, inodes, inode;
132 int ndofman = domain->giveNumberOfDofManagers();
133 bool twostage = true;
134
135 double help, dt, volume, gfi_norm;
136
137 FloatArray fs(ndofman), w(ndofman);
138 FloatMatrix dN;
139 FloatArray fi(4), gfi(nsd), n(nsd), k(4), dfii(4), alpha(4), un;
141 Element *ielem;
142 ConnectivityTable *contable = domain->giveConnectivityTable();
143
144 // needed for multistep update
145 FloatArray ls_n;
146 int __step = 0, __nstep = 10;
147
149 dt = tStep->giveTimeIncrement() / __nstep;
150
151 do {
152 ls_n = levelSetValues;
153
154 this->pcs_stage1(levelSetValues, fs, w, tStep, PCS_levelSetUpdate);
155
156 // update level set values
157 for ( inode = 1; inode <= ndofman; inode++ ) {
158 if ( fabs( w.at(inode) ) > 0.0 ) {
159 // single stage integration
160 levelSetValues.at(inode) = ls_n.at(inode) - dt *fs.at(inode) / w.at(inode);
161 } else {
162 // -------------------------
163 // inflow into boundary node
164 // -------------------------
165 const IntArray *elems;
166 IntArray mask(nsd);
167 double v;
168 // get velocity in inode
169 if ( nsd == 2 ) {
170 mask = {V_u, V_v};
171 } else if ( nsd == 3 ) {
172 mask = {V_u, V_v, V_w};
173 }
174
175 domain->giveDofManager(inode)->giveUnknownVector( un, mask, VM_Total, tStep->givePreviousStep() );
176 elems = contable->giveDofManConnectivityArray(inode);
177 // loop over shared elements
178 volume = 0.0;
179 help = 0.0;
180 for ( l = 1; l <= elems->giveSize(); l++ ) {
181 // get element level set gradient
182 ielem = domain->giveElement( elems->at(l) );
183 inodes = ielem->giveNumberOfNodes();
184 interface = static_cast< LevelSetPCSElementInterface * >( ielem->giveInterface(LevelSetPCSElementInterfaceType) );
185
186 if ( interface ) {
187 interface->LS_PCS_computedN(dN);
188 // assemble element vector with level set values
189 for ( i = 1; i <= inodes; i++ ) {
190 fi.at(i) = ls_n.at( ielem->giveDofManagerNumber(i) );
191 }
192
193 // compute gradient of level set
194 for ( j = 1; j <= nsd; j++ ) {
195 gfi.at(j) = 0.0;
196 for ( i = 1; i <= inodes; i++ ) {
197 gfi.at(j) += dN.at(i, j) * fi.at(i);
198 }
199 }
200
201 volume += ( v = interface->LS_PCS_computeVolume() );
202 gfi_norm = gfi.computeNorm();
203 if ( gfi_norm > 1.e-6 ) {
204 help += un.dotProduct(gfi) * v / gfi_norm;
205 }
206 }
207 } // end loop over shared nodes
208
209 levelSetValues.at(inode) = ls_n.at(inode) - dt * help / volume;
210 }
211 } // end loop over nodes
212
213 if ( twostage ) {
214 //this->pcs_stage1(levelSetValues, fs, w, tStep, PCS_levelSetUpdate); // ?
215
216 for ( inode = 1; inode <= ndofman; inode++ ) {
217 if ( w.at(inode) > 0.0 ) {
218 //two stage integration
219 // update
220 levelSetValues.at(inode) = 0.5 * ( ls_n.at(inode) + levelSetValues.at(inode) ) -
221 0.5 *dt *fs.at(inode) / w.at(inode);
222 }
223 }
224 }
225
226 printf(".");
227 } while ( ++__step < __nstep );
228
229 printf("\n");
230 // print level set values to stdout (debug only)
231 /*
232 * printf ("Node: Level Set Value\n");
233 * for (inode=1; inode<=ndofman; inode++) {
234 * printf ("%5d %le\n",inode, levelSetValues.at(inode));
235 * }
236 */
237 // redistance
238 this->reinitialization(tStep);
239
241}
242
243
244double
245LevelSetPCS :: computeCriticalTimeStep(TimeStep *tStep)
246{
247 return 1.e6;
248}
249
250
251void
252LevelSetPCS :: giveMaterialMixtureAt(FloatArray &answer, FloatArray &position)
253{
254 double ls;
256 answer.resize(2);
257
258 Element *elem = domain->giveSpatialLocalizer()->giveElementContainingPoint(position);
260 if ( interface ) {
261 if ( elem->computeLocalCoordinates(N, position) ) {
262 int inodes = elem->giveNumberOfNodes();
263 ls = 0.0;
264 for ( int i = 1; i <= inodes; i++ ) {
265 ls += N.at(i) * levelSetValues.at( elem->giveDofManagerNumber(i) );
266 }
267
268 if ( ls > 0.0 ) {
269 answer.at(1) = 1.0;
270 answer.at(2) = 0.0;
271 } else {
272 answer.at(1) = 0.0;
273 answer.at(2) = 1.0;
274 }
275 } else {
276 OOFEM_ERROR("computeLocalCoordinates failed");
277 }
278 } else {
279 answer.at(1) = 1.0;
280 answer.at(2) = 0.0;
281 }
282}
283
284void
285LevelSetPCS :: giveElementMaterialMixture(FloatArray &answer, int ie)
286{
287#ifdef LevelSetPCS_CACHE_ELEMENT_VOF
289 answer = elemVof [ ie - 1 ];
290 return;
291 } else {
293 FloatArray fi;
294
295 elemVof.resize( domain->giveNumberOfElements() );
296 for ( int _ie = 1; _ie <= domain->giveNumberOfElements(); _ie++ ) {
297 Element *ielem = domain->giveElement(_ie);
298 int inodes = ielem->giveNumberOfNodes();
299 fi.resize(inodes);
300 interface = static_cast< LevelSetPCSElementInterface * >( ielem->giveInterface(LevelSetPCSElementInterfaceType) );
301 for ( int i = 1; i <= inodes; i++ ) {
302 fi.at(i) = levelSetValues.at( ielem->giveDofManagerNumber(i) );
303 }
304
305 interface->LS_PCS_computeVOFFractions(elemVof [ _ie - 1 ], fi);
306 }
307
309 answer = elemVof [ ie - 1 ];
310 return;
311 }
312
313#else
314
315 Element *ielem = domain->giveElement(ie);
316 int inodes = ielem->giveNumberOfNodes();
318 FloatArray fi(inodes);
319
320 for ( int i = 1; i <= inodes; i++ ) {
321 fi.at(i) = levelSetValues.at( ielem->giveDofManagerNumber(i) );
322 }
323
324 interface->LS_PCS_computeVOFFractions(answer, fi);
325#endif
326}
327
328void
329LevelSetPCS :: reinitialization(TimeStep *tStep)
330{
331 if ( reinit_alg == 0 ) {
332 return;
333 } else if ( reinit_alg == 1 ) {
334 this->redistance(tStep);
335 } else if ( reinit_alg == 2 ) {
336 FloatArray ls1;
337 this->FMMReinitialization(ls1);
338 levelSetValues = ls1;
339 } else {
340 OOFEM_ERROR("unknown reinitialization scheme (%d)", reinit_alg);
341 }
342}
343
344
345void
346LevelSetPCS :: redistance(TimeStep *tStep)
347{
348 int nite = 0;
349 int ndofman = domain->giveNumberOfDofManagers();
350 int nelem = domain->giveNumberOfElements();
351 bool twostage = false;
352 double dt, c, cm;
353
354 FloatArray fs(ndofman), w(ndofman), d_old, d;
355 FloatMatrix dN;
356 //ConnectivityTable* contable = domain->giveConnectivityTable();
357 //LevelSetPCSElementInterface* interface;
358
359 //return;
360 if ( this->reinit_dt_flag ) {
361 dt = this->reinit_dt;
362 } else {
363 dt = tStep->giveTimeIncrement();
364 }
365
366 IntArray _boundary(ndofman);
367 int pos, neg, _node;
368 // check for boundary node
369 for ( int ie = 1; ie <= nelem; ie++ ) {
370 Element *ielem = domain->giveElement(ie);
371 int inodes = ielem->giveNumberOfNodes();
372 pos = 0;
373 neg = 0;
374 for ( int i = 1; i <= inodes; i++ ) {
375 _node = ielem->giveDofManagerNumber(i);
376 if ( levelSetValues.at(_node) >= 0 ) {
377 pos++;
378 } else {
379 neg++;
380 }
381 }
382
383 if ( pos && neg ) {
384 for ( int i = 1; i <= inodes; i++ ) {
385 _node = ielem->giveDofManagerNumber(i);
386 _boundary.at(_node) = 1;
387 }
388 }
389 }
390
391
392 d = levelSetValues;
393 do {
394 d_old = d;
395 //levelSetValues = d; // updated sign funtion
397
398 // update level set values
399 // single stage integration
400 cm = 0.0;
401 for ( int inode = 1; inode <= ndofman; inode++ ) {
402 if ( _boundary.at(inode) ) {
403 continue;
404 }
405
406 if ( fabs( w.at(inode) ) > 0.0 ) {
407 c = dt * fs.at(inode) / w.at(inode);
408 cm = max( cm, fabs( c / levelSetValues.at(inode) ) );
409 levelSetValues.at(inode) = levelSetValues.at(inode) - c;
410 } else {
411 //printf ("(%d) ", inode);
412 }
413 }
414
415 if ( twostage ) {
416 // this->pcs_stage1(d, fs, w, tStep, PCS_levelSetRedistance); //?
417 cm = 0.0;
418 for ( int inode = 1; inode <= ndofman; inode++ ) {
419 if ( _boundary.at(inode) ) {
420 continue;
421 }
422
423 if ( fabs( w.at(inode) ) > 0.0 ) {
424 //two stage integration
425 // update
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) ) );
429 }
430 }
431 }
432 } while ( ( cm > this->reinit_err ) && ( ++nite < 2000 ) );
433
434 //} while ((++nite < 200));
435 OOFEM_LOG_INFO("LevelSetPCS :: redistance - error %le in %d iterations", cm, nite);
436
437 //levelSetValues = d;
438}
439
440
441void
442LevelSetPCS :: pcs_stage1(FloatArray &ls, FloatArray &fs, FloatArray &w, TimeStep *tStep, PCSEqType t)
443{
444 int ndofman = domain->giveNumberOfDofManagers(), nelem = domain->giveNumberOfElements();
445 double alpha, dfi, help, sumkn, F, f, volume, gfi_norm;
446 FloatMatrix dN;
447 FloatArray gfi, fi(4), n(nsd), k(4), dfii(4);
449
450 fs.resize(ndofman);
451 w.resize(ndofman);
452 fs.zero();
453 w.zero();
454
455 // loop over elements
456 for ( int ie = 1; ie <= nelem; ie++ ) {
457 Element *ielem = domain->giveElement(ie);
458 int inodes = ielem->giveNumberOfNodes();
459 interface = static_cast< LevelSetPCSElementInterface * >
461
462 if ( interface ) {
463 F = this->evalElemFContribution(t, ie, tStep);
464 f = this->evalElemfContribution(t, ie, tStep);
465
466 interface->LS_PCS_computedN(dN);
467 volume = interface->LS_PCS_computeVolume();
468
469 // assemble element vector with level set values
470 for ( int i = 1; i <= inodes; i++ ) {
471 fi.at(i) = ls.at( ielem->giveDofManagerNumber(i) );
472 }
473
474 // compute gradient of level set
475 gfi.beTProductOf(dN, fi);
476
477 // eval size of gfi
478 gfi_norm = gfi.computeNorm();
479 // compute ki
480 for ( int i = 1; i <= inodes; i++ ) {
481 if ( gfi_norm > 1.e-12 ) {
482 // evaluate i-th normal (corresponding to side opposite to i-th vertex)
483 for ( int j = 1; j <= nsd; j++ ) {
484 n.at(j) = nsd * dN.at(i, j) * volume; //?
485 }
486
487 k.at(i) = F * gfi.dotProduct(n) / ( nsd * gfi_norm );
488 } else {
489 OOFEM_LOG_INFO("LevelSetPCS :: pcs_stage1 - zero gfi_norm for %d node", i);
490 k.at(i) = 0.0;
491 }
492 }
493
494 dfi = fi.dotProduct(k);
495 for ( int i = 1; i <= inodes; i++ ) {
496 help = 0.0;
497 sumkn = 0.0;
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) );
501 }
502
503 if ( fabs(sumkn) > 1.e-12 ) {
504 dfii.at(i) = macbra( k.at(i) ) * help / sumkn;
505 } else {
506 OOFEM_LOG_INFO("LevelSetPCS :: pcs_stage1 - zero sumkn for %d node", i);
507 dfii.at(i) = 0.0;
508 }
509 }
510
511 //compute alpha_i
512 help = 0.0;
513 for ( int l = 1; l <= inodes; l++ ) {
514 help += max(0.0, dfii.at(l) / dfi);
515 }
516
517 for ( int i = 1; i <= inodes; i++ ) {
518 int _ig = ielem->giveDofManagerNumber(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;
523 }
524 }
525 } else {
526 OOFEM_ERROR("element %d does not implement LevelSetPCSElementInterfaceType", ie);
527 }
528 } // end loop over elements
529}
530
531
532double
533LevelSetPCS :: evalElemFContribution(PCSEqType t, int ie, TimeStep *tStep)
534{
535 LevelSetPCSElementInterface *interface = static_cast< LevelSetPCSElementInterface * >
537 if ( t == PCS_levelSetUpdate ) {
538 return interface->LS_PCS_computeF(this, tStep);
539 } else if ( t == PCS_levelSetRedistance ) {
540 return interface->LS_PCS_computeS(this, tStep);
541 }
542
543 return 0.0;
544}
545
546
547double
548LevelSetPCS :: evalElemfContribution(PCSEqType t, int ie, TimeStep *tStep)
549{
550 LevelSetPCSElementInterface *interface = static_cast< LevelSetPCSElementInterface * >
552 if ( t == PCS_levelSetUpdate ) {
553 return 0.0;
554 } else if ( t == PCS_levelSetRedistance ) {
555 return interface->LS_PCS_computeS(this, tStep);
556 }
557
558 return 0.0;
559}
560
561
562void
563LevelSetPCS :: FMMReinitialization(FloatArray &dmanValues)
564{
565 // tag points with boundary value as known
566 // then tag as trial all points that are one grid point away
567 // finally tag as far all other grid points
568 int jnode, enodes, __pos, __neg, nelem = domain->giveNumberOfElements();
569 double _lsval;
570 std :: list< int >bcDofMans;
571
572 dmanValues.resize( domain->giveNumberOfDofManagers() );
573 // here we loop over elements and identify those, that have zero level set
574 // then nodes belonging to these elements are boundary ones (with known distance)
575 for ( int i = 1; i <= nelem; i++ ) {
576 Element *ie = domain->giveElement(i);
577 enodes = ie->giveNumberOfDofManagers();
578 __pos = 0;
579 __neg = 0; // count positive and negative level set values in element nodes
580 for ( int j = 1; j <= enodes; j++ ) {
581 _lsval = this->giveLevelSetDofManValue( ie->giveDofManagerNumber(j) );
582 if ( _lsval > 0.0 ) {
583 __pos++;
584 }
585
586 if ( _lsval < 0.0 ) {
587 __neg++;
588 }
589 }
590
591 if ( ( __pos && __neg ) || ( __pos + __neg < enodes ) ) {
592 // zero level set within element
593 // we have to tag element nodes as known and compute their boundary value
594 for ( int j = 1; j <= enodes; j++ ) {
595 // simplified (here we use original level set values)
596 jnode = ie->giveDofManagerNumber(j);
597 if ( ( dmanValues.at(jnode) = this->giveLevelSetDofManValue(jnode) ) >= 0. ) {
598 bcDofMans.push_front(jnode);
599 } else {
600 bcDofMans.push_front(-jnode);
601 }
602 }
603 }
604 }
605
607 // fast marching for positive level set values
608 fmm.solve(dmanValues, bcDofMans, 1.0);
609 // revert bcDofMans signs
610 for ( int &node: bcDofMans ) {
611 node = -node;
612 }
613
614 // fast marching for negative level set values
615 fmm.solve(dmanValues, bcDofMans, -1.0);
616}
617
618
619void
620LevelSetPCS :: saveContext(DataStream &stream, ContextMode mode)
621{
623
624 if ( !stream.write(levelSetVersion) ) {
626 }
627
628 if ( ( iores = levelSetValues.storeYourself(stream) ) != CIO_OK ) {
629 THROW_CIOERR(iores);
630 }
631}
632
633
634void
635LevelSetPCS :: restoreContext(DataStream &stream, ContextMode mode)
636{
638
639 if ( !stream.read(levelSetVersion) ) {
641 }
642
643 if ( ( iores = levelSetValues.restoreYourself(stream) ) != CIO_OK ) {
644 THROW_CIOERR(iores);
645 }
646
648#ifdef LevelSetPCS_CACHE_ELEMENT_VOF
650#endif
651}
652} // end namespace oofem
#define N(a, b)
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
Definition element.h:703
virtual int giveNumberOfDofManagers() const
Definition element.h:695
int giveDofManagerNumber(int i) const
Definition element.h:609
virtual bool computeLocalCoordinates(FloatArray &answer, const FloatArray &gcoords)
Definition element.C:1240
virtual Interface * giveInterface(InterfaceType t)
Definition femcmpnn.h:181
Domain * domain
Link to domain object, useful for communicating with other FEM components.
Definition femcmpnn.h:79
void solve(FloatArray &dmanValues, const std ::list< int > &bcDofMans, double F)
double computeNorm() const
Definition floatarray.C:861
void resize(Index s)
Definition floatarray.C:94
double & at(Index i)
Definition floatarray.h:202
double dotProduct(const FloatArray &x) const
Definition floatarray.C:524
Index giveSize() const
Returns the size of receiver.
Definition floatarray.h:261
void zero()
Zeroes all coefficients of receiver.
Definition floatarray.C:683
void beTProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
Definition floatarray.C:721
double at(std::size_t i, std::size_t j) const
int & at(std::size_t i)
Definition intarray.h:104
int giveSize() const
Definition intarray.h:211
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.
Definition timestep.h:168
TimeStep * givePreviousStep()
Returns pointer to previous solution step.
Definition timestep.C:132
void setCoords(double x, double y)
Definition geotoolbox.h:77
#define THROW_CIOERR(e)
#define OOFEM_ERROR(...)
Definition error.h:79
#define IR_GIVE_OPTIONAL_FIELD(__ir, __value, __id)
Definition inputrecord.h:75
#define _IFT_LevelSetPCS_ci1
Definition levelsetpcs.h:53
#define _IFT_LevelSetPCS_refmatpoly_y
Definition levelsetpcs.h:48
#define _IFT_LevelSetPCS_ci2
Definition levelsetpcs.h:54
#define _IFT_LevelSetPCS_levelSetValues
Definition levelsetpcs.h:46
#define _IFT_LevelSetPCS_refmatpoly_x
Definition levelsetpcs.h:47
#define _IFT_LevelSetPCS_reinit_alg
Definition levelsetpcs.h:51
#define _IFT_LevelSetPCS_reinit_dt
Definition levelsetpcs.h:49
#define _IFT_LevelSetPCS_reinit_err
Definition levelsetpcs.h:50
#define _IFT_LevelSetPCS_nsd
Definition levelsetpcs.h:52
#define OOFEM_LOG_INFO(...)
Definition logger.h:143
long ContextMode
Definition contextmode.h:43
double macbra(double x)
Returns the positive part of given float.
Definition mathfem.h:128
FloatArrayF< N > max(const FloatArrayF< N > &a, const FloatArrayF< N > &b)
double negbra(double x)
Returns the negative part of given float.
Definition mathfem.h:130
@ LevelSetPCSElementInterfaceType
@ CIO_IOERR
General IO error.

This page is part of the OOFEM-3.0 documentation. Copyright Copyright (C) 1994-2025 Borek Patzak Bořek Patzák
Project e-mail: oofem@fsv.cvut.cz
Generated at for OOFEM by doxygen 1.15.0 written by Dimitri van Heesch, © 1997-2011