50MesherInterface :: returnCode
51FreemInterface :: createMesh(
TimeStep *tStep,
int domainNumber,
int domainSerNum,
Domain **dNew)
70 outputStrem = fopen(
"freem.bmf",
"w");
72 fprintf(outputStrem,
"nbnodes %d nbelem %d \n", nnodes, nelem);
77 for (
int i = 1; i <= nnodes; i++ ) {
85 for (
int i = 1; i <= nnodes; i++ ) {
88 density = nodalDensities.
at(i);
93 for (
int i = 1; i <= nelem; i++ ) {
96 OOFEM_ERROR(
"unsupported element type (not a bilinear quad)");
99 fprintf( outputStrem,
"backgroundMeshElem %d nodes 4 %d %d %d %d\n", i,
113 std :: list< int > queue;
117 for (
int i = 1; i <= nnodes; i++ ) {
125 while ( !queue.empty() ) {
127 int candidate = * ( queue.begin() );
128 queue.erase( queue.begin() );
133 for (
int j = 1; j <= candidateConnectivity->
giveSize(); j++ ) {
136 for (
int k = 1; k <= jelemNodes; k++ ) {
138 if ( neighbour == candidate ) {
146 if ( ( ( nodalDensities.
at(neighbour) / nodalDensities.
at(candidate) ) > 1.3 ) &&
147 ( nodalDensities.
at(neighbour) > 1.0 * dist ) ) {
149 nodalDensities.
at(neighbour) =
max( 1.0 * dist, nodalDensities.
at(candidate) );
153 for (
int q: queue ) {
154 if ( q == neighbour ) {
161 queue.push_front(neighbour);
165 }
else if ( ( nodalDensities.
at(neighbour) - nodalDensities.
at(candidate) ) / dist > 2.5 ) {
167 nodalDensities.
at(neighbour) = nodalDensities.
at(candidate) + 2.2 * dist;
171 for (
int q: queue ) {
172 if ( q == neighbour ) {
179 queue.push_front(neighbour);
#define REGISTER_Mesher(class, type)
const IntArray * giveDofManConnectivityArray(int dofman)
double giveCoordinate(int i) const
const FloatArray & giveCoordinates() const
ErrorEstimator * giveErrorEstimator()
ConnectivityTable * giveConnectivityTable()
int giveNumberOfElements() const
Returns number of elements in domain.
int giveNumberOfDofManagers() const
Returns number of dof managers in domain.
DofManager * giveDofManager(int n)
Element * giveElement(int n)
Node * giveNode(int i) const
virtual int giveNumberOfNodes() const
virtual Element_Geometry_Type giveGeometryType() const =0
virtual RemeshingCriteria * giveRemeshingCrit()=0
int createInput(Domain *d, TimeStep *tStep)
Creates the mesher input, containing the required mesh density information.
void smoothNodalDensities(Domain *d, FloatArray &nodalDensities, TimeStep *tStep)
Service for smoothing the densities for freem.
@ MI_NEEDS_EXTERNAL_ACTION
virtual double giveRequiredDofManDensity(int num, TimeStep *tStep, int relative=0)=0
#define OOFEM_LOG_INFO(...)
FloatArrayF< N > max(const FloatArrayF< N > &a, const FloatArrayF< N > &b)
double distance(const FloatArray &x, const FloatArray &y)