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>
Thu, 9 Jul 2020 01:44:55 +0000 (05:44 +0400)
committerAlain <alain.bastide@univ-reunion.fr>
Thu, 9 Jul 2020 01:44:55 +0000 (05:44 +0400)
CMakeLists.txt
TODO.md
src/CMakeLists.txt
src/dual.c
src/main.c
src/memory.c
src/memory.h
src/mmd.c
src/mmd.h
src/shared.c [new file with mode: 0644]
test/CMakeLists.txt

index 6d87454..40b019d 100644 (file)
@@ -50,14 +50,18 @@ message("CFLAGS  :" ${CMAKE_C_FLAGS})
 set ( TESTS ${CMAKE_SOURCE_DIR}/test )
 set ( SOURCES ${CMAKE_SOURCE_DIR}/src )
 
+set(DATA_FILE ${PROJECT_SOURCE_DIR}/README.md  ${PROJECT_SOURCE_DIR}/TODO.md )
 
 add_subdirectory(${SOURCES})
 add_subdirectory(${TESTS})
   
 enable_testing ()
-#add_definitions("-DDEBUG")
-#set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -ggdb -DDEBUG")
-add_test (NAME MyTest COMMAND test01.out)
+add_test (NAME MyTest COMMAND test01.out ${DATA_FILE})
+
+
+
+
+
 
 ### DOCUMENTATION
 
diff --git a/TODO.md b/TODO.md
index 2436847..d9fd0c3 100644 (file)
--- a/TODO.md
+++ b/TODO.md
@@ -6,9 +6,7 @@ Reduce the execution time of the functions :
 1. Improve the "void setHexahedreCellToFacesOwnerNeighbour(struct primalMesh * myPrimalMesh)
 " function which represents more than 50% of the computation time of the dual and primary mesh elements
 2. Finalize Dual mesh :
-
 ​     * Do dual segments to generate global dual surface
-
      * To do 
      * dual segments to generate global dual surface
 
@@ -37,6 +35,8 @@ Reduce the execution time of the functions :
      * NETlib ? or rewrite?
      * https://sourceforge.net/projects/librsb/ ?
      * https://www.netlib.org/blas/blast-forum/chapter3.pdf
+     * https://matteding.github.io/2019/04/25/sparse-matrices/
+     * https://slepc.upv.es/
      
 
 
index 7920bff..9a062bf 100644 (file)
@@ -1,21 +1,37 @@
-add_library (primal primal.c primal.h mmd.h )
-add_library (listop listop.c listop.h mmd.h)
-add_library (dual dual.c dual.h mmd.h)
-add_library (savedata savedata.c savedata.h mmd.h)
-add_library (memory memory.c memory.h mmd.h)
-add_library (tensor tensor.c tensor.h mmd.h)
-add_library (mmd mmd.c mmd.h)
-add_executable(${PROJECT_NAME} main.c)
+add_library (primal STATIC primal.c primal.h mmd.h )
+add_library (listop STATIC listop.c listop.h mmd.h)
+add_library (dual STATIC dual.c dual.h mmd.h)
+add_library (savedata STATIC savedata.c savedata.h mmd.h)
+add_library (memory STATIC memory.c memory.h mmd.h)
+add_library (tensor STATIC tensor.c tensor.h mmd.h)
+add_library (mmd STATIC mmd.c mmd.h)
+add_executable(${PROJECT_NAME} main.c ${DATA_FILE})
 #SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "-DDEBUG")
 
 target_link_libraries (${PROJECT_NAME}
-                       primal
-                       listop
-                       dual
-                       savedata
-                       tensor
-                       memory
-                       mmd
-                       m
-                       ${VTK_LIBRARIES}
-                       )
+    primal
+    listop
+    dual
+    savedata
+    tensor
+    memory
+    mmd
+    m
+    ${VTK_LIBRARIES}
+    )
+
+#add_library(mmd_link SHARED shared.c)
+#target_compile_definitions(mmd_link PUBLIC mmd_link)
+
+#target_link_libraries (mmd_link PUBLIC 
+#    primal
+#    listop
+#    dual
+#    savedata
+#    tensor
+#    memory
+#    mmd
+#    m
+#    c
+#    dl
+#    ${VTK_LIBRARIES})
index a4fd722..6ccde1d 100644 (file)
@@ -37,6 +37,7 @@ Author
 #include "dual.h"
 #include "tensor.h"
 #include "listop.h"
