The Higher Education and Research forge

Home My Page Projects Code Snippets Project Openings MMD
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

authorAlain <alain.bastide@univ-reunion.fr>
Sat, 11 Jul 2020 13:45:50 +0000 (17:45 +0400)
committerAlain <alain.bastide@univ-reunion.fr>
Sat, 11 Jul 2020 13:54:11 +0000 (17:54 +0400)
src/main.c
src/memory.c
src/mmd.c
src/mmd.h
src/primal.c
src/primal.h
test/test_mpi.c

index d8ce61f..18dd327 100644 (file)
@@ -62,8 +62,8 @@ int main (void)
 #ifdef DEBUG
   
   myPrimalMesh.M = 2; // cell number on X
-  myPrimalMesh.N = 1; // cell number on Y
-  myPrimalMesh.P = 1; // cell number on Z
+  myPrimalMesh.N = 2; // cell number on Y
+  myPrimalMesh.P = 2; // cell number on Z
   
 #else
   
@@ -127,7 +127,9 @@ int main (void)
   myDualMesh.internalDualFaceArea            = NULL;
   myDualMesh.internalDualFaceCentres         = NULL;
   
-  
+  // BOUNDARY
+  myPrimalMesh.faceBoundary                    = NULL;
+  myPrimalMesh.faceBoundaryNumber              = 0;
   
   
   // Rectangular mesh with an ...
@@ -136,6 +138,7 @@ int main (void)
   myPrimalMesh.faceNumber = 0;//HEXAHEDRON_FACES*myPrimalMesh.cellNumber;//(myPrimalMesh.M+1) * (myPrimalMesh.N+1) * (myPrimalMesh.P+1);
   myPrimalMesh.segmentNumber = 0;//QUAD*myPrimalMesh.faceNumber;//HEXAHEDRON_SEGMENTS * myPrimalMesh.cellNumber;; //2*(myPrimalMesh.M+1) * (myPrimalMesh.N+1) * (myPrimalMesh.P+1);
   
+  setHandler(fault_handler);   
   
   myDualMesh.internalDualFacesNumber = 0;
   
@@ -182,6 +185,10 @@ int main (void)
   
   setDualFacesCentres(&myPrimalMesh, &myDualMesh);
   
+  
+  setHexahedreBoundaryFaces(&myPrimalMesh);
+  
+  
   warning("VOIR TO DO FILE");
   
   fflush(stderr);
index 6ab7ba8..672e9b6 100644 (file)
@@ -528,7 +528,11 @@ void freeMemory(struct primalMesh * myPrimalMesh, struct dualMesh * myDualMesh)
         free(myDualMesh->internalDualFaceCentres[facei]);
       free(myDualMesh->internalDualFaceCentres);  
     }
-  
+
+    if(myPrimalMesh->faceBoundary!=NULL)
+      {
+        free(myPrimalMesh->faceBoundary);  
+      }
 
    
   endFunction(__FUNCTION__, t);
index 22b5d8e..f54fea9 100644 (file)
--- a/src/mmd.c
+++ b/src/mmd.c
@@ -75,3 +75,46 @@ void todo(void)
       warning_debug("File not found : TOTO.md");
     }
 }
+
+void setHandler(void (*handler)(int,siginfo_t *,void *))
+{
+       struct sigaction action;
+       action.sa_flags = SA_SIGINFO;
+       action.sa_sigaction = handler;
+       if (sigaction(SIGFPE, &action, NULL) == -1) {
+               perror("sigfpe: sigaction");
+               exit(1);
+       }
+       if (sigaction(SIGSEGV, &action, NULL) == -1) {
+               perror("sigsegv: sigaction");
+               exit(1);
+       }
+       if (sigaction(SIGILL, &action, NULL) == -1) {
+               perror("sigill: sigaction");
+               exit(1);
+       }
+       if (sigaction(SIGBUS, &action, NULL) == -1) {
+               perror("sigbus: sigaction");
+               exit(1);
+       }
+}
+
+void fault_handler(int signo, siginfo_t *info, void *extra) 
+{
+       printf("Signal %d received\n", signo);
+       abort();
+}
+
+
+//void fault_handler(int signo, siginfo_t *info, void *extra) 
+//{
+//     int i;
+//     printf("Signal %d received \n", signo);
+//        for(i=0; i < hw_size ; i++)
+//           printf("HW regs[%d] = %x\n", i, hwmap[i]);
+//     abort();
+//}
index 5cef64e..eca12e4 100644 (file)
--- a/src/mmd.h
+++ b/src/mmd.h
@@ -33,6 +33,7 @@ Author
 #ifndef MMD_H
 #define MMD_H
 
