From cc266223e488ae339d8c3bcac660b64e7e93b488 Mon Sep 17 00:00:00 2001 From: Gerasimos Chourdakis Date: Tue, 4 Aug 2026 09:48:49 +0200 Subject: [PATCH 1/6] Fix segfaults and adapt the number of Gauss points per element type --- adapter/PreciceInterface.c | 26 +++++++++++++++----------- adapter/PreciceInterface.h | 6 +++--- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/adapter/PreciceInterface.c b/adapter/PreciceInterface.c index fd324ca..6a236cd 100644 --- a/adapter/PreciceInterface.c +++ b/adapter/PreciceInterface.c @@ -595,28 +595,31 @@ void PreciceInterface_ConfigureElementsMesh(PreciceInterface *interface, Simulat interface->elementIDs = malloc(interface->numElements * sizeof(ITG)); getElementsIDs(interface->elementSetID, sim->ialset, sim->istartset, sim->iendset, interface->elementIDs); - interface->numIPTotal = sim->mi[0] * interface->numElements; // Number of Gauss points per element * number of elements - interface->elemIPCoordinates = malloc(interface->numIPTotal * 3 * sizeof(double)); - - interface->elemIPID = malloc(interface->numIPTotal * sizeof(int)); - for (int j = 0; j < interface->numIPTotal; j++) { - interface->elemIPID[j] = j; - } - int numElements = interface->numElements; enum ElemType elemType = findSimulationMeshType(sim); // Gauss point extraction is supported only for tetrahedra and hexahedra elements. int nodesPerElement; + int numGaussPointsPerElement; if (elemType == TETRAHEDRA) { - nodesPerElement = 4; + nodesPerElement = 4; + numGaussPointsPerElement = 1; } else if (elemType == HEXAHEDRA) { - nodesPerElement = 8; + nodesPerElement = 8; + numGaussPointsPerElement = 8; } else { supportedElementError(); } + // Keep GP counts aligned with getelementgausspointcoords.f (tet:1, hex:8) + interface->numIPTotal = numGaussPointsPerElement * interface->numElements; + interface->elemIPCoordinates = malloc(interface->numIPTotal * 3 * sizeof(double)); + interface->elemIPID = malloc(interface->numIPTotal * sizeof(int)); + for (int j = 0; j < interface->numIPTotal; j++) { + interface->elemIPID[j] = j; + } + FORTRAN(getelementgausspointcoords, (&numElements, interface->elementIDs, &nodesPerElement, @@ -682,7 +685,8 @@ void PreciceInterface_ConfigureNodesMesh(PreciceInterface *interface, Simulation char *nodeSetName = toNodeSetName(interface->name); interface->nodeSetID = getSetID(nodeSetName, sim->set, sim->nset); interface->numNodes = getNumSetElements(interface->nodeSetID, sim->istartset, sim->iendset); - interface->nodeIDs = &sim->ialset[sim->istartset[interface->nodeSetID] - 1]; // Lucia: make a copy + interface->nodeIDs = malloc(interface->numNodes * sizeof(ITG)); + getElementsIDs(interface->nodeSetID, sim->ialset, sim->istartset, sim->iendset, interface->nodeIDs); free(nodeSetName); diff --git a/adapter/PreciceInterface.h b/adapter/PreciceInterface.h index b2aba46..b06cc64 100644 --- a/adapter/PreciceInterface.h +++ b/adapter/PreciceInterface.h @@ -27,7 +27,7 @@ typedef struct PreciceInterface { // Interface nodes int numNodes; - int * nodeIDs; + ITG * nodeIDs; Mapping2D3D *mappingQuasi2D3D; double * nodeCoordinates; int nodeSetID; @@ -36,13 +36,13 @@ typedef struct PreciceInterface { char * elementsMeshName; int numElements; - int * elementIDs; + ITG * elementIDs; int * elemIPID; int elementSetID; double *elemIPCoordinates; int numIPTotal; - int * faceIDs; + ITG * faceIDs; double *faceCenterCoordinates; int faceSetID; char * faceCentersMeshName; From 4377653f3da4de349fb89cc094b294294ae077dd Mon Sep 17 00:00:00 2001 From: Gerasimos Chourdakis Date: Tue, 4 Aug 2026 10:15:39 +0200 Subject: [PATCH 2/6] sim->mi[0] is just fine --- adapter/PreciceInterface.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/adapter/PreciceInterface.c b/adapter/PreciceInterface.c index 6a236cd..034d936 100644 --- a/adapter/PreciceInterface.c +++ b/adapter/PreciceInterface.c @@ -601,16 +601,14 @@ void PreciceInterface_ConfigureElementsMesh(PreciceInterface *interface, Simulat // Gauss point extraction is supported only for tetrahedra and hexahedra elements. int nodesPerElement; - int numGaussPointsPerElement; if (elemType == TETRAHEDRA) { - nodesPerElement = 4; - numGaussPointsPerElement = 1; + nodesPerElement = 4; } else if (elemType == HEXAHEDRA) { - nodesPerElement = 8; - numGaussPointsPerElement = 8; + nodesPerElement = 8; } else { supportedElementError(); } + int numGaussPointsPerElement = sim->mi[0]; // Keep GP counts aligned with getelementgausspointcoords.f (tet:1, hex:8) interface->numIPTotal = numGaussPointsPerElement * interface->numElements; From 658e116f9ae94e90b959a67a6921285f53d8713f Mon Sep 17 00:00:00 2001 From: Gerasimos Chourdakis Date: Tue, 4 Aug 2026 10:17:42 +0200 Subject: [PATCH 3/6] Remove unnecessary comment --- adapter/PreciceInterface.c | 1 - 1 file changed, 1 deletion(-) diff --git a/adapter/PreciceInterface.c b/adapter/PreciceInterface.c index 034d936..b8f1484 100644 --- a/adapter/PreciceInterface.c +++ b/adapter/PreciceInterface.c @@ -610,7 +610,6 @@ void PreciceInterface_ConfigureElementsMesh(PreciceInterface *interface, Simulat } int numGaussPointsPerElement = sim->mi[0]; - // Keep GP counts aligned with getelementgausspointcoords.f (tet:1, hex:8) interface->numIPTotal = numGaussPointsPerElement * interface->numElements; interface->elemIPCoordinates = malloc(interface->numIPTotal * 3 * sizeof(double)); interface->elemIPID = malloc(interface->numIPTotal * sizeof(int)); From 3a5de1a5af1cc8a24237689ca17865726ab253ff Mon Sep 17 00:00:00 2001 From: Gerasimos Chourdakis Date: Tue, 4 Aug 2026 10:21:23 +0200 Subject: [PATCH 4/6] ints are fine for now --- adapter/PreciceInterface.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/adapter/PreciceInterface.h b/adapter/PreciceInterface.h index b06cc64..b2aba46 100644 --- a/adapter/PreciceInterface.h +++ b/adapter/PreciceInterface.h @@ -27,7 +27,7 @@ typedef struct PreciceInterface { // Interface nodes int numNodes; - ITG * nodeIDs; + int * nodeIDs; Mapping2D3D *mappingQuasi2D3D; double * nodeCoordinates; int nodeSetID; @@ -36,13 +36,13 @@ typedef struct PreciceInterface { char * elementsMeshName; int numElements; - ITG * elementIDs; + int * elementIDs; int * elemIPID; int elementSetID; double *elemIPCoordinates; int numIPTotal; - ITG * faceIDs; + int * faceIDs; double *faceCenterCoordinates; int faceSetID; char * faceCentersMeshName; From dc13f90058cb761300a229e78b5cab4877427770 Mon Sep 17 00:00:00 2001 From: Gerasimos Chourdakis Date: Tue, 4 Aug 2026 10:23:04 +0200 Subject: [PATCH 5/6] Restore previous version --- adapter/PreciceInterface.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/adapter/PreciceInterface.c b/adapter/PreciceInterface.c index b8f1484..37e0577 100644 --- a/adapter/PreciceInterface.c +++ b/adapter/PreciceInterface.c @@ -595,6 +595,14 @@ void PreciceInterface_ConfigureElementsMesh(PreciceInterface *interface, Simulat interface->elementIDs = malloc(interface->numElements * sizeof(ITG)); getElementsIDs(interface->elementSetID, sim->ialset, sim->istartset, sim->iendset, interface->elementIDs); + interface->numIPTotal = sim->mi[0] * interface->numElements; // Number of Gauss points per element * number of elements + interface->elemIPCoordinates = malloc(interface->numIPTotal * 3 * sizeof(double)); + + interface->elemIPID = malloc(interface->numIPTotal * sizeof(int)); + for (int j = 0; j < interface->numIPTotal; j++) { + interface->elemIPID[j] = j; + } + int numElements = interface->numElements; enum ElemType elemType = findSimulationMeshType(sim); @@ -608,14 +616,6 @@ void PreciceInterface_ConfigureElementsMesh(PreciceInterface *interface, Simulat } else { supportedElementError(); } - int numGaussPointsPerElement = sim->mi[0]; - - interface->numIPTotal = numGaussPointsPerElement * interface->numElements; - interface->elemIPCoordinates = malloc(interface->numIPTotal * 3 * sizeof(double)); - interface->elemIPID = malloc(interface->numIPTotal * sizeof(int)); - for (int j = 0; j < interface->numIPTotal; j++) { - interface->elemIPID[j] = j; - } FORTRAN(getelementgausspointcoords, (&numElements, interface->elementIDs, From 2aafe43ddc82197140c3e0530249bab569ddd643 Mon Sep 17 00:00:00 2001 From: Gerasimos Chourdakis Date: Tue, 4 Aug 2026 10:33:50 +0200 Subject: [PATCH 6/6] Just remove the invalid free --- adapter/PreciceInterface.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/adapter/PreciceInterface.c b/adapter/PreciceInterface.c index 37e0577..cf1012e 100644 --- a/adapter/PreciceInterface.c +++ b/adapter/PreciceInterface.c @@ -682,8 +682,7 @@ void PreciceInterface_ConfigureNodesMesh(PreciceInterface *interface, Simulation char *nodeSetName = toNodeSetName(interface->name); interface->nodeSetID = getSetID(nodeSetName, sim->set, sim->nset); interface->numNodes = getNumSetElements(interface->nodeSetID, sim->istartset, sim->iendset); - interface->nodeIDs = malloc(interface->numNodes * sizeof(ITG)); - getElementsIDs(interface->nodeSetID, sim->ialset, sim->istartset, sim->iendset, interface->nodeIDs); + interface->nodeIDs = &sim->ialset[sim->istartset[interface->nodeSetID] - 1]; free(nodeSetName); @@ -870,7 +869,6 @@ void PreciceInterface_FreeData(PreciceInterface *preciceInterface) free(preciceInterface->elemIPID); free(preciceInterface->elemIPCoordinates); free(preciceInterface->faceIDs); - free(preciceInterface->nodeIDs); free(preciceInterface->preciceFaceCenterIDs); free(preciceInterface->faceCenterCoordinates); free(preciceInterface->nodeCoordinates);