+#include "memory.h"
 
 
 
@@ -404,6 +405,7 @@ void setDualFacesCentres(struct primalMesh * myPrimalMesh, struct dualMesh * myD
 
       subTwoVectors(&result1, myPrimalMesh->vertex[segmentVector[PT2]], myPrimalMesh->vertex[segmentVector[PT1]]);      
       
+      // change face orientation
       for(connectivity_int facei=0;facei<myDualMesh->segmentToInternalDualFaceNumber[segmenti];facei++)
         {
           face  = myDualMesh->segmentToInternalDualFace[segmenti][facei];
@@ -411,8 +413,15 @@ void setDualFacesCentres(struct primalMesh * myPrimalMesh, struct dualMesh * myD
           dotProduct(&result4, result1, myDualMesh->internalDualFaceArea[face]) ;     
           if(result4<0.0)
             {
+              // flip the points 1 and 3 tantamount to flip the face
+              swapPoints(
+                          &(myDualMesh->internalDualFaces[facei][PT1]),
+                          &(myDualMesh->internalDualFaces[facei][PT3]) 
+                        );
+              // change surface normal sens
               for(connectivity_int pointi=0;pointi<DIM3D;pointi++)
                 {
+
                   myDualMesh->internalDualFaceArea[face][pointi] *= -1.0;
                 }              
             }
index 85f3786..b10bb33 100644 (file)
@@ -182,32 +182,7 @@ int main (void)
   
   setDualFacesCentres(&myPrimalMesh, &myDualMesh);
   
-  /* To do 
-   * dual segments to generate global dual surface
-   * Faces = myPrimalMesh->segmentToFaceOwner union myPrimalMesh->segmentToFaceNeighbour
-   * myPrimalMesh->faceToCells
-   * Faces2 = myPrimalMesh->cellToFacesOwner union myPrimalMesh->cellToFacesNeighbour
-   * Faces3 = Faces intersect Face2
-   * 
-   * TODO : 
-   * Dual faces on primal faces and domain boundary 
-   * 
-   * Volumes of dual mesh
-   * 
-   * test Volume dual = volume primal
-   * 
-   * Do
-   * dualFaceToDualSegments
-   * 
-   * 
-  */
-  
-  //  FILE *fp;
-  //  fp = fopen("one.dat", "wb");
-  //  fwrite(&(myPrimalMesh), sizeof(myPrimalMesh), 1, fp);
-  //  fclose(fp);  
-  
-  // OLD
+  warning("VOIR TO DO FILE");
   
   fflush(stderr);
   fflush(stdout);
@@ -219,6 +194,7 @@ int main (void)
   affiche("%-40s : %ld\n","Dual Face number",myDualMesh.internalDualFacesNumber);
   
   freeMemory(&myPrimalMesh, &myDualMesh);
+  todo();
   
 }
 
index d039e26..6ab7ba8 100644 (file)
@@ -33,7 +33,11 @@ Author
 #include "mmd.h"
 #include "memory.h"
 
-
+void swapPoints(dataType** a, dataType** b) {
+    dataType * temp = *a;
+    *a = *b;
+    *b = temp;
+}
 
 
 void allocMemoryForMatrixDataType(dataType *** result, connectivity_int N, connectivity_int M )
index be06091..2b5efe0 100644 (file)
@@ -35,6 +35,8 @@ Author
 
 #include "mmd.h"
 
+void swapPoints(dataType** a, dataType** b);
+
 
 //#define allocMemoryForMatrix(x,y,z) _Generic((x), dataType: allocMemoryForMatrixDataType, char: allocMemoryForMatrixDataType)(x,y,z);
 void allocMemoryForMatrixDataType(dataType *** result, connectivity_int N, connectivity_int M );
index 4f40f4e..22b5d8e 100644 (file)
--- a/src/mmd.c
+++ b/src/mmd.c
@@ -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"
@@ -50,3 +50,28 @@ void endFunction(const char * functionName, clock_t t)
   
 }
 
+
+void todo(void) 
+{ 
+  FILE * fp; 
+  char * line = NULL; 
+  size_t len = 0; 
+  ssize_t read; 
+  
+  fp=fopen("../TODO.md","r"); 
+  if(fp) {
+      warning("TODO");
+      while ((read = getline(&line, &len, fp)) != -1) { 
+          affiche("%s", line); 
+        } 
+      
+      fclose(fp); 
+      if (line) 
+        free(line); 
+    }
+  else
+    {
+      warning("File not found : TOTO.md");
+      warning_debug("File not found : TOTO.md");
+    }
+}
index d9c4112..fc8a7bc 100644 (file)
--- a/src/mmd.h
+++ b/src/mmd.h
@@ -43,6 +43,7 @@ Author
 #include <malloc.h>
 
 #include <time.h>
+#include <ctype.h>
 
 #include <vtkCellType.h>
 
@@ -52,10 +53,23 @@ Author
 
 
 //typedef __float128 dataType; // attention aux opérations
+#ifdef QUADPRECISION
+typedef long double dataType;
+#else
+#ifdef DOUBLEPRECISION
+typedef double dataType;
+#else
+#ifdef SIMPLEPRECISION
+typedef float dataType;
+#else //default
 typedef double dataType;
-typedef unsigned char connectivity_short;
-typedef unsigned long connectivity_int;
-typedef unsigned long count_int;
+#endif
+#endif
+#endif
+
+typedef u_char connectivity_short;
+typedef u_int64_t connectivity_int;
+typedef u_int64_t count_int;
 
 static dataType SMALL   = 1.0E-16;
 static dataType VSMALL  = 1.0E-30;
@@ -224,33 +238,42 @@ struct readWriteVTK {
 #define P_BLINK "\033[25m"
 #define P_RED "\033[0;31m"
 #define P_YELLOW "\033[0;33m"
-#define P_RESET "\033[0m"
+#define P_RESET "\033[0;0m"
 
 #define P_BACK_RED "\033[1;37;41m"
 #define P_BACK_YELLOW "\033[0;43m"
-#define P_BACK_RESET "\033[0m"
+#define P_BACK_RESET "\033[0;0m"
 
 
 #define affiche(...) \
  do {  printf( __VA_ARGS__); } while (0)
 
 
+#define warning(...) \
+ printf(P_BACK_RESET);do {  printf(P_BACK_RED); printf(__VA_ARGS__);printf(P_BACK_RESET); } while (0); printf(P_BACK_RESET);printf("\n")
+
+
+#define warning_debug(...) \
+ if (DEBUG_TEST) { fprintf(stderr,P_BACK_RESET);do {  fprintf(stderr,P_BACK_RED); fprintf(stderr,__VA_ARGS__);fprintf(stderr,P_BACK_RESET); } while (0); fprintf(stderr,P_BACK_RESET);fprintf(stderr,"\n"); }
+
+
 #define debug_print(...) \
-    do { if (DEBUG_TEST) fprintf(stderr, __VA_ARGS__); } while (0)
+    do { if (DEBUG_TEST) fprintf(stderr, __VA_ARGS__); } while (0) 
 
+  
 #define release_print(...) \
     do {  printf( __VA_ARGS__); } while (0)
 
-
 #define ASSERT(expr) \
-  printf("%sASSERT%s -> FILE:%s LINE:%d EXPRESSION EVALUATED: \"%s\"\n",P_BACK_RED,P_BACK_RESET,__FILE__, __LINE__, #expr)
+  printf("%sASSERT%s -> FILE:%s LINE:%d EXPRESSION EVALUATED: \"%s\"\n",P_BACK_RED,P_BACK_RESET,__FILE__, __LINE__, #expr);
  
 
 #define ERROR_TEST(x) \
 { \
     do { \
     if (!x) { \
-    fprintf(stderr, "Internal error ERROR_TEST: FILE %s at LINE %d in FUNCTION %s : " x "\n", __FILE__, __LINE__, __FUNCTION__); \
+    fprintf(stderr, "%sInternal error ERROR_TEST: FILE %s at LINE %d in FUNCTION %s : " x "%s\n",P_BACK_RED, __FILE__, __LINE__, __FUNCTION__,P_BACK_RESET); \
     exit(1);\
     } \
     } while (0)
@@ -261,5 +284,7 @@ clock_t startFunction(const char * functionName);
 
 void endFunction(const char * functionName, clock_t t);
 
+void todo(void) ;
+
 
 #endif // MMD_H
diff --git a/src/shared.c b/src/shared.c
new file mode 100644 (file)
index 0000000..265ac89
--- /dev/null
@@ -0,0 +1,203 @@
+/*---------------------------------------------------------------------------*\
+    \o/\o/\o/
+    MMD
+    Version : 0.0.3
+    Web : https://github.com/alainbastide/MMD
+-------------------------------------------------------------------------------
+License
+
+    MMD is free software: you can redistribute it and/or modify it
+    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"
+#include "tensor.h"
+#include "primal.h"
+#include "listop.h"
+#include "memory.h"
+#include "dual.h"
+
+
+
+int mainDLL (void)
+{
+  
+  // Primal Mesh
+  struct simulationData mySimulationData;
+  
+  struct primalMesh myPrimalMesh;
+  struct dualMesh myDualMesh;
+  struct readWriteVTK myReadWriteVTK;
+  
+  myReadWriteVTK.mySimulationData = &mySimulationData;
+  
+  mySimulationData.simulationName = "Ma simulation";
+  
+  myPrimalMesh.L = 1; // cell number on X
+  myPrimalMesh.l = 1; // cell number on Y
+  myPrimalMesh.H = 1; // cell number on Z
+  
+#ifdef DEBUG
+  
+  myPrimalMesh.M = 2; // cell number on X
+  myPrimalMesh.N = 1; // cell number on Y
+  myPrimalMesh.P = 1; // cell number on Z
+  
+#else
+  
+#ifdef OPTIMCODE
+  affiche("OPTIM finded\n");
+  myPrimalMesh.M = 50; // cell number on X
+  myPrimalMesh.N = 50; // cell number on Y
+  myPrimalMesh.P = 50; // cell number on Z
+#else
+  myPrimalMesh.M = 200; // cell number on X
+  myPrimalMesh.N = 200; // cell number on Y
+  myPrimalMesh.P = 200; // cell number on Z
+  
+#endif
+  
+#endif
+  myPrimalMesh.vertex                 = NULL;
+  myPrimalMesh.cellToVertexNumber     = NULL;
+  myPrimalMesh.cellToVertex           = NULL;
+  myPrimalMesh.faceToVertex           = NULL;
+  myPrimalMesh.faceToVertexNumber     = NULL;
+  myPrimalMesh.faceCentres            = NULL;
+  myPrimalMesh.faceAreas              = NULL;
+  myPrimalMesh.cellToFaces            = NULL;
+  myPrimalMesh.volumeCentroid         = NULL;
+  myPrimalMesh.cellToFacesNumber      = NULL;
+  myPrimalMesh.volume                 = NULL;
+//  myPrimalMesh.segmentToVertex        = NULL;
+  myPrimalMesh.faceToSegments         = NULL;
+  myPrimalMesh.vertexToSegmentNumber  = NULL;
+  myPrimalMesh.vertexToSegments       = NULL;
+  myPrimalMesh.cellToCells            = NULL;
+  myPrimalMesh.cellToCellsNumbers     = NULL;
+  myPrimalMesh.cellToSegmentOwner     = NULL;
+  myPrimalMesh.cellToSegmentNeighbour = NULL;
+  myPrimalMesh.cellToSegmentOwnerNumber       = NULL;
+  myPrimalMesh.cellToSegmentNeighbourNumber   = NULL;  
+  
+  
+  // FACES
+  myPrimalMesh.faces                  = NULL;
+  myPrimalMesh.cellToFacesOwner       = NULL;
+  myPrimalMesh.cellToFacesNeighbour   = NULL;
+  
+  //  SEGMENTS
+  myPrimalMesh.segments                       = NULL;
+  myPrimalMesh.vertexToSegmentOwner           = NULL;
+  myPrimalMesh.vertexToSegmentOwnerNumber     = NULL;
+  myPrimalMesh.vertexToSegmentNeighbour       = NULL;
+  myPrimalMesh.vertexToSegmentNeighbourNumber = NULL;
+  
+  myPrimalMesh.segmentToFaceOwner            = NULL;
+  myPrimalMesh.segmentToFaceOwnerNumber      = NULL;
+  myPrimalMesh.segmentToFaceNeighbour        = NULL;
+  myPrimalMesh.segmentToFaceNeighbourNumber  = NULL;
+  myPrimalMesh.segmentCentres                = NULL;
+  
+  myDualMesh.internalDualFaces               = NULL;
+  myDualMesh.segmentToInternalDualFace       = NULL;
+  myDualMesh.segmentToInternalDualFaceNumber = NULL;
+  myDualMesh.internalDualFaceArea            = NULL;
+  myDualMesh.internalDualFaceCentres         = NULL;
+  
+  
+  
+  
+  // Rectangular mesh with an ...
+  myPrimalMesh.cellNumber   = myPrimalMesh.M * myPrimalMesh.N * myPrimalMesh.P;
+  myPrimalMesh.vertexNumber = (myPrimalMesh.M+1) * (myPrimalMesh.N+1) * (myPrimalMesh.P+1);
+  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);
+  
+  
+  myDualMesh.internalDualFacesNumber = 0;
+  
+  // création de **vertex
+  setHexahedreVertex(&myPrimalMesh);
+  
+  // nombre de vertex par cellules **cellToVertexNumber
+  setHexahedreCellToVertexNumber(&myPrimalMesh);
+  
+  // création du lien cellules vers vertex **cellToVertex 
+  setHexahedreCellToVertex(&myPrimalMesh);
+  
+  // lien vertex vers cellules
+  setHexahedreVertexToCellNumbers(&myPrimalMesh);
+  
+  setHexahedreVertexToCells(&myPrimalMesh);
+  
+  // cell to cells
+  setHexahedreCellToCells(&myPrimalMesh);
+  
+  setHexahedreCellToFacesOwnerNeighbour(&myPrimalMesh);
+  
+  setHexahedreFaceToCells(&myPrimalMesh);
+  
+  //  OLD
+  
+  setHexahedreSegments(&myPrimalMesh);
+  
+  setHexahedreVertexToSegments(&myPrimalMesh);
+  
+  setHexahedreSegmentToFaces(&myPrimalMesh);
+  
+  // centres
+  
+  setHexahedreSegmentsCentres(&myPrimalMesh);
+  
+  setHexahedreFaceCentersAreas(&myPrimalMesh);
+  
+  
+  setHexahedreVolumeCentroid(&myPrimalMesh);
+  
+  // DUAL MESH
+  setDualFaces(&myPrimalMesh,&myDualMesh);
+  
+  setDualFacesCentres(&myPrimalMesh, &myDualMesh);
+  
+  warning("VOIR TO DO FILE");
+  
+  fflush(stderr);
+  fflush(stdout);
+  
+  affiche("%-40s : %ld\n","Cell number",myPrimalMesh.cellNumber);
+  affiche("%-40s : %ld\n","Vertex number",myPrimalMesh.vertexNumber);
+  affiche("%-40s : %ld\n","Surface number",myPrimalMesh.faceNumber);
+  affiche("%-40s : %ld\n","Segment number",myPrimalMesh.segmentNumber);
+  affiche("%-40s : %ld\n","Dual Face number",myDualMesh.internalDualFacesNumber);
+  
+  freeMemory(&myPrimalMesh, &myDualMesh);
+  todo();
+  
+}
+
+
+
+
index 4f6279d..59ef227 100644 (file)
@@ -3,7 +3,7 @@
 include_directories (${MMD_SOURCE_DIR}/src)
 add_definitions("-DDEBUG")
 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -ggdb -DDEBUG")
-add_executable(test01.out test01.c)
+add_executable(test01.out test01.c ${DATA_FILE})
 #SET_TARGET_PROPERTIES(test01.out PROPERTIES COMPILE_FLAGS "-DDEBUG")
 target_link_libraries (test01.out
                        memory
@@ -13,3 +13,4 @@ target_link_libraries (test01.out
                        m
                        )