+#include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdbool.h>
@@ -133,6 +134,7 @@ struct primalMesh {
     connectivity_int segmentNumber;  // segment number
     connectivity_int faceNumber; //surface number
     connectivity_int cellNumber;  // cell number
+    connectivity_int faceBoundaryNumber;
 
     // Cells
     connectivity_int            **         cellToCells; // done
@@ -192,6 +194,7 @@ struct primalMesh {
     connectivity_int **     faceToCells;
     dataType       **       faceCentres;
     dataType       **       faceAreas;
+    connectivity_int  *     faceBoundary;
 
 
     dataType       **   volumeCentroid;
@@ -291,5 +294,8 @@ void endFunction(const char * functionName, clock_t t);
 
 void todo(void) ;
 
+void setHandler(void (*handler)(int,siginfo_t *,void *));
+
+void fault_handler(int signo, siginfo_t *info, void *extra) ;
 
 #endif // MMD_H
index 06e0e2c..9b92a62 100644 (file)
@@ -10,24 +10,24 @@ License
     under the terms of the GNU General Public License as published by the
     Free Software Foundation, either version 3 of the License, or (at your
     option) any later version.
-
+    
     MMD is distributed in the hope that it will be useful, but
     WITHOUT ANY WARRANTY; without even the implied warranty of
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     General Public License for more details.
-
+    
     You should have received a copy of the GNU General Public License
     along with foam-extend.  If not, see <http://www.gnu.org/licenses/>.
-
+    
 Application
     explain
-
+    
 Description
     explain
-
+    
 Author
     Alain Bastide, Université de La Réunion, FRANCE.  All rights reserved
-
+    
 \*---------------------------------------------------------------------------*/
 
 #include "mmd.h"
@@ -1734,7 +1734,7 @@ void setHexahedreAllocVertexToSegment(struct primalMesh * myPrimalMesh)
   for(connectivity_int i=0;i<myPrimalMesh->vertexNumber;i++)
     {
       
-      debug_print("%-40s : %ld (%ld)\n",
+      debug_print("%-40s : %ld (%d)\n",
                   "myPrimalMesh->vertexToSegmentNumber",
                   i,
                   myPrimalMesh->vertexToSegmentNumber[i]
@@ -2079,3 +2079,47 @@ void setHexahedreVolumeCentroid(struct primalMesh * myPrimalMesh)
   endFunction(__FUNCTION__, t);
   
 }
+
+
+void setHexahedreBoundaryFaces(struct primalMesh * myPrimalMesh)
+{
+  clock_t t=startFunction(__FUNCTION__);
+  
+  
+  for(connectivity_int facei=0;facei<myPrimalMesh->faceNumber;facei++)
+    {
+      if(myPrimalMesh->faceToCellsNumber[facei] == 1)
+        {
+          
+          myPrimalMesh->faceBoundary = (connectivity_int *) realloc( myPrimalMesh->faceBoundary, (myPrimalMesh->faceBoundaryNumber+1) * sizeof(connectivity_int));
+          
+          myPrimalMesh->faceBoundary[myPrimalMesh->faceBoundaryNumber] = facei;
+
+          myPrimalMesh->faceBoundaryNumber++;
+        }
+
+    }  
+
+  for(connectivity_int facei=0;facei<myPrimalMesh->faceBoundaryNumber;facei++)
+    {
+//      myPrimalMesh->faces[myPrimalMesh->faceBoundary[facei]];
+    }
+  
+//https://codeforwin.org/2015/07/c-program-to-print-all-unique-element-in-array.html  
+
+
+#ifdef DEBUG      
+  for(connectivity_int facei=0;facei<myPrimalMesh->faceBoundaryNumber;facei++)
+    {
+      debug_print("%-40s : %ld (%ld)\n",
+                  "myPrimalMesh->faceBoundary",
+                  facei,
+                  myPrimalMesh->faceBoundary[facei]
+                  
+                  );
+    }
+#endif   
+  
+  endFunction(__FUNCTION__, t);
+  
+}
index a8965fc..2afc429 100644 (file)
@@ -130,4 +130,7 @@ void setHexahedreFaceCentersAreas(struct primalMesh * myPrimalMesh);
 void setHexahedreEstimateVolumeCentroid(struct primalMesh * myPrimalMesh);
 
 void setHexahedreVolumeCentroid(struct primalMesh * myPrimalMesh);
+
+void setHexahedreBoundaryFaces(struct primalMesh * myPrimalMesh);
+
 #endif // PRIMAL_H
index a0a003d..cb4ab1f 100644 (file)
@@ -5,8 +5,8 @@
 # include <string.h>
 # include <time.h>
 
-double L = 1.0;                        /* linear size of square region */
-int N = 32;                    /* number of interior points per dim */
+static double L = 1.0;                 /* linear size of square region */
+static int N = 361 ;                   /* number of interior points per dim */
 
 double *u, *u_new;             /* linear arrays to hold solution */
 
@@ -64,7 +64,7 @@ int main ( int argc, char *argv[] )
   }
   else
   {
-    N = 32;
+    N = 361;
   }
 
   if ( 2 < argc )
@@ -148,7 +148,7 @@ int main ( int argc, char *argv[] )
     {
       change = change / n;
     }
-    if ( my_rank == 0 && ( step % 10 ) == 0 ) 
+    if ( my_rank == 0 && ( step % 1000 ) == 0 ) 
     {
       printf ( "  N = %d, n = %d, my_n = %d, Step %4d  Error = %g\n", 
         N, n, my_n, step, change );