int main(void){ char name[80]; char failMsg[80]; int result = 0; int rc; int num_elem, num_node, conn_size; int num_elements, num_nodes; ESMC_Mesh mesh; int pdim=2; int sdim=3; int *nodeId; double *nodeCoord; int *nodeOwner; int *elemId; int *elemType; int *elemConn; int *nodeDistG; int *elemDistG; //---------------------------------------------------------------------------- ESMC_TestStart(__FILE__, __LINE__, 0); //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- //NEX_UTest_Multi_Proc_Only // Create a mesh strcpy(name, "MeshCreate"); strcpy(failMsg, "Did not return ESMF_SUCCESS"); mesh = ESMC_MeshCreate(&pdim,&sdim,&rc); ESMC_Test((rc==ESMF_SUCCESS), name, failMsg, &result, __FILE__, __LINE__, 0); //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- //NEX_UTest_Multi_Proc_Only // Read input files' header data strcpy(name, "MeshVTKHeader"); strcpy(failMsg, "Did not return ESMF_SUCCESS"); rc = ESMC_MeshVTKHeader("data/testmesh", &num_elem, &num_node, &conn_size); ESMC_Test((rc==ESMF_SUCCESS), name, failMsg, &result, __FILE__, __LINE__, 0); //---------------------------------------------------------------------------- // Allocate the arrays to describe Mesh nodeId = (int *) malloc (num_node * sizeof (int)); nodeCoord = (double *) malloc (3*num_node * sizeof (double)); nodeOwner = (int *) malloc (num_node * sizeof (int)); elemId = (int *) malloc (num_elem * sizeof (int)); elemType = (int *) malloc (num_elem * sizeof (int)); elemConn = (int *) malloc (conn_size * sizeof (int)); //---------------------------------------------------------------------------- //NEX_UTest_Multi_Proc_Only // Read input files strcpy(name, "MeshVTKBody"); strcpy(failMsg, "Did not return ESMF_SUCCESS"); rc = ESMC_MeshVTKBody("data/testmesh", nodeId, nodeCoord, nodeOwner, elemId, elemType, elemConn); ESMC_Test((rc==ESMF_SUCCESS), name, failMsg, &result, __FILE__, __LINE__, 0); //---------------------------------------------------------------------------- // VTKBody returns zero based elemConn, so make them 1 based for (int i = 0; i < conn_size; i++){ elemConn[i] = elemConn[i]+1; } //---------------------------------------------------------------------------- //NEX_UTest_Multi_Proc_Only // Add node information to the mesh strcpy(name, "MeshAddNodes"); strcpy(failMsg, "Did not return ESMF_SUCCESS"); rc = ESMC_MeshAddNodes(mesh, &num_node, nodeId, nodeCoord, nodeOwner); ESMC_Test((rc==ESMF_SUCCESS), name, failMsg, &result, __FILE__, __LINE__, 0); //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- //NEX_UTest_Multi_Proc_Only // Add element information to the mesh strcpy(name, "MeshAddElements"); strcpy(failMsg, "Did not return ESMF_SUCCESS"); rc = ESMC_MeshAddElements(mesh, &num_elem, elemId, elemType, elemConn); ESMC_Test((rc==ESMF_SUCCESS), name, failMsg, &result, __FILE__, __LINE__, 0); //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- //NEX_disabled_UTest_Multi_Proc_Only // Create DisGrids for the nodes and elements of the mesh //strcpy(name, "MeshCreateDistGrid"); //strcpy(failMsg, "Did not return ESMF_SUCCESS"); //rc = ESMC_MeshCreateDistGrids(mesh, nodeDistG, elemDistG, &num_node, //&num_elem); //ESMC_Test((rc==ESMF_SUCCESS), name, failMsg, &result, __FILE__, __LINE__, 0); //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- //NEX_UTest_Multi_Proc_Only // Write out the internal mesh data strcpy(name, "MeshWrite"); strcpy(failMsg, "Did not return ESMF_SUCCESS"); rc = ESMC_MeshWrite(mesh, "MeshOutput"); ESMC_Test((rc==ESMF_SUCCESS), name, failMsg, &result, __FILE__, __LINE__, 0); //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- //NEX_UTest_Multi_Proc_Only // Get the number of local nodes strcpy(name, "MeshGetNumNodes"); strcpy(failMsg, "Did not return ESMF_SUCCESS"); rc = ESMC_MeshGetNumNodes(mesh, &num_nodes); ESMC_Test((rc==ESMF_SUCCESS), name, failMsg, &result, __FILE__, __LINE__, 0); //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- //NEX_UTest_Multi_Proc_Only // Get the number of local elements strcpy(name, "MeshGetNumElements"); strcpy(failMsg, "Did not return ESMF_SUCCESS"); rc = ESMC_MeshGetNumElements(mesh, &num_elements); ESMC_Test((rc==ESMF_SUCCESS), name, failMsg, &result, __FILE__, __LINE__, 0); //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- //NEX_UTest_Multi_Proc_Only // Free internal mesh memory strcpy(name, "MeshFreeMemory"); strcpy(failMsg, "Did not return ESMF_SUCCESS"); rc = ESMC_MeshFreeMemory(mesh); ESMC_Test((rc==ESMF_SUCCESS), name, failMsg, &result, __FILE__, __LINE__, 0); //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- //NEX_UTest_Multi_Proc_Only // Destroy mesh object strcpy(name, "MeshDestroy"); strcpy(failMsg, "Did not return ESMF_SUCCESS"); rc = ESMC_MeshDestroy(&mesh); ESMC_Test((rc==ESMF_SUCCESS), name, failMsg, &result, __FILE__, __LINE__, 0); //---------------------------------------------------------------------------- // Free arrays used to create Mesh free(nodeId); free(nodeCoord); free(nodeOwner); free(elemId); free(elemType); free(elemConn); //---------------------------------------------------------------------------- ESMC_TestEnd(result, __FILE__, __LINE__, 0); //---------------------------------------------------------------------------- return 0; }
void myInitInC(ESMC_GridComp gcomp, ESMC_State importState, ESMC_State exportState, ESMC_Clock *clock, int *rc){ // Array variables ESMC_Array retrievedArray; double *ptr; int i, j, ij; // Mesh variables ESMC_Mesh mesh; int pdim=2; int sdim=3; int num_elem, num_node, conn_size; int *nodeId, *nodeOwner; double *nodeCoord; int *elemId, *elemType, *elemConn; // Field variables ESMC_Field field; ESMC_ArraySpec arrayspec; int *gridToFieldMap, *ungriddedLBound, *ungriddedUBound; ESMC_InterfaceInt i_gridToFieldMap, i_ungriddedLBound, i_ungriddedUBound; // initialize return code *rc = ESMF_SUCCESS; printf("In myInitInC()\n"); // get Array from import State *rc=ESMC_StateGetArray(importState, "array1", &retrievedArray); if (*rc!=ESMF_SUCCESS) return; // bail out // obtain access to Array data ptr = (double *)ESMC_ArrayGetPtr(retrievedArray, 0, rc); if (*rc!=ESMF_SUCCESS) return; // bail out // test accesibility of Array data via print printf("local ptr[0] = %g\n", ptr[0]); printf("local ptr[1] = %g\n", ptr[1]); // modify Array data for (j=0; j<2; j++){ for (i=0; i<5; i++){ // interpret as 2D array with contiguous, column-major storage ij= j*5 +i; ptr[ij] = j; } } // print a modified value printf("local ptr[0] = %g\n", ptr[0]); // Create a Mesh from VTK file mesh = ESMC_MeshCreate(&pdim, &sdim, rc); if (*rc!=ESMF_SUCCESS) return; // bail out // Read input files' header data *rc = ESMC_MeshVTKHeader("data/testmesh", &num_elem, &num_node, &conn_size); if (*rc!=ESMF_SUCCESS) return; // bail out // Allocate the arrays to describe Mesh nodeId = (int *) malloc (num_node * sizeof (int)); nodeCoord = (double *) malloc (3*num_node * sizeof (double)); nodeOwner = (int *) malloc (num_node * sizeof (int)); elemId = (int *) malloc (num_elem * sizeof (int)); elemType = (int *) malloc (num_elem * sizeof (int)); elemConn = (int *) malloc (conn_size * sizeof (int)); // Read input files *rc = ESMC_MeshVTKBody("data/testmesh", nodeId, nodeCoord, nodeOwner, elemId, elemType, elemConn); if (*rc!=ESMF_SUCCESS) return; // bail out // VTKBody returns zero based elemConn, so make them 1 based for (int i = 0; i < conn_size; i++){ elemConn[i] = elemConn[i]+1; } // Add node information to the mesh *rc = ESMC_MeshAddNodes(mesh, &num_node, nodeId, nodeCoord, nodeOwner); if (*rc!=ESMF_SUCCESS) return; // bail out // Add element information to the mesh *rc = ESMC_MeshAddElements(mesh, &num_elem, elemId, elemType, elemConn); if (*rc!=ESMF_SUCCESS) return; // bail out // garbage collection of temporary variables used to create Mesh object free(nodeId); free(nodeCoord); free(nodeOwner); free(elemId); free(elemType); free(elemConn); // Create a Field from Mesh // Setup arrayspec *rc = ESMC_ArraySpecSet(&arrayspec, 3, ESMC_TYPEKIND_I4); if (*rc!=ESMF_SUCCESS) return; // bail out // Setup gridToFieldMap gridToFieldMap = (int *)malloc(sizeof(int)); gridToFieldMap[0] = 1; i_gridToFieldMap = ESMC_InterfaceIntCreate(gridToFieldMap, 1, rc); if (*rc!=ESMF_SUCCESS) return; // bail out // Setup ungriddedLBound ungriddedLBound = (int *)malloc(2*sizeof(int)); ungriddedLBound[0] = 1; ungriddedLBound[1] = 1; i_ungriddedLBound = ESMC_InterfaceIntCreate(ungriddedLBound, 2, rc); if (*rc!=ESMF_SUCCESS) return; // bail out // Setup ungriddedUBound ungriddedUBound = (int *)malloc(2*sizeof(int)); ungriddedUBound[0] = 2; ungriddedUBound[1] = 3; i_ungriddedUBound = ESMC_InterfaceIntCreate(ungriddedUBound, 2, rc); if (*rc!=ESMF_SUCCESS) return; // bail out // Finally create Field field = ESMC_FieldCreate(mesh, arrayspec, i_gridToFieldMap, i_ungriddedLBound, i_ungriddedUBound, "Field from C", rc); if (*rc!=ESMF_SUCCESS) return; // bail out // Add Field to the export State *rc = ESMC_StateAddField(exportState, field); if (*rc!=ESMF_SUCCESS) return; // bail out // garbage collection of temporary variables used to create Field object *rc = ESMC_InterfaceIntDestroy(&i_gridToFieldMap); if (*rc!=ESMF_SUCCESS) return; // bail out free(gridToFieldMap); *rc = ESMC_InterfaceIntDestroy(&i_ungriddedLBound); if (*rc!=ESMF_SUCCESS) return; // bail out free(ungriddedLBound); *rc = ESMC_InterfaceIntDestroy(&i_ungriddedUBound); if (*rc!=ESMF_SUCCESS) return; // bail out free(ungriddedUBound); }